Page 2 sur 4
Publié : lun. 30/avr./2007 18:10
par tmyke
A OK. bon voici le code modifié. On définit donc une position initale de l'objet (ici un sprite)
et le rayon que fera le virage (on parle en degrés)
Le pgm genere le centre de rotation
Tu appuis sur Space pour commencer le virage.
Code : Tout sélectionner
; Fichiers Include
IncludePath "Include\" : IncludeFile "dreamotion3d.pbi"
Global *sp1.CSprite2D
; Initialisation des différents modules
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf
; Initialise la fenêtre graphique
DM_Graphics3D(800, 600, 32, 0, 1)
SetCurrentDirectory("media/")
;----------------
; Charge un petit sprite
;----------------
;position intiale du sprite
pos_sp_x = 200
pos_sp_y = 200
; son angle d'attaque du moment
AngDeg.f=40
; rayon de virage
Rayon = 50
; chargement et positionnement
*sp1 = DM_LoadSprite2D("sp1.png", pos_sp_x,pos_sp_y)
DM_RotateSprite2D(*sp1, AngDeg)
; calcul du point central du futur virage
Centre_X = pos_sp_x + Cos((AngDeg+180)*#PI/180) * Rayon
Centre_Y = pos_sp_y + Sin((AngDeg+180)*#PI/180) * Rayon
flag.c = #False
Repeat
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
Quit=1
EndIf
If KeyboardReleased(#PB_Key_Space)
flag=#True
EndIf
If flag
AngDeg + 0.5
Pos_X = Centre_X + Rayon * Cos(AngDeg*#PI/180)
Pos_Y = Centre_Y + Rayon * Sin(AngDeg*#PI/180)
DM_PositionSprite2D(*sp1, Pos_X, Pos_Y)
DM_RotateSprite2D(*sp1, AngDeg)
EndIf
; ---------------
; Rendu
; ---------------
DM_BeginScene()
DM_ClsScreen(0,0,0)
DM_DrawSprite2D(*sp1)
DM_EndScene()
Until Quit=1
DM_ClearGraphics()
End
Publié : lun. 30/avr./2007 18:38
par _Slide_
Merci, cela fait exactement ce que je recherche à faire avec mon mesh d'avion

Va falloir que j'adapte tout cela a mon code

Publié : lun. 30/avr./2007 21:45
par Backup
tmyke a écrit :Bon, je ne sait si c'est ce que tu cherche, mais voici le prolongement du code
de Cpl.Bator, je l'ai fait avec DM3D, heeuu (j'ai honte...) je sais pas comment
on fait faire une rotation a un sprite2D avec PB
pour une fois que je peux t'expliquer !
regarde c'est simple lit les commentaires de ceci :
(j'utilise ce code pour tester mes code 2D)
; code by Dobro http://michel.dobro.free.fr/
#dobro =1
#Police =1
#sprite =1
; ***********************************
Resultat =
InitSprite ()
FontID =
LoadFont (
#Police ,
"arial" , 50,
#PB_Font_Bold )
EcranX =
GetSystemMetrics_ (
#SM_CXSCREEN ):
;=largeur de l'ecran
EcranY =
GetSystemMetrics_ (
#SM_CYSCREEN ):
;=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)
Resultat =
InitMouse ()
taille_du_cercle=200
nombre_de_point=360
; ceci determine la resolution (nombre de points)
; on fabrique un sprite : D
CreateSprite (
#sprite ,32,32)
; de 32 par 32
StartDrawing (
SpriteOutput (
#sprite ) )
; on va dessiner dans notre sprite (qui est au depart une cellule vide)
Circle (16, 16, 16 ,
RGB (255,0,0))
; je decide de dessiner un cercle rouge dedans
StopDrawing ()
; voila notre sprte est dessiné !! : D
Repeat
ExamineMouse ()
Event=
WaitWindowEvent ()
StartDrawing (
ScreenOutput ())
compt+1
If compt=nombre_de_point :compt=0:
EndIf ; on a fait le tour ??
x=taille_du_cercle*
Cos ( compt*(2*3.1415926/nombre_de_point)) + (EcranX / 2)
; la formule du cercle /360 = 360 points
Y=taille_du_cercle *
Sin ( compt*(2*3.1415926/nombre_de_point)) + (EcranY / 2)
; la formule du cercle
Box (x, Y,2, 2 ,
RGB (255,255,255))
; on peux laisser une trace du dessin
StopDrawing ()
; on affiche notre rond rouge : D
DisplaySprite (
#sprite ,x,Y)
; *****************************
StartDrawing (
ScreenOutput ())
DrawText (20, 200,
" a la fin du dessin " )
DrawText (20, 250,
" click avec le bouton droit !! " )
StopDrawing ()
FlipBuffers ():
; affiche l'ecran *****<------- si tu Rem ceci le sprite laisse une trace : D
ClearScreen (
RGB (0,0,0))
Event=
WindowEvent ()
If MouseButton (2)
End
EndIf
Until Event=
#PB_Event_CloseWindow
Publié : mar. 01/mai/2007 7:51
par tmyke
Merci Michel, sympa le code. En fait je me demandais surtout comment faire une rotation
d'un sprite sur lui meme (autour de son axe), un peu comme l'instruction
DM_RotateSprite2d() de Dreamotion3D ?

Publié : mar. 01/mai/2007 9:26
par Backup
tout simplement comme ça !
; code by Dobro http://michel.dobro.free.fr/
#dobro =1
#Police =1
#sprite =1
#Sprite3D =1
#angle =5
; ***********************************
Resultat =
InitSprite ()
Resultat =
InitSprite3D ()
FontID =
LoadFont (
#Police ,
"arial" , 50,
#PB_Font_Bold )
EcranX =
GetSystemMetrics_ (
#SM_CXSCREEN ):
;=largeur de l'ecran
EcranY =
GetSystemMetrics_ (
#SM_CYSCREEN ):
;=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)
Resultat =
InitMouse ()
taille_du_cercle=200
nombre_de_point=360
; ceci determine la resolution (nombre de points)
; on fabrique un sprite : D
CreateSprite (
#sprite ,32,32,
#PB_Sprite_Texture )
; de 32 par 32
StartDrawing (
SpriteOutput (
#sprite ) )
; on va dessiner dans notre sprite (qui est au depart une cellule vide)
Box (1, 1, 32 ,32,
RGB (255,0,0))
; je decide de dessiner un carre rouge dedans
StopDrawing ()
; voila notre sprte est dessiné !! : D
; on fait un sprite3d a partir de notre sprite créé
Resultat =
CreateSprite3D (
#Sprite3D ,
#sprite )
Repeat
ExamineMouse ()
Event=
WaitWindowEvent ()
; StartDrawing ( ScreenOutput ())
compt+1
If compt=nombre_de_point :compt=0:
EndIf ; on a fait le tour ??
x=taille_du_cercle*
Cos ( compt*(2*3.1415926/nombre_de_point)) + (EcranX / 2)
; la formule du cercle /360 = 360 points
Y=taille_du_cercle *
Sin ( compt*(2*3.1415926/nombre_de_point)) + (EcranY / 2)
; la formule du cercle
; Box (x, Y,2, 2 , RGB (255,255,255)) ; on peux laisser une trace du dessin
; StopDrawing ()
; on affiche notre rond rouge : D
; DisplaySprite ( #sprite ,x,Y) ; afficherai le sprite 2D
RotateSprite3D (
#Sprite3D , -
#angle ,1)
Start3D ()
DisplaySprite3D (
#Sprite3D , x,Y, 255)
; affiche le sprite 3D
Stop3D ()
; *****************************
StartDrawing (
ScreenOutput ())
DrawText (20, 200,
" a la fin du dessin " )
DrawText (20, 250,
" click avec le bouton droit !! " )
StopDrawing ()
FlipBuffers ():
; affiche l'ecran *****<------- si tu Rem ceci le sprite laisse une trace : D
ClearScreen (
RGB (0,0,0))
Event=
WindowEvent ()
If MouseButton (2)
End
EndIf
Until Event=
#PB_Event_CloseWindow
Publié : mar. 01/mai/2007 9:30
par tmyke
A OK, faut passer par les Sprites3D. Merci, je comprend nettement mieux
désormais
Merci

Publié : jeu. 03/mai/2007 14:22
par _Slide_
Bonjour,
Toujours en rapport avec la rotation, comment svp, peut-on faire en sorte que la valeur ajouté à l'angle AngDeg soit proportionnel à la vitesse de déplacement de facon que le sprite se déplace de la même manière qu'en ligne droite.
En ligne droite on fait cela pour prendre la vitesse en compte :
Code : Tout sélectionner
Sprite\x + Direction\x * Vitesse
Sprite\y + Direction\y * Vitesse
(tiré du tuto proposé par Comtois ici :
http://www.games-creators.org/wiki/Pure ... t_Sprite3D)
Par là j'aimerai que la distance parcourue sur mon arc de cercle soit la même que si c'était en ligne droite.
Pouvez-vous m'aider à réaliser cela svp ?
Merci

Publié : ven. 04/mai/2007 17:53
par tmyke
Tu cherches à reproduire le comportement du sprite du tuto de Comtois ?
(qui se calerait sur une direction changente)
Publié : ven. 04/mai/2007 18:08
par _Slide_
Je n'ai pas compris ta question Tmyke, je vais essayer de repondre.
Mon code de base est basé sur le tutoriel de Comtois.
En faite j'aimerais avoir une vitesse égale de déplacement entre un sprite qui va se déplacer en ligne droite et un autre sprite qui va se deplacer circulairement.
Pour cela il faut déterminer par un calcul la valeur qui sera incrémenté à l'angle en fonction de la vitesse voulu et de le rayon... mais lequel... ? La Trigo c'est pas mon point fort.
Si la valeur incrémenté à l'angle n'est pas la bonne, le sprite ira trop vite ou trop lentement.
edit : pour une ligne droite la vitesse est un facteur du vecteur directionnel une fois normé
Publié : ven. 04/mai/2007 18:41
par tmyke
OK, je comprend mieux, je me penche dessus et je te tiens au courant d'ici a ce soir

Publié : ven. 04/mai/2007 18:46
par comtois
Tu me diras si c'est ça ?
Code : Tout sélectionner
Define.f Vitesse, Rayon, Omega, Angle, DistanceD
Rayon = 45
Vitesse = 3
Omega = Vitesse / Rayon
;Compare les distances parcourues pour 60 boucles
For i = 1 To 60
; En ligne droite
DistanceD + Vitesse ; Le premier sprite se déplace en ligne droite
;Angle parcouru
Angle + Omega ; le second en cercle à la vitesse omega
Next i
;Affiche la distance en ligne droite
Debug DistanceD
;Affiche la distance en cercle
Debug Angle * Rayon
Publié : ven. 04/mai/2007 18:47
par _Slide_
tmyke a écrit :OK, je comprend mieux, je me penche dessus et je te tiens au courant d'ici a ce soir

Je te remercie d'avance

.
Publié : ven. 04/mai/2007 18:48
par _Slide_
comtois a écrit :Tu me diras si c'est ça ?
Merci Comtois.
C'est surment cela que je recherche

Je vais étudier ton code pour voir ca

Publié : ven. 04/mai/2007 19:02
par _Slide_
Publié : sam. 05/mai/2007 17:13
par _Slide_
Bonjour,
Maintenant il faut que je passe de la rotation à la ligne droite pour arriver à la destination.
Voici toutes les données que j'ai dans mon code :

Les points, distances et angles qui portent un nom, ce sont les valeurs que je connais déjà.
Ce que je recherche c'est l'angle "????" pour obtenir l'angle à parcourir (ma rotation...) pour ensuite pouvoir aller direct en ligne droite vers ma destination.
Je dispose donc de x1,x2,x3,a1,a2,d1,d2 ainsi que les angles droit pour trouver "????".
Pouvez vous m'aider ?
Merci
edit : image modifié
edit 2 : image modifié encore (l'angle recherché), ca devrait etre bon là