Page 1 sur 1

sprite3D en rotation autour d'un autre sprite3D

Publié : dim. 22/juil./2007 2:16
par beauregard
J'ai un peu honte, mais voilà, je n'arrive pas à faire effectuer une rotation correcte d'un sprite3D, autour d'un autre sprite3D, qui est lui dirigé à l'aide de la souris:

Code : Tout sélectionner

; ------------------------------------------------------------
; rotation à base de cosinus et sinus
; ------------------------------------------------------------

UsePNGImageDecoder () ; 

If InitMouse ()=0 Or InitSprite ()=0 Or InitKeyboard ()=0 Or InitSprite3D ()=0 
     MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
     End
EndIf

Enumeration ; ici, on donne un petit nom à nos sprites:
    
    #disque
    #disque3D
    
    #pic
    #pic3D

EndEnumeration



If OpenScreen (1024, 768, 32, "SpecialFX -> no problemo" )=0 ; basse résolution, mais en 32bit.
     MessageRequester ( "Error" , "Can't open a 640*480 - 32 bit screen !" , 0)
     End
EndIf

CreateSprite ( #disque ,64,64, #PB_Sprite_Texture ) ; disque intéractif
StartDrawing ( SpriteOutput ( #disque ))
 BackColor ( RGB (0,0,0))
  Circle (32,32,32, RGB (255,0,0))
StopDrawing ()
CreateSprite3D ( #disque3D , #disque )

CreateSprite ( #pic ,32,32, #PB_Sprite_Texture ) ; objet tournant autour du disque
StartDrawing ( SpriteOutput ( #pic ))
 BackColor ( RGB (0,0,0))
  Box (0,0, 32, 32, RGB (158,5,5))
StopDrawing ()
CreateSprite3D ( #pic3D , #pic )


	;****************************
	;création des tables de sinus et de cosinus.
	;****************************
	Dim x_sin.l(360)
	Dim y_cos.l(360)
	
	For i=1 To 360
		x_sin(i)=Sin(i)*128;16
		y_cos(i)=Cos(i)*128;16
	Next



; ******************************************************************************************************
Repeat ; Boucle principale
; ******************************************************************************************************



 FlipBuffers (): ClearScreen ( RGB (0,0,0)) 
 ExamineMouse():ExamineKeyboard ()
 


 StartDrawing ( ScreenOutput ())
 AdresseMemoire = DrawingBuffer ()

	For i=1 To 360
	  Plot(512+x_sin(i),384+y_cos(i),RGB ($F2,$FF,$EA))
	Next i

 StopDrawing ()

  
     ; **************************************************************************************************
     Start3D ()    

 Ttourne+1
 If Ttourne>10
   Ttourne=0:tourne+1
   If tourne=361:tourne=1:EndIf
 EndIf 
     DisplaySprite3D ( #pic3D , MouseX ()+16+x_sin(tourne), MouseY ()+40+y_cos(tourne),255)

     DisplaySprite3D ( #disque3D , MouseX (), MouseY ()+40,125)
    
    
     Stop3D ()
     ; **************************************************************************************************
    
    
     Gosub fps ; nombre d'image par seconde 
    

Until KeyboardPushed ( #PB_Key_Escape ): End ; fin de la boucle principale (appuyez sur la touche Esc)
   


fps:
If Val ( FormatDate ( "%ss" , Date ()))=sek 
    fps+1
Else
    FPS$= Str (fps)
    fps=0
EndIf
sek= Val ( FormatDate ( "%ss" , Date ()))
 
StartDrawing ( ScreenOutput ())
DrawingMode (1)
FrontColor ( RGB (255,255,255))
DrawText (1,1, "FPS: " +FPS$)
StopDrawing ()
Return 
:oops:

Publié : dim. 22/juil./2007 8:28
par tmyke
Sauf erreur de ma part, en lisant vite fait ton code, tu demande à PB de calculer
des Sin et Cos avec des angles exprimé en degrés, alors que pour ces fonctions
il faut passer leur passer des angles exprimés en Radians...

Publié : dim. 22/juil./2007 8:34
par tmyke
Tiens, modifié à l'arache, mais cela devrait correspondre a ce que tu cherche je
pense:

Code : Tout sélectionner

; ------------------------------------------------------------
; rotation à base de cosinus et sinus
; ------------------------------------------------------------

UsePNGImageDecoder () ;

If InitMouse ()=0 Or InitSprite ()=0 Or InitKeyboard ()=0 Or InitSprite3D ()=0
     MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
     End
EndIf

Enumeration ; ici, on donne un petit nom à nos sprites:
   
    #disque
    #disque3D
   
    #pic
    #pic3D

EndEnumeration



If OpenScreen (1024, 768, 32, "SpecialFX -> no problemo" )=0 ; basse résolution, mais en 32bit.
     MessageRequester ( "Error" , "Can't open a 640*480 - 32 bit screen !" , 0)
     End
EndIf

CreateSprite ( #disque ,64,64, #PB_Sprite_Texture ) ; disque intéractif
StartDrawing ( SpriteOutput ( #disque ))
 BackColor ( RGB (0,0,0))
  Circle (32,32,32, RGB (255,0,0))
StopDrawing ()
CreateSprite3D ( #disque3D , #disque )

CreateSprite ( #pic ,32,32, #PB_Sprite_Texture ) ; objet tournant autour du disque
StartDrawing ( SpriteOutput ( #pic ))
 BackColor ( RGB (0,0,0))
  Box (0,0, 32, 32, RGB (158,5,5))
StopDrawing ()
CreateSprite3D ( #pic3D , #pic )



; ******************************************************************************************************
Repeat ; Boucle principale
; ******************************************************************************************************



 FlipBuffers (): ClearScreen ( RGB (0,0,0))
 ExamineMouse():ExamineKeyboard ()
 


 StartDrawing ( ScreenOutput ())
 AdresseMemoire = DrawingBuffer ()

   For i=1 To 360
     Plot(512+Sin(i*0.0174532925)*120,384+Cos(i*0.0174532925)*120,RGB ($F2,$FF,$EA))
   Next i

 StopDrawing ()

 
     ; **************************************************************************************************
     Start3D ()   

 tourne+1
 
 
     DisplaySprite3D ( #pic3D , MouseX ()+16+40*Sin(tourne*0.0174532925), MouseY ()+16+40*Cos(tourne*0.0174532925),255)

     DisplaySprite3D ( #disque3D , MouseX (), MouseY (),125)
   
   
     Stop3D ()
     ; **************************************************************************************************
   
   
     Gosub fps ; nombre d'image par seconde
   

Until KeyboardPushed ( #PB_Key_Escape ): End ; fin de la boucle principale (appuyez sur la touche Esc)
   


fps:
If Val ( FormatDate ( "%ss" , Date ()))=sek
    fps+1
Else
    FPS$= Str (fps)
    fps=0
EndIf
sek= Val ( FormatDate ( "%ss" , Date ()))
 
StartDrawing ( ScreenOutput ())
DrawingMode (1)
FrontColor ( RGB (255,255,255))
DrawText (1,1, "FPS: " +FPS$)
StopDrawing ()
Return

Publié : dim. 22/juil./2007 9:43
par Backup
essaye plutot ça !!

sinon avec l'exemple de tmyke,
tu va penser que le Purebasic est lent !! :lol:

Code : Tout sélectionner

; ------------------------------------------------------------
; rotation à base de cosinus et sinus
; ------------------------------------------------------------

UsePNGImageDecoder () ;

If InitMouse ()=0 Or InitSprite ()=0 Or InitKeyboard ()=0 Or InitSprite3D ()=0
    MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
    End
EndIf

Enumeration ; ici, on donne un petit nom à nos sprites:
    
    #disque
    #disque3D
    
    #pic
    #pic3D
    
EndEnumeration



If OpenScreen (1024, 768, 32, "SpecialFX -> no problemo" )=0 ; basse résolution, mais en 32bit.
    MessageRequester ( "Error" , "Can't open a 640*480 - 32 bit screen !" , 0)
    End
EndIf

CreateSprite ( #disque ,64,64, #PB_Sprite_Texture ) ; disque intéractif
StartDrawing ( SpriteOutput ( #disque ))
BackColor ( RGB (0,0,0))
Circle (32,32,32, RGB (255,0,0))
StopDrawing ()
CreateSprite3D ( #disque3D , #disque )

CreateSprite ( #pic ,32,32, #PB_Sprite_Texture ) ; objet tournant autour du disque
StartDrawing ( SpriteOutput ( #pic ))
BackColor ( RGB (0,0,0))
Box (0,0, 32, 32, RGB (158,5,5))
StopDrawing ()
CreateSprite3D ( #pic3D , #pic )



; ******************************************************************************************************
Repeat ; Boucle principale
    ; ******************************************************************************************************
    
     
    ExamineMouse():ExamineKeyboard ()
    
    
    
    StartDrawing ( ScreenOutput ())
    AdresseMemoire = DrawingBuffer ()
    
    For i=1 To 360 
        Plot(512+Sin(i*0.0174532925)*120,384+Cos(i*0.0174532925)*120,RGB ($F2,$FF,$EA))
    Next i
    
    StopDrawing ()
    
    
    ; **************************************************************************************************
    Start3D ()   
    
    tourne+1
    
    
    DisplaySprite3D ( #pic3D , MouseX ()+16+40*Sin(tourne*0.0174532925), MouseY ()+16+40*Cos(tourne*0.0174532925),255)
    
    DisplaySprite3D ( #disque3D , MouseX (), MouseY (),125)
    
    
    Stop3D ()
    ; **************************************************************************************************
    
    
    Gosub fps ; nombre d'image par seconde
    
    FlipBuffers (60): ClearScreen ( RGB (0,0,0))
Until KeyboardPushed ( #PB_Key_Escape ): End ; fin de la boucle principale (appuyez sur la touche Esc)
   


fps:
If Val ( FormatDate ( "%ss" , Date ()))=sek
    fps+1
Else
    FPS$= Str (fps)
    fps=0
EndIf
sek= Val ( FormatDate ( "%ss" , Date ()))
 
StartDrawing ( ScreenOutput ())
DrawingMode (1)
FrontColor ( RGB (255,255,255))
DrawText (1,1, "FPS: " +FPS$)
StopDrawing ()
Return

de belles réponses

Publié : dim. 22/juil./2007 10:07
par beauregard
tmyke a écrit :Tiens, modifié à l'arache, mais cela devrait correspondre a ce que tu cherche je pense:
:D
Oui, c'est exactement ce qu'il me fallait, merci !

Merci dobro, malgrès la fatigue tu as réussi à me faire briller mes yeux, grand ouvert 8O . 200i/s sur un PC sauvé de la poubelle, ça m'inpressionnera toujours, et je regrette de ne pas mettre mis plus tôt à pb.

J'ai terminé mon premier petit jeu en pb que j'ai nommé ghost21, bientôt disponible sur le forum Jeux. Mais comme j'aspire à la perfection de mon code, hum, pourrait-tu me dire comment placer, au lancement du programme, le sprite3D disque (celui dirigé par la souris), au centre de l'écran ?

Re: de belles réponses

Publié : dim. 22/juil./2007 10:59
par Backup
beauregard a écrit :pourrait-tu me dire comment placer, au lancement du programme, le sprite3D disque (celui dirigé par la souris), au centre de l'écran ?
c'est tres facile :D

tu recupere le format de l'ecran actuel

Code : Tout sélectionner

EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
mais tu peut utiliser aussi

Code : Tout sélectionner

hauteur=ScreenModeHeight()
Largeur = ScreenModeWidth()
ensuite tu divise par 2 ces valeurs pour obtenir le centre de ton ecran !!

Code : Tout sélectionner

hauteur=ScreenModeHeight()
Largeur = ScreenModeWidth()

millieu_x=Largeur/2
millieu_y=hauteur/2

bien sur tu peut tout coller sur la meme ligne genre

Code : Tout sélectionner

millieu_y=ScreenModeHeight()/2
millieu_x = ScreenModeWidth()/2
voila on a le centre de l'ecran il te suffis avant la boucle de positionner ton ou tes sprites au centre avec un truc du genre

si tu utilise une structure sprite

Code : Tout sélectionner

structure sprite
xsprite.l
ysprite.l
endstructure



sprite\xsprite=millieu_x
sprite\ysprite=millieu_y


comme ça au premier DisplaySprite(#Sprite, sprite\xsprite, sprite\ysprite)

ton sprite sera au millieu :D

enfin le coin superieur gauche sera au millieu !!
il faudra soustraire la hauteur du sprite/2 en x et en y pour qu'il soit réellement au centre !! :D

sinon ,si tu veux positionner ton curseur souris en mode fenetre
tu fait

Code : Tout sélectionner

SetCursorPos_(x,y) 

jamais sans ma dobro

Publié : dim. 22/juil./2007 16:02
par beauregard
en fait il suffit d'utiliser MouseLocate(512, 384)
merci dobro pour ta patience ! :)

C'est à vous jean-pierre B.:
"Oui, bonjour amis lecteur, alors aujourd'hui ma chère Sophie, je vais vous présenter un petit code, gratuit il va s'en dire, ghost21. Alors ce modeste logiciel de jeu sera bientôt disponible, et avec ces 21 niveaux de pur bonheur, et pour une poignée de kilo octets seulement, vous perdrez du poids, les femmes vous sourirons, et vos amis n'en reviendrons pas !
Alors faite comme nous, optez pour du code réalisé à partir du meilleur langage qui soit, à savoir Purebasic, et comme pour Sophie, votre vie sera sans souci."
Merci jean pierre, et à bientôt !

Publié : dim. 22/juil./2007 18:13
par brossden
Quel est la signification de FPS ?
Est ce Frame Per Second ? J'obtiens un nombre entre 750 et 800 !

Publié : lun. 23/juil./2007 7:21
par beauregard
brossden a écrit :Quel est la signification de FPS ?
Est ce Frame Per Second ? J'obtiens un nombre entre 750 et 800 !
Oui, c'est impressionnant ( heu...j'ai pourtant commenté mon petit code:)

Code : Tout sélectionner

Gosub fps ; nombre d'image par seconde 

Publié : lun. 23/juil./2007 15:09
par Gratteur
Quel est la signification de FPS ?
Est ce Frame Per Second ? J'obtiens un nombre entre 750 et 800 !
Tu dois avoir un sacré moniteur :lol: