
J'essaye donc de faire un snake où le déplacement se fait dans toutes les directions (entendez tous les angles, contrairement au snake classique) et où le serpent suit le curseur de la souris. Jusque là ça marche pas trop mal, c'est plutôt fluide tant que la longueur du serpent ne dépasse pas les 15 sprites.
Mais petit problème à résoudre : comme dans ma boucle, la chaîne qui enregistre les positions des sprites qui composent mon serpent, s'actualise en permanence, mon serpent se compresse en un point, constitué de tous les sprites superposés. Je voudrais donc que le serpent garde sa longueur, même "à l'arret".
J'ai essayé :
-actualiser la chaine uniquement si dx²+dy² > valeur : mon serpent se rétrécit moins mais il n'arrive pas jusqu'au curseur
-actualiser la chaine uniquement si distance "premier élément" - "dernier élément" > valeur : mon serpent se comporte comme s'il avait avalé des barres de fer, il tourne avec des angles carrés et c'est très moche)
Code : Tout sélectionner
#Police=1
InitKeyboard () : ; charge environnements
InitMouse()
Resultat = InitSprite ()
FontID = LoadFont ( #Police , "arial" , 18, #PB_Font_Bold ) ;police chargée
EcranX = GetSystemMetrics_ ( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = GetSystemMetrics_ ( #SM_CYSCREEN ): ;=hauteur de l'ecran
;****************************OUVERTURE ECRAN ********************************
WindowID = OpenWindow (1, 0, 0,EcranX, EcranY, "Abysse" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
Result = OpenWindowedScreen ( WindowID (1),0,0, 800,600, 1, 0,0)
x_sprite=EcranX/2 ; on centre les coordonées du sprite
y_sprite=EcranY/2 ; on centre les coordonées du sprite
dx.f = 0
dy.f = 0
;***************ici entrer longueur serpent-***********
longserpent.b=10
NewList bodyx.l()
NewList bodyy.l()
For partbody = 0 To longserpent
AddElement(bodyx())
bodyx()=x_sprite
AddElement(bodyy())
bodyy()=y_sprite
Next
longueur.b=CountList(bodyx())
Resultat = ReleaseMouse(0) ;bloque sours
;DEBUT BOUCLE*******
Repeat
Event= WindowEvent ()
;**********************SUIT LA SOURIS***********************
ExamineMouse()
dx=x_sprite-MouseX()
dy=y_sprite-MouseY()
; ******* creation sprite ************
For partbody=1 To longueur
If CreateSprite (partbody,32,32) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
TransparentSpriteColor(partbody,black)
StartDrawing ( SpriteOutput (partbody) ) ; on va dessiner dedans !
Circle (16,16,8, RGB (150,150,255)) ; on dessine un cercle
StopDrawing ()
EndIf
Next
If CreateSprite (cursor,32,32) ; on creer un sprite vide (une cellule) de 32 par 32 et on le nomme cursor
TransparentSpriteColor(cursor,black)
StartDrawing ( SpriteOutput (cursor) ) ; on va dessiner dedans !
Circle (16,16,4, RGB (255,0,0)) ; on dessine un cercle rouge pour reperer la souris
StopDrawing ()
EndIf
For partbody=1 To longueur
SelectElement(bodyx(), partbody) ; Sélectionne un élément
*elementx1 = @bodyx()
SelectElement(bodyx(), partbody-1) ; Sélectionne l'élément précédant ce dernier
*elementx2 = @bodyx()
; Echange les éléments
LastElement(bodyx())
If Abs(x_sprite-bodyx())>10 ; évite compression serpent
SwapElements(bodyx(), *elementx1, *elementx2)
EndIf
SelectElement(bodyy(), partbody) ; Sélectionne un élément
*elementy1 = @bodyy()
SelectElement(bodyy(), partbody-1) ; Sélectionne l'élément précédant ce dernier
*elementy2 = @bodyy()
; Echange les éléments
LastElement(bodyy())
If Abs(y_sprite-bodyy())>10 ; évite compression serpent
SwapElements(bodyy(), *elementy1, *elementy2)
EndIf
Next
FirstElement(bodyx())
bodyx() = x_sprite ; actualise la tete
FirstElement(bodyy())
bodyy() = y_sprite ; pour le premier element de la liste et efface le dernier element
If dy<0
y_sprite= y_sprite-0.03*(dy)
Else
y_sprite= y_sprite-0.03*(dy)
EndIf
If dx<0
x_sprite = x_sprite-0.03*(dx)
Else
x_sprite = x_sprite-0.03*(dx)
EndIf
For partbody=1 To longueur
SelectElement(bodyx(), partbody)
SelectElement(bodyy(), partbody)
DisplayTransparentSprite (partbody, bodyx(), bodyy()) ; affiche le sprite au coordonées
Next
DisplayTransparentSprite (cursor, MouseX(), MouseY()) ; affiche le curseur
FlipBuffers (): ; affiche l'ecran
ClearScreen ( RGB (0, 0, 0)) : ;efface l'ecran
ExamineKeyboard()
Until Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) ; press echap
Au passage, si vous avez des astuces pour optimiser mon code, en particulier pour l'enregitrement du chemin parcouru par le serpent, je suis preneur !
Merci d'avance, THSK.