G-Rom a écrit :Je vais essayer de t'expliquer clairement.
salut
Merci pour ton explication

(j'étais en train de comprendre ton exemple, mais ton explication m'a confirmé ce que j'avais compris).
J'ai donc, modifié mon exemple, et effectivement, la vitesse est normalisée. Mais il se pose un nouveau problème : les angles ne fonctionnent plus.
En fait, avec cet exemple, seuls les angles n*45° sont pris en compte.
voici mon code, peut être ai-je fait une erreur quelque part, je continue à regarder :
Code : Tout sélectionner
;{******************** infos ******************
;
; déplacement de personnage (un clic and go de base) et lançage de sorts à la volée :)
;
; code release mouse : netmaestro
; aide sur le déplacement (purebasic): G-rom, Djes
; aide sur le déplacement (general) : D-z
; le reste : ben, moi :)
;
; pb : 4.51
;
;}
;{ ************************enumeration ***********************
#window = 0
Enumeration
#player
#block
#ennemi
EndEnumeration
#ScreenW = 800
#ScreenH = 600
;}
;{ ************************ variables ************************
Global vitesse= 3
Global inscreen = 1
Global mouseClic = 0
ShowCursor_(1)
;}
;{ ************************ Structures ************************
Structure s_block
id.i ; l'id (le numero) de l'objet >> doublon avec la position de la liste ?
name.s ; le nom de l'objet
sprite.i ; le sprite
position.Point ; la position x, y
previous.Point ; la position de depart ou d'avant
cible.Point ; la position vers laquelle on veut aller (arrivee)
direction.Point ; la direction dans laquelle on se déplace
distance_A_Parcourir.f ; la distance entre le depart (previous) et l'arrivee (cible)
distance_restante.f
cible_ok.i ; pas utile ?
vitesse.f ; la vitesse de déplacement
EndStructure
Global NewList block.s_block()
Global NewList ennemi.s_block()
Global Dim player.s_block(0)
player(0)\name = "player"
player(0)\position\x = 15
player(0)\position\y = 15
player(0)\previous\x = 15
player(0)\previous\y = 15
player(0)\vitesse = 3
player(0)\cible\x=15
player(0)\cible\y=15
player(0)\sprite = #player
player(0)\cible_ok=0
;}
;{ ************************ declare ***************************
Declare gestion_souris()
Declare evenementClavier()
Declare Player_move()
Declare affichage()
Declare instance_create()
Declare Sort_move()
;}
;{ ************************ inititialisation *****************
InitKeyboard ()
InitSprite()
InitSprite3D()
InitMouse()
UsePNGImageDecoder()
;}
;{ ************************ open window *********************
OpenWindow(#window, 0, 0,#ScreenW, #ScreenH, "Collision" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
OpenWindowedScreen( WindowID (#window),0,0, 800,600, 1, 0,0)
;}
;{ ************************ sprite et loading ***************
;on charge les sprites
LoadSprite(#player,"col.png")
LoadSprite(#block,"blockCollision.png")
LoadSprite(#ennemi,"ennemi.png")
For i =0 To 2 ; on 3 types d'objets (player, block (=sort) et ennemi)
TransparentSpriteColor(i,RGB(255,0,0)) ; on rend la couleur rouge transprante
Next i
;}
;{ ************************ boucle principale ***************
Repeat
Event= WindowEvent ()
ExamineKeyboard ()
ExamineMouse()
gestion_souris()
affichage()
evenementClavier()
Player_move()
instance_create()
Sort_move()
FlipBuffers ()
ClearScreen (RGB (125,125,125))
Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape )
;}
Procedure evenementClavier()
If KeyboardPushed ( #PB_Key_Up )
ForEach block()
With block()
If \name = "player"
\previous\y = \position\y
\position\y - \vitesse
EndIf
EndWith
Next
EndIf
If KeyboardPushed ( #PB_Key_Down )
ForEach block()
With block()
If \name = "player"
\previous\y = \position\y
\position\y + \vitesse
EndIf
EndWith
Next
EndIf
If KeyboardPushed ( #PB_Key_Left )
ForEach block()
With block()
If \name = "player"
\previous\x = \position\x
\position\x - \vitesse
EndIf
EndWith
Next
EndIf
If KeyboardPushed ( #PB_Key_Right )
ForEach block()
With block()
If \name = "player"
\previous\x = \position\x
\position\x +\vitesse
EndIf
EndWith
Next
EndIf
EndProcedure
Procedure Player_move()
If MouseButton(#PB_MouseButton_Left) =1
player(0)\cible_ok = 1
player(0)\cible\x = MouseX()
player(0)\cible\y = MouseY()
EndIf
With player(0)
If \cible_ok = 1 And \name = "player"
If \position\x < \cible\x
\position\x + \vitesse
ElseIf \position\x > \cible\x
\position\x - \vitesse
EndIf
If \position\y < \cible\y
\position\y + \vitesse/2
ElseIf \position\y > \cible\y
\position\y - \vitesse/2
EndIf
EndIf
EndWith
; dist = DISTANCE(Destination, Sprite)
;
; If dist < Vitesse
; Sprite\x + Direction\x * dist
; Sprite\y + Direction\y * dist
; Else
; Sprite\x + Direction\x * Vitesse
; Sprite\y + Direction\y * Vitesse
; EndIf
;
;
EndProcedure
Procedure instance_create()
If MouseButton(#PB_MouseButton_Right) =1 And mouseClic = 0
mouseClic = 1
vitesseSort = 0
;ClearList(block())
AddElement(block())
With block()
\name = "block"
\sprite = #block
\previous\x = player(0)\position\x ;depart
\previous\y = player(0)\position\y ; depart
\cible\x = MouseX() ; arrivee
\cible\y = MouseY() ; arrivée
\position\x = player(0)\position\x ; position actuelle
\position\y = player(0)\position\y ; position actuelle
\direction\x = \cible\x - \previous\x ; la direction
\direction\y = \cible\y - \previous\y ; la direction
\distance_A_Parcourir = Sqr( \direction\x * \direction\x + \direction\y * \direction\y ) ; la distance à parcourir entre l'arrivée et le départ
\direction\x = \direction\x / \distance_A_Parcourir ; la direction normalisée en x
\direction\y = \direction\y / \distance_A_Parcourir ; la direction normalisée en y
\vitesse = 2
EndWith
nbre_element = ListSize(block())
ElseIf MouseButton(#PB_MouseButton_Right) =0
mouseClic = 0
EndIf
EndProcedure
Procedure gestion_souris()
mx = WindowMouseX(#window):my = WindowMouseY(#window)
If inscreen = 1
If mx> #ScreenW-2 Or my> #ScreenH-2 Or mx<1 Or my<1
inscreen = 0
ReleaseMouse(1)
EndIf
ElseIf mx <#ScreenW-1 And my < #ScreenH-1 And mx > 0 And my > 0
ReleaseMouse(0)
MouseLocate(mx,my)
inscreen = 1
EndIf
EndProcedure
Procedure Sort_move()
If ListSize(block()) <> 0
For i =0 To ListSize(block())-1
If SelectElement(block(), i)
block()\position\x + (block()\vitesse * (block()\direction\x))
block()\position\y + (block()\vitesse * (block()\direction\y))
EndIf
ChangeCurrentElement(block(),i)
Next
EndIf
EndProcedure
Procedure affichage()
DisplayTransparentSprite(player(0)\sprite, player(0)\position\x, player(0)\position\y)
ForEach block()
DisplayTransparentSprite(block()\sprite, block()\position\x, block()\position\y)
Next
EndProcedure
En tout cas, encore merci pour ton explication (et ta patience

)
pour tester, il faut faire un clic droit, puisque c'est sur le "sort" que je travaille.