sprite3D en rotation autour d'un autre sprite3D

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

sprite3D en rotation autour d'un autre sprite3D

Message 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:
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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...
Force et sagesse...
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

de belles réponses

Message 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 ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: de belles réponses

Message 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) 
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

jamais sans ma dobro

Message 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 !
brossden
Messages : 822
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Quel est la signification de FPS ?
Est ce Frame Per Second ? J'obtiens un nombre entre 750 et 800 !
Denis

Bonne Jounée à tous
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message 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 
Gratteur
Messages : 147
Inscription : ven. 22/avr./2005 23:02

Message 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:
Répondre