Page 3 sur 3

Re: Vol libre dans un champ d'étoiles

Publié : mar. 16/nov./2010 14:55
par Ollivier
Bon, pour l'instant je n'ai pas plus d'info sur la nouvelle manière dont les Dim se comportent donc j'adopte, au moins temporairement la méthode de Comtois, mais je ne la comprends pas très bien car le redimensionnement devient alors chose impossible.

Sinon dans le code du post 1 de ce sujet, vue que la perspective se trouve en une seule ligne (Ligne n° 76), et que je persiste à dire qu'il y a une multitude de méthodes de perspectives puisque, je me cite, la perspective est une illusion, ben j'en mets une autre au pif: la perspective Oeil du Judas par exemple. Comme ça, dans Colle Off d'outil, le soldat peut anticiper un tir à travers une porte de HLM. M'enfin moi, la guerre, ce n'est pas mon trip...

J'ai rajouté aussi le réglage du zoom (2 lignes de +) avec les touches O et P pour bien faire voir le truc. Sinon, n'oubliez pas: il y a TROIS rotations! Comme le titre l'indique, c'est un vol vraiment libre, qui ne rame pas, et qui ne plante pas avec une IMA par ci ou par là...

Vous pouvez comparer par rapport au premier code: pas vraiment de modification. Donc pas vraiment beaucoup de boulot de fait, je suis désolé, voilà.

Et... Viva el PorBAJICOS compilatores !

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
        If KeyboardPushed(#PB_Key_O): Zoom * 1.01: EndIf
        If KeyboardPushed(#PB_Key_P): Zoom / 1.01: 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)
            If Z(i) > 0.0
                Coef.F = 400.0 / Sqr(X(i) * X(i) + Y(i) * Y(i) + Z(i) * Z(i) ) * Zoom
                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

Re: Vol libre dans un champ d'étoiles

Publié : mar. 16/nov./2010 19:34
par venom
Sympa ce code Ollivier,

j'aime bien bravo.






@++

Re: Vol libre dans un champ d'étoiles

Publié : mar. 16/nov./2010 20:39
par G-Rom
qui ne rame pas, et qui ne plante pas avec une IMA par ci ou par là...
Excuse moi d'être mauvais...

Re: Vol libre dans un champ d'étoiles

Publié : mar. 16/nov./2010 23:55
par Ollivier
G-Rom a écrit :Excuse moi
Je me permets d'enlever le superflu et j'accepte tes excuses.

Pour moi, je considère que tu n'avais pas à payer quoique ce soit pour t'épargner de me présenter simplement tes excuses. Pour les miens qui sont extrêmement nombreux, présenter ses excuses n'a pas de prix. C'est-à-dire que présenter ses excuses vaut tout l'or du Monde, le même or que la France a payé à des entreprises d'armement outre-atlantique pour que le débarquement puisse avoir lieu quelques mois plus tard. En effet, quand on respecte ce qui n'a pas de prix, l'argent se met soudain à avoir une odeur. On refuse alors une vente au plus offrant par exemple, même si c'est bien plus que celui à qui l'on décide de vendre son bien.

Si des sujets sur ce forum semblent altérer l'image que tu souhaites véhiculer, des sujets dont j'en suis l'auteur, ce texte y compris, je coopérerai pour bien les nettoyer à ta guise. Car, évidemment cette coopération, elle non plus n'a pas de prix.

Comme je l'ai écrit il y a déjà plus d'un an ici,
« Qui que tu sois, tu as mon respect. Point! Et Cette notion est carré! Après, si à n'importe quelle échelle de temps, de lieu ou d'importance, tu ne fais pas idem, je n'y pourrai rien. »