Algo Black Hole Spiral

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Algo Black Hole Spiral

Message par Thyphoon »

Très jolie ! (a compiler avec Directx9) !
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Algo Black Hole Spiral

Message par flaith »

"Space: The final frontier
These are the voyages of the Starship, Enterprise
Its 5 year mission
To explore strange new worlds
To seek out new life and new civilizations
To boldly go where no man has gone before
"
:mrgreen:
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Algo Black Hole Spiral

Message par Thyphoon »

PS:(En passant le dernier film StartTreck est vraiment très bien)
J'en profite pour mettre ma dernière version du code a compilé avec Directx9

le seul truc qui est domage c'est qu'en fonction de la résolution de la fenêtre le rendu est assez différent ! or j'aurais aimé que si l'ecran en 320x200 ou en 1024x768 que le rendu soit similaire ... mais bon

N'oublier pas de récupérer les images dans les posts précedents !

Code : Tout sélectionner

UsePNGImageDecoder()
#dobro=1
#Police=1
#sprite=1
; ***********************************
InitSprite()
InitSprite3D()
InitKeyboard()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = 800:;=largeur de l'ecran
EcranY = 600:;=hauteur de l'ecran
    WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
    WindowID = WindowID(1)
    Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
   
   Structure Prefs
     ScreenWidth.l
     ScreenHeight.l
   EndStructure
   Global Prefs.prefs
   Prefs\ScreenWidth=EcranX
   Prefs\Screenheight=EcranY
     
   CompilerIf Subsystem("Directx9")
    Structure D3DTLVERTEX
     x.f
     y.f
     z.f
     rhw.f
     Color.l
     tu.f
     tv.f
   EndStructure

   Structure PB_Sprite3D
     TexRes.l                    ; TexRes
     Vertice.D3DTLVERTEX[4]       ; The 4 vertices for the rectangle sprite
     TmpVertice.D3DTLVERTEX[4]   ; The 4 vertices for the rectangle sprite
     Width.l                     ; width set with ZoomSprite3D()
     Height.l                     ; height set with ZoomSprite3D()
     RealWidth.l
     RealHeight.l
     Angle.f
     Transformed.l
   EndStructure
   
   
     CompilerElse ;Directx7
     
    ;Thanks Cpl.Bator !!!
    Structure vertex
          sx.f
          sy.f
          sz.f
          rhw.f
          Color.l
          specular.l
          tu.f
          tv.f
    EndStructure

    Structure PB_Sprite3D
             Texture.l         
             Vertice.vertex[4]
             Width.w
             Height.w
    EndStructure
CompilerEndIf


    Procedure SetSpriteLuminosityEx(spriteid.l,lum.c)
      Protected RGB_LUM.l,*S.PB_Sprite3D
      ;doit être dans un Start3D
      ; 255 = Pleine luminosité 0 = noir
      
      RGB_LUM = RGBA(255,Lum,255-(Lum/2),Lum)
      *S=IsSprite3D(spriteid)
      *S\Vertice[0]\Color = RGB_LUM
      *S\Vertice[1]\Color = RGB_LUM
      *S\Vertice[3]\Color = RGB_LUM
      *S\Vertice[2]\Color = RGB_LUM
    EndProcedure

    LoadSprite(20,"Gfx/holehand.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
    CreateSprite3D(20,20)
    LoadSprite(21,"Gfx/sun.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
    CreateSprite3D(21,21)
     LoadSprite(22,"Gfx/star.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
    CreateSprite3D(22,22)
Structure MyHole
  Rayon.l
  StarAngle.l
EndStructure

Global NewList MyHole.MyHole()

NbStar=40
For z=NbStar To 1 Step -1
  AddElement(MyHole())
  MyHole()\Rayon=Pow(z,1.3)*(Prefs\ScreenWidth/4)/(NbStar*2)
  MyHole()\StarAngle.l=Random(360)
Next


Procedure Spiral() 
  degres=-15
  Coef=7

  t.f=ElapsedMilliseconds()/10000
  CordX=Prefs\ScreenWidth/2
  CordY=Prefs\ScreenHeight/2
  AngleNova.f=degres*#PI/180
  
  BA.f=#PI
  BB.f=#PI/2
  BC.f=#PI+#PI/2
  
  ForEach MyHole()
    AngleStar.f=t+ListIndex(MyHole())/Coef
    x=MyHole()\Rayon*Cos(AngleStar)
    y=MyHole()\Rayon/2*Sin(AngleStar)
    x2=MyHole()\Rayon*Cos(BA+AngleStar)
    y2=MyHole()\Rayon/2*Sin(BA+AngleStar)
    x3=MyHole()\Rayon*Cos(BB+AngleStar)
    y3=MyHole()\Rayon/2*Sin(BB+AngleStar)
    x4=MyHole()\Rayon*Cos(BC+AngleStar)
    y4=MyHole()\Rayon/2*Sin(BC+AngleStar)
  
  ; ********* voici la formule de la rotation d'image *********
    ;<------------ en degres !!! :o)
    
     x= x * Cos (AngleNova) +( Y)* Sin (AngleNova)
     Y=x * Sin (AngleNova) + (Y)* Cos (AngleNova) 
               
     x2= x2 * Cos (AngleNova) +( y2)* Sin (AngleNova)
     y2= x2 * Sin (AngleNova) + (y2)* Cos (AngleNova) 
                 
     x3= x3 * Cos (AngleNova) +( y3)* Sin (AngleNova)
     y3= x3 * Sin (AngleNova) + (y3)* Cos (AngleNova) 
                 
     x4= x4 * Cos (AngleNova) +( Y4)* Sin (AngleNova)
     Y4= x4 * Sin (AngleNova) + (Y4)* Cos (AngleNova) 
                 
     ;***************************************************** 
  
    size=(ListSize(MyHole())-ListIndex(MyHole()))*128/ListSize(MyHole())
    Angle=(ListSize(MyHole())-ListIndex(MyHole()))*360/ListSize(MyHole())
    Alpha=255-((ListSize(MyHole())-ListIndex(MyHole()))*255/ListSize(MyHole()))
    
    ZoomSprite3D(20,size,size)
    ZoomSprite3D(22,size,size)
    RotateSprite3D(22,MyHole()\StarAngle,#PB_Absolute)
    RotateSprite3D(20,Angle,#PB_Absolute)
    SetSpriteLuminosityEx(20,Alpha)
    Sprite3DBlendingMode(5, 7)
    DisplaySprite3D(20,CordX+x-Size/2,CordY+y-Size/2,Alpha)
    DisplaySprite3D(22,CordX+x-Size/2,CordY+y-Size/2,Alpha)
    DisplaySprite3D(20,CordX+x2-Size/2,CordY+y2-Size/2,Alpha)
    DisplaySprite3D(22,CordX+x2-Size/2,CordY+y2-Size/2,Alpha)
    DisplaySprite3D(20,CordX+x3-Size/2,CordY+y3-Size/2,Alpha)
    DisplaySprite3D(22,CordX+x3-Size/2,CordY+y3-Size/2,Alpha)
    DisplaySprite3D(20,CordX+x4-Size/2,CordY+y4-Size/2,Alpha)
    DisplaySprite3D(22,CordX+x4-Size/2,CordY+y4-Size/2,Alpha)
  Next
  ZoomSprite3D(21,32,32)
  DisplaySprite3D(21,CordX-16,CordY-16,200)
  
EndProcedure

    Repeat
        ExamineKeyboard()
        Event=WindowEvent()
        Delay(1)
        ClearScreen(RGB(0,0,0)) ;  *****<------- si tu Rem ceci le sprite laisse une trace :D
        Start3D()
        Spiral()
        Stop3D()
        FlipBuffers():; affiche l'ecran
     

        Event=WindowEvent()
         If KeyboardPushed(#PB_Key_Escape)
            End
        EndIf
       
        If KeyboardReleased(#PB_Key_Down) And degres>-45
          degres=degres-1
        EndIf
       
        If KeyboardReleased(#PB_Key_Up) And degres<50
          degres=degres+1
        EndIf
       
    Until Event=#PB_Event_CloseWindow
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Algo Black Hole Spiral

Message par Progi1984 »

Et le tit screen pour les linuxiens :lol: ?
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: Algo Black Hole Spiral

Message par cederavic »

La voila :
Image
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Algo Black Hole Spiral

Message par Ar-S »

Bravo les gars, thyphoon ta dernière est très jolie
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Algo Black Hole Spiral

Message par Thyphoon »

Ar-S a écrit :Bravo les gars, thyphoon ta dernière est très jolie
Merci ! Le travail collaboratif du forum fait des merveilles ! :P
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Algo Black Hole Spiral

Message par Progi1984 »

Sublime comme d'habitude !
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: Algo Black Hole Spiral

Message par cederavic »

En bidouillant un peut on peut arriver a des trucs sympa :
Image

Code : Tout sélectionner

; 3D-Stars (V. Schmid)

Structure Stars
  x3.f
  y3.f
  z3.f
  
  x2.f
  y2.f
  
  range.f
  Spr.l
  
  Type.b
  Size.l
EndStructure

MAX_STARS.l = 2500

;Dim Stars.Stars(4, MAX_STARS)   
NewList Stars.Stars()
Dim Proj.l(3)        
Dim Camera.f(3)   
;

Global Counter.f


InitSprite()
InitSprite3D()
InitKeyboard()
InitMouse()

Procedure.b ColorSprite3D(Sprite3D.l, Color1.l, Alpha1.b = 255, Color2.l = -1, Alpha2.b = -1, Color3.l = -1, Alpha3.b = -1, Color4.l = -1, Alpha4.b = -1)

*Spr3D = IsSprite3D(Sprite3D)
  If *Spr3D = 0
    ProcedureReturn 0
  EndIf
  
  If Color2 = -1 : Color2 = Color1 : EndIf
  If Color3 = -1 : Color3 = Color1 : EndIf
  If Color4 = -1 : Color4 = Color1 : EndIf
  If Alpha2 = -1 : Alpha2 = Alpha1 : EndIf
  If Alpha4 = -1 : Alpha3 = Alpha1 : EndIf
  If Alpha3 = -1 : Alpha4 = Alpha1 : EndIf
  B1 = Red(Color1) : G1 = Green(Color1) : R1 = Blue(Color1) : A1 = Alpha1
  B2 = Red(Color2) : G2 = Green(Color2) : R2 = Blue(Color2) : A2 = Alpha2
  B3 = Red(Color3) : G3 = Green(Color3) : R3 = Blue(Color3) : A3 = Alpha3
  B4 = Red(Color4) : G4 = Green(Color4) : R4 = Blue(Color4) : A4 = Alpha4
  

  
  ; Merci Ombres du forum FR
  PokeB(*Spr3D + 20,  R1)   ;Couleur jaune vertex 1
  PokeB(*Spr3D + 21,  G1)   ;Couleur rose vertex 1
  PokeB(*Spr3D + 22,  B1)   ;Couleur cyan vertex 1
  PokeB(*Spr3D + 23,  A1)   ;Couleur alpha vertex 1
  PokeB(*Spr3D + 52,  R2)   ;Couleur jaune vertex 2
  PokeB(*Spr3D + 53,  G2)   ;Couleur rose vertex 2
  PokeB(*Spr3D + 54,  B2)   ;Couleur cyan vertex 2
  PokeB(*Spr3D + 55,  A2)   ;Couleur alpha vertex 2
  PokeB(*Spr3D + 84,  R3)   ;Couleur jaune vertex 3
  PokeB(*Spr3D + 85,  G3)   ;Couleur rose vertex 3
  PokeB(*Spr3D + 86,  B3)   ;Couleur cyan vertex 3
  PokeB(*Spr3D + 87,  A3)   ;Couleur alpha vertex 3
  PokeB(*Spr3D + 116, R4)   ;Couleur jaune vertex 4
  PokeB(*Spr3D + 117, G4)   ;Couleur rose vertex 4
  PokeB(*Spr3D + 118, B4)   ;Couleur cyan vertex 4
  PokeB(*Spr3D + 119, A4)   ;Couleur alpha vertex 4

  ProcedureReturn 1

EndProcedure


Procedure.f curveValue(actuelle.f, Cible.f, P.f)
  If P > 1000.0
    P = 1000.0
  EndIf
  ProcedureReturn (actuelle + ( (Cible - actuelle) * P / 1000.0))
EndProcedure

Camera(1) = 0    ; X
Camera(2) = -600    ; Y
Camera(3) = 3000 ; Z
ZEbene.l = 240

BewegeX.b = 0
BewegeY.b = 0
BewegeZ.b = 10

sWidth = GetSystemMetrics_(#SM_CXSCREEN)
sHeight = GetSystemMetrics_(#SM_CYSCREEN)
hWnd = OpenWindow(1, 0, 0, sWidth, sHeight, "Galaxy", #PB_Window_BorderLess | #PB_Window_ScreenCentered )
  OpenWindowedScreen(hWnd,0,0, sWidth, sHeight, 1, 0, 0)
  
  
  xOffset.l = sWidth / 2
  yOffset.l = sHeight / 2 + sHeight / 8
  
  
  Size = 32
  ; Blanc
    CreateSprite(0, Size * 2, Size * 2, #PB_Sprite_Texture)
    StartDrawing(SpriteOutput(0))
      For t = 1 To Size
        c.f = (255 / Size * t)
        Circle(Size, Size, Size - t, RGB(c, c, c))
      Next
    StopDrawing()
    CreateSprite3D(0, 0)
    
    ; Jaune
    CreateSprite(1, Size * 2, Size * 2, #PB_Sprite_Texture)
    StartDrawing(SpriteOutput(1))
      For t = 1 To Size
        c.f = (255 / Size * t)
        Circle(Size, Size, Size - t, RGB(c, c, 0))
      Next
    StopDrawing()
    CreateSprite3D(1, 1)
    
    ; Rouge
    CreateSprite(2, Size * 2, Size * 2, #PB_Sprite_Texture)
    StartDrawing(SpriteOutput(2))
      For t = 1 To Size
        c.f = (255 / Size * t)
        Circle(Size, Size, Size - t, RGB(c, 0, 0))
      Next
    StopDrawing()
    CreateSprite3D(2, 2)
    
    ; Orange
    CreateSprite(3, Size * 2, Size * 2, #PB_Sprite_Texture)
    StartDrawing(SpriteOutput(3))
      For t = 1 To Size
        c.f = (255 / Size * t)
        Circle(Size, Size, Size - t, RGB(c, c/2, 0))
      Next
    StopDrawing()
    CreateSprite3D(3, 3)
    
    ; Bleu
    CreateSprite(4, Size * 2, Size * 2, #PB_Sprite_Texture)
    StartDrawing(SpriteOutput(4))
      For t = 1 To Size
        c.f = (255 / Size * t)
        Circle(Size, Size, Size - t, RGB(0, 0, c))
      Next
    StopDrawing()
    CreateSprite3D(4, 4)
    
    ; Violet
    CreateSprite(5, Size * 2, Size * 2, #PB_Sprite_Texture)
    StartDrawing(SpriteOutput(5))
      For t = 1 To Size
        c.f = (255 / Size * t)
        Circle(Size, Size, Size - t, RGB(c, 0, c))
      Next
    StopDrawing()
    CreateSprite3D(5, 5)
    
  
  
  
  MaxRange.f = 0
  MaxStars = 0
  
  Angle.f = 0
  
  tMax = 3
  
  For t = 0 To tMax
    
    Angle = t * ( (2 * #PI) / tMax)
    Anglei.f = 0.0
    Angleb.f = 0.0
  While Anglei.f < #PI * 3

    Anglei.f + 0.018
    Angleb = Anglei + Angle
    
    RangeX.f = Pow(Anglei,1.3) * 5
    RangeY.f = Pow(Anglei,1.3) * 5
      
    AddElement(Stars())  
    Stars()\x3 = Cos(Angleb) * RangeX*anglei
    Stars()\z3 = Sin(Angleb) * RangeY*anglei
    Stars()\y3 = Random(100) - 50
    Stars()\Range = Sqr(Stars()\x3 * Stars()\x3 + Stars()\z3 * Stars()\z3 + Stars()\y3 * Stars()\y3)
    Stars()\x3 = Cos(Angleb) * RangeX*anglei + (Stars()\Range / 1000 * (Random(100) - 50))
    Stars()\z3 = Sin(Angleb) * RangeY*anglei + (Stars()\Range / 1000 * (Random(100) - 50))
    Stars()\y3 = 0
    Stars()\Range = Sqr(Stars()\x3 * Stars()\x3 + Stars()\z3 * Stars()\z3 + Stars()\y3 * Stars()\y3)
    
    If Stars()\Range > MaxRange : MaxRange = Stars()\Range : EndIf
    MaxStars + 1
    
    Spr = Random(Int(Stars()\Range / 100))
    If Spr < 0 : Spr = 0 : EndIf
    If Spr > 5 : Spr = 5 : EndIf
    Stars()\Spr = 0;Spr
    Stars()\Type = 1
    
      x.f = Stars()\x3
      y.f = Stars()\z3
      z.f = Stars()\y3
      rd = Random(Angle / 100)

      For tb = 0 To rd
        AddElement(Stars())  
          Stars()\x3 = x + Random(100) - 50
          Stars()\z3 = y + Random(100) - 50
          Stars()\y3 = z + Random(100) - 50
          Stars()\Range = Sqr(Stars()\x3 * Stars()\x3 + Stars()\z3 * Stars()\z3 + Stars()\y3 * Stars()\y3)
          Stars()\Spr = Random(5)
          Stars()\Type = 3
          Stars()\Size = Random(24) -8
          If Stars()\Range > MaxRange : MaxRange = Stars()\Range : EndIf
          
          MaxStars + 1
      Next

  Wend
  
  Next
  
  MaxStars + 100
  
  For t = 0 To 100
  
    AddElement(Stars())  
    Stars()\x3 = Random(120) - 60
    Stars()\z3 = Random(120) - 60
    Stars()\y3 = Random(120) - 60
    Stars()\Range = Sqr(Stars()\x3 * Stars()\x3 + Stars()\z3 * Stars()\z3 + Stars()\y3 * Stars()\y3)
    If Stars()\Range > 60
      Stars()\Spr = 1
      Stars()\Type = 2
    Else
      Stars()\Spr = 0
      Stars()\Type = 2
    EndIf
    
  
  Next
  
  MaxStars + 500
  
  For t = 0 To 500
  
    AddElement(Stars())  
    Stars()\x3 = Random(4000) - 2000
    Stars()\z3 = Random(4000) - 2000
    Stars()\y3 = Random(4000) - 2000
    Stars()\Range = Sqr(Stars()\x3 * Stars()\x3 + Stars()\z3 * Stars()\z3 + Stars()\y3 * Stars()\y3)
    Stars()\Spr = 0
    Stars()\Type = 4
    
  
  Next

  Repeat
    
    ClearScreen(RGB(0,0,0))

    ForEach Stars()
        Proj(1) = Camera(1) - Stars()\x3
        Proj(2) = Camera(2) - Stars()\y3
        Proj(3) = Camera(3) - Stars()\z3

        Lambda.f = (ZEbene - Stars()\z3) / Proj(3)
        
        Stars()\x2 = xOffset + Stars()\x3 + Lambda * Proj(1) ; X
        Stars()\y2 = yOffset + Stars()\y3 + Lambda * Proj(2) ; Y
    Next

    
    Start3D()
    
    C1.l = #White
    C2.l = RGB(64, 32, 255)
    
    Ra.f=Red(#White)   : Rb.f=Red(C2)
    Ga.f=Green(#White) : Gb.f=Green(C2)
    Ba.f=Blue(#White)  : Bb.f=Blue(C2)

              
     ;i = 0
    ForEach Stars()

          pX2 = Stars()\x2
          pY2 = Stars()\y2
          
          
          If Stars()\Type = 1
            Sprite3DBlendingMode(5, 7)
            If Stars()\z3 < 0
              Zoom.f = (Stars()\Range / 250 * 64)
            Else
              Zoom.f = (Stars()\Range / 250 * 64) + (Stars()\z3 / 2000 * 64) 
            EndIf
            
            Alpha.f = (1 - Stars()\Range / MaxRange) * 255
  
  
          	Red.f = (((1 - Stars()\Range / MaxRange) * Ra) + (Stars()\Range / MaxRange * Rb)) / 4
          	Green.f = (((1 - Stars()\Range / MaxRange) * Ga) + (Stars()\Range / MaxRange * Gb)) / 4
          	Blue.f = (((1 - Stars()\Range / MaxRange) * Ba) + (Stars()\Range / MaxRange * Bb)) / 4
            
          	Color.l = RGB(Red,Green,Blue)
          	ColorSprite3D(Stars()\Spr, Color, Alpha)

            ZoomSprite3D(Stars()\Spr, Zoom, Zoom)
            DisplaySprite3D(Stars()\Spr, pX2 - Zoom / 2, pY2 - Zoom / 2, Alpha)
          ElseIf Stars()\Type = 2
            Sprite3DBlendingMode(2, 4)
            Zoom.f = 128
            ColorSprite3D(Stars()\Spr, #White)
            
            ZoomSprite3D(Stars()\Spr, Zoom, Zoom)
            DisplaySprite3D(Stars()\Spr, pX2 - Zoom / 2, pY2 - Zoom / 2, 128)
          ElseIf Stars()\Type = 3
            Sprite3DBlendingMode(5, 7)
            Zoom.f = Stars()\Size
            Alpha.f = (1 - Stars()\Range / MaxRange) * 255
            ZoomSprite3D(Stars()\Spr, Zoom, Zoom)
            DisplaySprite3D(Stars()\Spr, pX2 - Zoom / 2, pY2 - Zoom / 2, Alpha)
            
            ZoomSprite3D(0, Zoom * 2, Zoom * 2)
            DisplaySprite3D(0, pX2 - Zoom, pY2 - Zoom, Alpha)
            ZoomSprite3D(0, Zoom * 2, Zoom * 2)
            DisplaySprite3D(0, pX2 - Zoom, pY2 - Zoom, Alpha)
            ZoomSprite3D(0, Zoom * 2, Zoom * 2)
            DisplaySprite3D(0, pX2 - Zoom, pY2 - Zoom, Alpha)
          Else 
            Sprite3DBlendingMode(2, 4)
            Zoom.f = Stars()\z3 / 2000 * 8
            ColorSprite3D(Stars()\Spr, #White)
            
            ZoomSprite3D(Stars()\Spr, Zoom, Zoom)
            DisplaySprite3D(Stars()\Spr, pX2 - Zoom / 2, pY2 - Zoom / 2, 128)
          EndIf
      
    Next

    

    ExamineKeyboard()
    ExamineMouse()
;     
    If KeyboardPushed(#PB_Key_Up); Or MouseDeltaY() < -0.5
      BewegeY = 10
      Camera(2) = curveValue(Camera(2), 1600, 20)
    ElseIf KeyboardPushed(#PB_Key_Down); Or MouseDeltaY() > 0.5
      BewegeY = -10
      Camera(2) = curveValue(Camera(2), -1600, 20)
    Else
      ;Camera(2) = curveValue(Camera(2), 0, 50)
      ;BewegeY = 0
    EndIf
    
    
    If KeyboardPushed(#PB_Key_Right); Or MouseDeltaX() > 0.5
      BewegeX = 10
      Camera(1) = curveValue(Camera(1), -1600, 20)
    ElseIf KeyboardPushed(#PB_Key_Left); Or MouseDeltaX() < -0.5
      BewegeX = -10
      Camera(1) = curveValue(Camera(1), 1600, 20)
    Else
      ;Camera(1) = curveValue(Camera(1), 0, 20)
      ;BewegeX = 0
    EndIf

Counter + 0 . 02
If Counter > 2 * #PI : Counter = 0 : EndIf

      ;Camera(1) = Camera(1) + Sin(Counter.f)*10
      ;Camera(2) = Camera(2) + Cos(Counter.f)*10
      ;Camera(3) = Camera(3) + Sin(Counter.f)*10

  
  FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape) Or WindowEvent() = #WM_CLOSE
End
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Algo Black Hole Spiral

Message par Thyphoon »

Une petite version optimisé pour PB4.40Beta7 or >! sur ma machine qui a un Atom a 1,6Ghz je pas de 30 im/sec a 60 !! :o)

Les 2 images dont vous avez besoin
Image1 (sun.png):Image
Image2 (fullhand.png):Image

Code : Tout sélectionner

UsePNGImageDecoder()
#dobro=1
#Police=1
#sprite=1
; ***********************************
InitSprite()
InitSprite3D()
InitKeyboard()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = 800
EcranY = 600
    WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
    WindowID = WindowID(1)
    Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
   
   Structure Prefs
     ScreenWidth.l
     ScreenHeight.l
   EndStructure
   Global Prefs.prefs
   Prefs\ScreenWidth=EcranX
   Prefs\Screenheight=EcranY
     
CompilerIf Subsystem("Directx7") 
 ;Thanks Cpl.Bator !!!
    Structure vertex
          sx.f
          sy.f
          sz.f
          rhw.f
          Color.l
          specular.l
          tu.f
          tv.f
    EndStructure

    Structure PB_Sprite3D
             Texture.l         
             Vertice.vertex[4]
             Width.w
             Height.w
    EndStructure 
   
   
     CompilerElse ;Directx7
         Structure D3DTLVERTEX
     x.f
     y.f
     z.f
     rhw.f
     Color.l
     tu.f
     tv.f
   EndStructure

   Structure PB_Sprite3D
     TexRes.l                    ; TexRes
     Vertice.D3DTLVERTEX[4]       ; The 4 vertices for the rectangle sprite
     TmpVertice.D3DTLVERTEX[4]   ; The 4 vertices for the rectangle sprite
     Width.l                     ; width set with ZoomSprite3D()
     Height.l                     ; height set with ZoomSprite3D()
     RealWidth.l
     RealHeight.l
     Angle.f
     Transformed.l
   EndStructure 
   
CompilerEndIf

    Procedure SetSpriteLuminosityEx(spriteid.l,lum.c)
      Protected RGB_LUM.l,*S.PB_Sprite3D
      ;doit être dans un Start3D
      ; 255 = Pleine luminosité 0 = noir
      
      RGB_LUM = RGBA(255,Lum,Lum,Lum);RGBA(255,Lum,255-(Lum/2),Lum)
      *S=IsSprite3D(spriteid)
      *S\Vertice[0]\Color = RGB_LUM
      *S\Vertice[1]\Color = RGB_LUM
      *S\Vertice[3]\Color = RGB_LUM
      *S\Vertice[2]\Color = RGB_LUM
    EndProcedure

#Spr_HoleHand=0
#Spr_HoleSun=1

    LoadSprite(#Spr_HoleHand,"Gfx/fullhand.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
    CreateSprite3D(#Spr_HoleHand,#Spr_HoleHand)
    LoadSprite(#Spr_HoleSun,"Gfx/sun.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
    CreateSprite3D(#Spr_HoleSun,#Spr_HoleSun)

Structure MyHole
  Rayon.l
  StarAngle.l
  Size.l
  Angle.l
  Alpha.l
EndStructure

Global NewList MyHole.MyHole()

NbStar=38 ;Normalement 40
For z=NbStar To 1 Step -1
  AddElement(MyHole())
  MyHole()\Rayon=Pow(z,1.3)*(Prefs\ScreenWidth/4)/(NbStar*2)
  MyHole()\StarAngle.l=Random(360)
  MyHole()\Size=(NbStar-ListIndex(MyHole()))*128/NbStar
  MyHole()\Angle=(NbStar-ListIndex(MyHole()))*360/NbStar
  MyHole()\Alpha=255-((NbStar-ListIndex(MyHole()))*255/NbStar)
Next

Structure MyHolePrefs
  CordX.l
  CordY.l
  AngleNova.f
  CosAngleNova.f
  SinAngleNova.f
  Coef.l
EndStructure
Global MyHolePrefs.MyHolePrefs

MyHolePrefs\Coef=7
MyHolePrefs\CordX=Prefs\ScreenWidth/2
MyHolePrefs\CordY=Prefs\ScreenHeight/2
;Quelques Précalcule
MyHolePrefs\AngleNova=-15*#PI/180 ;POur un Angle de 15°
MyHolePrefs\CosAngleNova=Cos (MyHolePrefs\AngleNova)
MyHolePrefs\SinAngleNova=Sin (MyHolePrefs\AngleNova)
#BA=#PI
#BB=#PI/2
#BC=#PI+#PI/2

Procedure Spiral() 
  t.f=ElapsedMilliseconds()/10000
  Sprite3DBlendingMode(5, 7)
  ForEach MyHole()
    AngleStar.f=t+ListIndex(MyHole())/MyHolePrefs\Coef
    Halfrayon=MyHole()\Rayon/2
    x=MyHole()\Rayon*Cos(AngleStar)
    y=Halfrayon*Sin(AngleStar)
    x2=MyHole()\Rayon*Cos(#BA+AngleStar)
    y2=Halfrayon*Sin(#BA+AngleStar)
    x3=MyHole()\Rayon*Cos(#BB+AngleStar)
    y3=Halfrayon*Sin(#BB+AngleStar)
    x4=MyHole()\Rayon*Cos(#BC+AngleStar)
    y4=Halfrayon*Sin(#BC+AngleStar)
 
  ; ********* voici la formule de la rotation d'image *********
    ;<------------ en degres !!! :o)
   
     x= x * MyHolePrefs\CosAngleNova +( Y)* MyHolePrefs\SinAngleNova
     y=x * MyHolePrefs\SinAngleNova + (Y)* MyHolePrefs\CosAngleNova
               
     x2= x2 * MyHolePrefs\CosAngleNova +( y2)* MyHolePrefs\SinAngleNova
     y2= x2 * MyHolePrefs\SinAngleNova + (y2)* MyHolePrefs\CosAngleNova
                 
     x3= x3 * MyHolePrefs\CosAngleNova +( y3)* MyHolePrefs\SinAngleNova
     y3= x3 * MyHolePrefs\SinAngleNova + (y3)* MyHolePrefs\CosAngleNova
                 
     x4= x4 * MyHolePrefs\CosAngleNova +( Y4)* MyHolePrefs\SinAngleNova
     Y4= x4 * MyHolePrefs\SinAngleNova + (Y4)* MyHolePrefs\CosAngleNova 
                 
     ;***************************************************** 
    ZoomSprite3D(#Spr_HoleHand,MyHole()\Size,MyHole()\Size)
    RotateSprite3D(#Spr_HoleHand,MyHole()\StarAngle,#PB_Absolute)

    SetSpriteLuminosityEx(#Spr_HoleHand,MyHole()\Alpha)
    NewSize=MyHole()\Size/2
      NewCordX=MyHolePrefs\CordX+x:NewCordY=MyHolePrefs\CordY+y
    DisplaySprite3D(#Spr_HoleHand,NewCordX-NewSize,NewCordY-NewSize,MyHole()\Alpha)
      NewCordX=MyHolePrefs\CordX+x2:NewCordY=MyHolePrefs\CordY+y2
    DisplaySprite3D(#Spr_HoleHand,NewCordX-NewSize,NewCordY-NewSize,MyHole()\Alpha)

        NewCordX=MyHolePrefs\CordX+x2:NewCordY=MyHolePrefs\CordY+y2
    DisplaySprite3D(#Spr_HoleHand,NewCordX-NewSize,NewCordY-NewSize,MyHole()\Alpha)

        NewCordX=MyHolePrefs\CordX+x3:NewCordY=MyHolePrefs\CordY+y3
    DisplaySprite3D(#Spr_HoleHand,NewCordX-NewSize,NewCordY-NewSize,MyHole()\Alpha)

        NewCordX=MyHolePrefs\CordX+x4:NewCordY=MyHolePrefs\CordY+y4
    DisplaySprite3D(#Spr_HoleHand,NewCordX-NewSize,NewCordY-NewSize,MyHole()\Alpha)

  Next
  ZoomSprite3D(#Spr_HoleSun,32,32)
  DisplaySprite3D(#Spr_HoleSun,MyHolePrefs\CordX-16,MyHolePrefs\CordY-16,200)
EndProcedure
    Repeat
        ExamineKeyboard()
        Event=WindowEvent()
        Delay(1)
        ClearScreen(RGB(0,0,0)) ;  *****<------- si tu Rem ceci le sprite laisse une trace :D
        Start3D()
        Spiral()
        Stop3D()
        
        
     ;#####
    ;-FPS
    ;#####
    If Second<ElapsedMilliseconds()
      Second = ElapsedMilliseconds() + 1000
      fps = Frame_Counter
      Frame_Counter = 0
    Else
      Frame_Counter + 1
    EndIf
   StartDrawing(ScreenOutput())    

    DrawText(5, 5, "FPS : " + Str(fps),$ffffff)
    ;
  StopDrawing()
        
        
        FlipBuffers():; affiche l'ecran
     

        Event=WindowEvent()
         If KeyboardPushed(#PB_Key_Escape)
            End
        EndIf
       
               
    Until Event=#PB_Event_CloseWindow
Répondre