Vol libre dans un champ d'étoiles
Publié : dim. 31/oct./2010 22:51
Bonjour à vous,
Je copie ce code ici afin qu'il puisse subir d'éventuelles mises à jour.
C'est donc un champ d'étoiles (présenté il y a un an en section Débutant).
Je me suis lancé là-dedans par besoin de représenter l'espace alors que je ne disposais plus de la librairie Ogre (elle plante sur ma configuration). De plus, quand cette librairie fonctionnait, ce type de rotation de caméra était impossible. Les choses évoluant (N3xt-D disposait de ce type de rotation), sûrement que ce type de rotation sera pris en compte un jour prochain.
(+) En attendant, les avantages de ce code c'est d'être simple dans la mise en oeuvre: copier-coller-exécuter.
(-) La perspective est suffisante mais arbitraire
(-) Les objets se répètent irrégulièrement quand on avance
Les touches d'utilisation sont les suivantes:
Je copie ce code ici afin qu'il puisse subir d'éventuelles mises à jour.
C'est donc un champ d'étoiles (présenté il y a un an en section Débutant).
Je me suis lancé là-dedans par besoin de représenter l'espace alors que je ne disposais plus de la librairie Ogre (elle plante sur ma configuration). De plus, quand cette librairie fonctionnait, ce type de rotation de caméra était impossible. Les choses évoluant (N3xt-D disposait de ce type de rotation), sûrement que ce type de rotation sera pris en compte un jour prochain.
(+) En attendant, les avantages de ce code c'est d'être simple dans la mise en oeuvre: copier-coller-exécuter.
(-) La perspective est suffisante mais arbitraire
(-) Les objets se répètent irrégulièrement quand on avance
Les touches d'utilisation sont les suivantes:
[Enter] = Accélérer
[BackSpace] = Décélérer
[Tab] = Rotation gauche
[A] = Rotation droite
[Flèche gauche] = Roulis vers la gauche
[Flèche droite] = Roulis vers la droite
[Flèche haut] = Plongeon en avant
[Flèche bas] = Plongeon en arrière
Code : Tout sélectionner
DisableDebugger
N = 3999
Global.F Dim X(N), Dim Y(N), Dim Z(N), Dim S(N), H, R, A
Macro Ro(CoA, CoB, CoC) ; Macro d'une procédure de rotation
Procedure R#CoA(i, Angle.F)
Protected.F X, Y, Z
X = X(i)
Y = Y(i)
Z = Z(i)
H = CoA
R = Sqr((CoB * CoB) + (CoC * CoC) )
A = ACos(CoC / R): If CoB < 0.0: A = 0.0 - A: EndIf
CoA#(i) = H
CoB#(i) = Sin(A + Angle) * R
CoC#(i) = Cos(A + Angle) * R
EndProcedure
EndMacro
Ro(x,y,z):Ro(y,z,x):Ro(z,x,y) ;3 procs pour les 3 rotations X, Y et Z
InitSprite()
InitSprite3D()
InitKeyboard()
InitMouse()
ExamineDesktops()
Dw = DesktopWidth(0)
Dh = DesktopHeight(0)
Dd = DesktopDepth(0)
Dhw = Dw / 2: Dhh = Dh / 2
OpenScreen(Dw, Dh, Dd, "")
KeyboardMode(#PB_Keyboard_International)
For I = 0 To N
S(I) = 0
X(I) = Random(1000000) / 10.0 - 50000.0
Y(I) = Random(1000000) / 10.0 - 50000.0
Z(I) = Random(1000000) / 10.0 - 50000.0
Next I
Zoom.F = 1.0
Size = 512
CreateImage(0, Size, Size, 32)
StartDrawing(ImageOutput(0) )
For I = 0 To (Size / 2)
G = I * 511 / Size
Circle(Size / 2, Size / 2, (Size - (I * 2) ) / 2, RGBA(G, G, G, 255) )
Next I
StopDrawing()
CreateSprite(0, Size, Size, #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(0) )
DrawAlphaImage(ImageID(0), 0, 0)
DrawingMode(#PB_2DDrawing_AlphaChannel)
DrawAlphaImage(ImageID(0), 0, 0)
StopDrawing()
CreateSprite3D(0, 0)
PitchCamera.F = 0.0: PitchCameraAccel.F = 0.001
TurnCamera.F = 0.0: TurnCameraAccel.F = 0.001
RollCamera.F = 0.0: RollCameraAccel.F = 0.001
CameraSpeed.F = 0.0: Size2 = Size / 2
Repeat
Delay(1)
ExamineKeyboard()
ExamineMouse()
ClearScreen(RGBA(0, 0, 0, 0) )
Start3D()
Sprite3DBlendingMode(5, 7)
If KeyboardPushed(#PB_Key_Left): RollCamera - RollCameraAccel: EndIf
If KeyboardPushed(#PB_Key_Right): RollCamera + RollCameraAccel: EndIf
If KeyboardPushed(#PB_Key_Down): PitchCamera + PitchCameraAccel: EndIf
If KeyboardPushed(#PB_Key_Up): PitchCamera - PitchCameraAccel: EndIf
If KeyboardPushed(#PB_Key_Tab): TurnCamera + TurnCameraAccel: EndIf
If KeyboardPushed(#PB_Key_A): TurnCamera - TurnCameraAccel: EndIf
If KeyboardPushed(#PB_Key_Back): CameraSpeed / 1.1: EndIf
If KeyboardPushed(#PB_Key_Return): CameraSpeed + 10.0: EndIf
For I = 0 To N
Z(I) - CameraSpeed: If Z(I) < - 50000.0: Z(I) + 100000.0: EndIf
Rx(I, PitchCamera)
Ry(I, TurnCamera)
Rz(I, RollCamera)
Coef.F = 400.0 / Z(i) * Zoom
If Z(i) > 0.0
DisplaySprite3D(S(i), 0, 0)
sx1 = Dhw + (X(i) - Size2) * Coef
sy1 = Dhh + (Y(i) - Size2) * Coef
sx2 = Dhw + (X(i) + Size2) * Coef
sy2 = Dhh + (Y(i) - Size2) * Coef
sx3 = Dhw + (X(i) + Size2) * Coef
sy3 = Dhh + (Y(i) + Size2) * Coef
sx4 = Dhw + (X(i) - Size2) * Coef
sy4 = Dhh + (Y(i) + Size2) * Coef
sz.F = Coef * 100
TransformSprite3D(S(I), sx1, sy1, sz, sx2, sy2, sz, sx3, sy3, sz, sx4, sy4, sz)
EndIf
Next I
PitchCamera * 0.99
TurnCamera * 0.99
RollCamera * 0.99
CameraSpeed * 0.999
Stop3D()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
CloseScreen()
End