FIG : j'ai commencé à modifier tout cela en fonction de tes remarques. Je vais faire des tests pour voir si ça marche

.
djes a écrit :Dans les deux cas, il faut savoir si l'on gère les interactions avec les joueurs séparément de la boucle principale. C'est très important, car tout le moteur de déplacement en dépend, et c'est un vrai casse-tête en réseau!
eh ben, déjà que ce n'es tpas évident alors que je suis en mode offline, lorsque je vais passer en réseau, ça va être coton

.
Sinon, j'ai aussi commencé à intégrer la technique de Case. Finalement, comme j'utilise des structures qui "extends" une autre structure, j'ai pu le faire sans devoir ré-écrire tout mon code

. En testant son exemple, j'ai trouvé que ça fonctionnait vraiment pas mal du tout et c'est très simple au final.
Une question : ma liste d'objet animé risque de changer, car des monstres peuvent apparaitre, alors qu'ils n'étaient pas présent, ou disparaitre, ou d'autres joueurs peuvent aussi s'ajouter sur la carte par la suite, voire des sorts animés , etc...
Dans l'exemple de Case c'est facile d'accéder aux éléments de la liste, mais dans mon cas, j'ai beaucoup plus que 3 éléments et la liste n'est pas fixes

.
Alors, comment par exemple puis-je sélectionner dans la liste l'élément mob5 pour changer son animation ou son maxframe sans connaitre son id ?
(ici -> SelectElement(sprites(),id)
Merci

.
EDIT :
Comtois : je n'avais pas vu ton message

.
Comme je disais, en fait j'utilise au final des extends de structures.
Je vais regarder ton exemple pour voir si je m'en servir aussi.
Dobro : le tableau static, ça va aussi me servir

.
EDIT 2 :
bon, j'ai réussi, je crois

.
Voici la technique :
Je crée un timer /boucle générale (technique djes N°1)
Code : Tout sélectionner
Procedure timerAnim(frameNb)
; T est la variable globale que j'utilise en tant que timer pour la frame courante d'animation
; FrameU est aussi une variable gloable (un float)
; frameNb : c'est le nombre de frame pour ce timer
If T.l < ElapsedMilliseconds()+ 50
T = ElapsedMilliseconds()
FrameU + 1
EndIf
If FrameU > frameNb -1
FrameU = 0
EndIf
EndProcedure
Puis, j'ai cette procédure (toujours la même, mais je l'ai corrigée)
Code : Tout sélectionner
Procedure DisplayAnimsprite(idsprite,xx,yy,xprevious,yprevious,NumAnim,frameNb,frameCurrent,framedepart,mode.i=0)
; NumAnim = le numéro d'animation pour l'objet ou l'entité (mob, player.sort..). Par exemple 1 = marche, 2 = course, 3 =lance un sort, 4 = combat à l'épée..
; frameNb : le nombre d'image pour cette animation
; mode : si l'anim est jouée ou non
; framecurrent : c'est le numero de la frame courrante. ça ne marche pas.
; framedepart : c'est la frameU de départ, pour le moment je ne m'en sers pas, mais par la suite, j'en aurai besoin pour que l'animation débute en 0 à n'importe quelle frameU
frameActual = Round(FrameU,0) ; variable temporaire nécessaire pour convertir de float à integer (necessaire pour le modulo)
frameCurrent = frameActual % frameNb ; le modulo magique : on garde comme numero de frame ce qui reste :)
If mode = 1 ; si on a plusieurs images dans l'animation
If xprevious = xx And yprevious = yy ; ça, je pense l'enlever car c'est lié au déplacement.
DisplaySprite3D((idsprite+4),xx,yy)
ElseIf (xprevious <> xx Or yprevious <> yy)
DisplaySprite3D((idsprite)+frameCurrent,xx,yy)
EndIf
ElseIf mode = 0
DisplaySprite3D((idsprite),xx,yy)
EndIf
EndProcedure
Dans celle-ci, j'utilise un modulo pour récupérer la frame courrante pour mon animation, en fonction du nombre d'image de cette même animation
Voiloutch. pour le moment, j'ai testé et ça fonctionne bien.
J'ai testé avec un personnage (animation par évènement souris (clic and go)), un feu (animation en boucle constante) et des mobs (pas d'animation, mais changement d'image en fonction de la direction).
Je testerai avec d'autres éléments.
Bien sûr, il faut que les structures de mes entités sprites aient les paramètres suivants :
Code : Tout sélectionner
structure sprites
NumAnim
frameNb
frameCurrent
framedepart
; autres paramètres...
endstructure
Du coup, je peux utiliser n'importe quelles structures avec cette procédure

.
Si besoin, je peux faire un petit exemple simple pour voir comment ça marche, mais c'est pas mal, ça évite d'utiliser de slistes de timer(), même si l'idée des timers est sympa aussi car très fonctionnel

.
En tout cas, merci à vous tous pour l'aide

.