Re: [jeu] chargement des sprites
Publié : mar. 28/juin/2011 5:48
je suis un peu la conversation depuis quelques temps, sans intervenir. J'ai moi même commencé un jeu dans le genre ... pas aussi abouti que celui de blendman
Mais mon système de déplacement fonctionne; Et pour un deplacement plus humain j'utilise une courbe Catmull-Rom entre les différents point qui trace le parcourt
mon code est un peu gros a mettre mais je vais essayer de vous expliquer comment je fais
j'ai essayé de commenté mon code... j'éspère qu'il est assez intuitif et que je ne suis pas hors sujet !
faudrait que je nettoie le code avant de le publier ici
mais voici ma fonction principal pour le déplacement
Mais mon système de déplacement fonctionne; Et pour un deplacement plus humain j'utilise une courbe Catmull-Rom entre les différents point qui trace le parcourt
mon code est un peu gros a mettre mais je vais essayer de vous expliquer comment je fais
j'ai essayé de commenté mon code... j'éspère qu'il est assez intuitif et que je ne suis pas hors sujet !
Code : Tout sélectionner
Procedure CatmullRomSpline(t.f,*result.POINT,*p0.Point,*p1.Point,*p2.point,*p3.point)
t2.f = t * t
t3.f = t2 * t
*result\x= 0.5 * ( ( 2.0 * *p1\x ) + ( -*p0\x + *p2\x ) * t + ( 2.0 * *p0\x - 5.0 * *p1\x + 4 * *p2\x - *p3\x ) * t2 + ( -*p0\x + 3.0 * *p1\x - 3.0 * *p2\x + *p3\x ) * t3 )
*result\y= 0.5 * ( ( 2.0 * *p1\y ) + ( -*p0\y + *p2\y ) * t + ( 2.0 * *p0\y - 5.0 * *p1\y + 4 * *p2\y - *p3\y ) * t2 + ( -*p0\y + 3.0 * *p1\y - 3.0 * *p2\y + *p3\y ) * t3 )
EndProcedure
faudrait que je nettoie le code avant de le publier ici
mais voici ma fonction principal pour le déplacement
Code : Tout sélectionner
Procedure checkCharacter(*chara.characters)
;en gros si mon point de depart et d'arrivé est différent faut trouver un chemin
If (*chara\ToWorldPixelX<>*chara\worldPixelX Or *chara\ToWorldPixelY<>*chara\worldPixelY) And *chara\pathSize=0
Debug "Nouveau chemin"
tileX=Int(*chara\worldPixelX/#tileWidth)
tileY=Int(*chara\worldPixelY/#tileWidth)
toTileX=Int(*chara\ToWorldPixelX/#tileWidth)
toTileY=Int(*chara\ToWorldPixelY/#tileWidth)
*chara\path=get_path(tileX,tileY,toTileX,toTileY,pf) ;<= la ma fonction pathinfinding
*chara\pathSize=path_get_size(character(0)\path) ;le nombre de case pour le deplacement
*chara\startTime=ElapsedMilliseconds() ;on initialise le temps pour le debut du deplacement
*chara\num=-1 ; j'initialise mon "pointeur" dans le chemin établit part le pathfinding
*chara\startWorldPixelX=*chara\worldPixelX ; et je memorise mon point de depart
*chara\startWorldPixelY=*chara\worldPixelY ;
;End
EndIf
;si on a déjà un chemin alors hop on avance
If *chara\pathSize>0
t.f=(ElapsedMilliseconds()-*chara\startTime)/1000 ;t doit varier de 0 a 1.0 étant le depart d'une case, le 1 etant l'arrivé de la case suivante
move=1 ;on doit se depalcer
;si on arrive a la case suivante
If t=>1:
*chara\num+1:;on avance d'une case sur mon chemin
If *chara\num>*chara\pathSize-2 ;là on est arrivé
Debug "FIN";
FreeMemory(*chara\path) ;j'efface mon chemin effectué
move=0 ;plus besoin de bougé
*chara\pathSize=0
*chara\num=0
*chara\worldPixelX=*chara\ToWorldPixelX ;on est bien arrivé au point qu'on voulait
*chara\worldPixelY=*chara\ToWorldPixelY
EndIf
*chara\startTime=ElapsedMilliseconds(): ;je memorise le temps
EndIf
EndIf
If move=1 ; si on doit se depalcer
Dim p.point(3) ;et pour faire ma route d'un tile a un autre j'ai besoin de connaitre 4 points (catmull rom)
For z=0 To 3
num=*chara\num+z-1
If num<0:
num=-1
EndIf
If num>*chara\pathSize-1
num=*chara\pathSize-1
EndIf
Select num
Case -1
p(z)\x=*chara\startWorldPixelX
p(z)\y=*chara\startWorldPixelY
Case *chara\pathSize-1
p(z)\x= *chara\ToWorldPixelX
p(z)\y= *chara\ToWorldPixelY
Default
p(z)\x=path_get_x(*chara\path,num)*#tileWidth+#tileWidth/2
p(z)\y=path_get_y(*chara\path,num)*#tileWidth+#tileWidth/2
EndSelect
Next
result.point
CatmullRomSpline(t,result,p(0),p(1),p(2),p(3))
;Debug "x:"+Str(result\x)+" y:"+Str(result\y)
*chara\worldPixelX=result\x
*chara\worldPixelY=result\y
EndIf
EndProcedure