Page 1 sur 4

Question déplacement math

Publié : ven. 15/sept./2006 10:20
par Fig
Bonjour,
J'ai donc une question à vous poser concernant le déplacement d'un sprite pour un jeu type age of empire.

J'ai 2 pointx x1,y1 x2,y2 et une vitesse. Je pars du point 1 vers le point 2.

Je souhaite obtenir le point suivant du déplacement, pour que le déplacement ai une vitesse constante. :angel:

J'ai essayé un truc mais ca bug et c bancal parecque je suis vraiment nul en math ! :cry:

C'est un probleme classic je suppose, que vous avez déja la réponse.
Ca fait déja deux semaines que je galère la dessus, en désespoir de cause je m'en remet à vous... :?

Si en plus c'était pas trop lent... ca serait le pied.

merci bien. :?:

Publié : ven. 15/sept./2006 11:05
par SPH
C'est facile. Cependant, tu ne precise pas si on va tout droit ou si on parcourt un chemin avec tournant a angle droit.

Bon, disons qu'on va de A (xa et ya sont les coordonnées X et Y du point A) vers B (pareil que pour A au niveau coordonnées) directement :

Code : Tout sélectionner

distance = sqr((xb-xa)*(xb-xa)+(yb-ya)*(yb-ya))
Voila, tu as la distance entre le point A et le point B

Si par exemple tu as une distance de 50, ca veux dire que tu as 50 pixels qui separent les 2 points.
Donc, si un personnage marche de A vers B, tu le feras marcher de 2 ou 3 pixels par images. Un cheval au galop lui, ira a 10 ou 12 pixels par images.

:wink:

Publié : ven. 15/sept./2006 11:22
par comtois
ou tu peux lire ce tut, le chapitre "un peu de math"

http://www.games-creators.org/wiki/Pure ... t_Sprite3D

Publié : ven. 15/sept./2006 21:22
par Fig
bon, merci beaucoup... Il faut que je réfléchisse beaucoup là...

voyons, sqr c'est square mais je suppose que c'est la racine carré (RMS ?)en non le carré car je crois reconnaitre pythagore ...

Mais j'ai beaucoup de mal avec ton exemple Comtois parceque je ne suis pas familiarisé avec les procédures et tout ces choses de langages haut niveau... Pour moi j'avoue à ma honte que les programmes sont linéaires et les tableaux sont des octets les uns derrieres les autres auxquels ont accede par des calculs arf :? :oops:

... Ha ok, c'est bon, j'ai compris !! :idea:

Merci mille fois !!! :D

Publié : dim. 29/avr./2007 18:37
par _Slide_
Ah j'ai retrouvé ce topic :) Ca fait 4 jours que je le cherche, je savais plus sur quoi (forum) je l'avais vu.
Comtois doit avoir une petite idée de pourquoi d'ailleur j'ai besoin de ce calcul ;).

Merci pour vos reponses au faite ! :)

Publié : lun. 30/avr./2007 14:40
par _Slide_
Bonjour,

Donc j'ai suivi le tutoriel que Comtois propose, et j'ai reussi à faire ce que je voulais :) Sauf que je trouve le changement d'angle trop agressif et comme il s'agit de chasseur, avion, je dois le faire plus doucement.
J'ai dessiné comment je vois la chose, il n'y a pas de pachfinding, donc le changement d'angle peut se faire ainsi :
Image

Je suis vraiment un boulet en trigonométries, si vous pouviez m'aider... dans mon cas carrement me proposer un code pour faire ca... ... ... :(

Si vous avez d'autre proposition pour le changement d'angle de mon chasseur/avion je suis preneur. C'est en 3D, mais je travail que sur 2 plans, donc c'est en 2D.

Merci

Publié : lun. 30/avr./2007 14:50
par Anonyme

Code : Tout sélectionner

Pos_X + Speed * cos(AngDeg*#pi/180)
Pos_Y + Speed * sin(AngDeg*#pi/180)
As tu essayé cela ?
:wink:

Publié : lun. 30/avr./2007 15:05
par _Slide_
Cpl.Bator a écrit :

Code : Tout sélectionner

Pos_X + Speed * cos(AngDeg*#pi/180)
Pos_Y + Speed * sin(AngDeg*#pi/180)
As tu essayé cela ?
:wink:
Merci d'avoir répondu aussi vite Caporal :)
Que représente AngDeg ici ?
En passant, je rappel que :
_Slide_ a écrit :Je suis vraiment un boulet en trigonométries
Hihi :)

Merci

Publié : lun. 30/avr./2007 16:02
par Anonyme
Angle en degrees tout simplement :wink:

Publié : lun. 30/avr./2007 16:05
par _Slide_
Cpl.Bator a écrit :Angle en degrees tout simplement :wink:
J'ai commencé un petit code à l'instant, j'ai dû certainement me perdre... tjrs eu du mal en trigo, mais que l'on me dise pas que je n'ai pas cherché (rien de visuel, que du théorique) :

Pox_X et Pos_Y sont les coordonnées de mon sprite.

Code : Tout sélectionner

Rayon = 10 ; Rayon du cercle de rotation

Centre_X = Pos_X + ???? ; Position du centre du cercle de rotation
Centre_Y = Pos_Y + ???? ; Position du centre du cercle de rotation
; on fait un tour de cercle
for AngDeg = 1 to 360
  Pos_X = Centre_X + Rayon * cos(AngDeg)
  Pos_Y = Centre_Y + Rayon * sin(AngDeg)
endif
Apres ce code, on est revenu au point de départ. C'est un bon début lol.
Ce qui me manque c'est les "????", si vous pouvez maider... merci :).

Publié : lun. 30/avr./2007 16:16
par _Slide_
Le graph qui va avec mon code :
Image

Help :)

Publié : lun. 30/avr./2007 16:18
par Anonyme
Pour Tracer un cercle , c'est comme ca :
for AngDeg = 1 to 360
Pos_X = Centre_X + Rayon * cos(AngDeg*#pi/180)
Pos_Y = Centre_Y + Rayon * sin(AngDeg*#pi/180)
endif
Pour déplacer un sprite, c'est la meme chose :wink:

Publié : lun. 30/avr./2007 16:21
par _Slide_
Merci :) J'ai besoin du centre surtout :'( help :)
Mon sprite est sur le cercle, ce n'est pas le centre, donc le centre de rotation, il me le faut le calculer, j'ai dessiné un petit graph pour etre plus clair tantôt.

Merci Caporal :)

Image

edit : il y a un angle droit entre le vecteur et le rayon du cercle.

Publié : lun. 30/avr./2007 17:28
par tmyke
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 :?

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
  ;-------------------------
  *sp1 = DM_LoadSprite2D("sp1.png", 10,10)

  AngDeg.l=0
  Centre_X = 200
  Centre_Y = 200
  Rayon = 50

  Repeat
  	ExamineKeyboard()
	
  	If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
  	  Quit=1
  	EndIf
  	

   AngDeg +1  
   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)
   
  	; ---------------
  	;      Rendu
  	; ---------------
  	DM_BeginScene()
	      DM_ClsScreen(0,0,0)
	      DM_DrawSprite2D(*sp1)	    
  	DM_EndScene()
  	

  Until Quit=1

  DM_ClearGraphics()
  End
  

Publié : lun. 30/avr./2007 17:50
par _Slide_
Si c'est ce que je cherche à faire, mais j'aimerai déterminer le centre de rotation automatiquement en fonction de la position du sprite et son orientation.
Là tu as fixé comme valeur 200 et 200 :'(.

Merci pour le code source, comme ca on peut tester de la théorie à la pratique sans trop d'effort maintenant ;). Vive Dreamotion :D