J´ai tout compris, j´ai du un peu bidouiller ( des details) et au final ca marche impec pour le deplacement, sauf que...
Je veux un deplacement en plusieurs etapes donc je divise velocity par exemple par 5 puis j´effectue 5 fois le deplacement.
ce qui donne ceci:
for ( a=0; a<=5; a++) {
position.addV(velocity);
this._x = position.x;
this._y = position.y;
}
Le déplacement se fait mais quel que soit le nombre que je mets ce n´est toujours pas progressif. A mon avis, il enchaine trop vite les positions successvies et du coup on le voit d´un milieu de tile a l´autre ![]()
Retout à la case départ en quelque sorte.
Ps: Merci Ruffi pour le message ![]()
non en fait c´est parce que tu fais toute tes operation dans le for sans reforcer l´affichage, donc il va t´afficher l´imaghe avant de rentrer dans le for, puis l´image suivante quand il sortira du for.
alors meme si tu mes 100 iterations, tu le verra pas se deplacer.
la meilleur solution est la suivante.
tu creer une fonction update pour ton perso ou tu lui mes le code qui est dans ton for.
maintenant sur clip du personnage tu mes le code suivant
onClipEvent(enterFrame) {
update();
}
la tout au long de ton programme il fera la mise a jour de ton deplacement.
Maintenant il ne te reste qu´a rajouter les test quand il arrive a destination.
if(il est arrivé sur la tile) {
velocity.setParam(0,0);
}
et la tu oubli ton for et tu aura ton animation nikel ![]()
Si si, la position est mise à jour :
position = new Vector2d();
velocity = new Vector2d();
position.setParam(this._x, this._y);
velocity.setParam(((tileW/2)*(personnages[this.ID]
[4]-personnages[this.ID][5]))-(position.x),
((tileH/2)*(personnages[this.ID][4]+personnages[th
is.ID][5]))-(position.y));
velocity.divN(5);
for ( a=0; a<=5; a++) {
& position.addV(velocity);
& this._x = position.x;
& this._y = position.y;
}
Et a priori je peux pas faire ton truc avec onenterframe vu que je suis deja basé sur onenterframe et qu´il est sensé faire un pas par " passage"..
ca m´obligerait a changer tout mon code qui commence deja a etre assez long...
arf t´as pas compris.
dans ton for tu effectue de suite 5 fois la meme operation.
au moment de la compilation il va te mettre tes 5 operation les une a la suite de autre, en gros c´est comme si il t´en fesais qu´un seul.
ce que je veux dire c´est ne mes pas ton deplacement dans une boucle.
justement si tu es deja basé sur un enterFrame, rajoute juste un appel a ta fonction update.
![]()
Ca va pourrir tout mon systeme...a la in du code onenterframe il doit imperativement aoir fini son pas ![]()
dans ce cas recherche les fonction qui force un reaffichage de la scene
pour le mettre a l´interieur de ton for
Beh, y´a pas tout simplement un moyen de lui dire d´attendre quelques dixiemes de seoncdes? ( pas set interval si possible)
non flash ne fonctionne pas comme ca.
lui il t´affiche une image a chaque frame, un point c´est tout
donc si tu veux faire tout ton deplacement dans un meme frame, ben il arrivera au point d´arrivé a la framme suivante, c´est pas plus compliqué...
et oui je sais ca t´arranges pas ![]()
euh...pouet.
J´y reflechirais ^^
Merci de l´aide en tous cas ![]()
et a part ce probleme ca avance comment ton jeux ?
screen shot ^^
J´avance lentement a cause de ce pc de m*** qui plante toute les 5 minutes mais j´ai fini presque tous les tiles de la deuxieme map, pour la prog vous pouvez suivre au fil des topics d´aide lol
Recapitulatif du probleme ( à l´intention de luxregina ou toute autre flasheur n´ayant pas suivi passant par la mais je vois pas qui ca pourrait etre ) :
J´ai les coordonées d´un clip personnage.
J´ai les coordonnées de sa destination.
Je veux qu´il s´y rende progressivement, comme une interpolation de mouvement mais en AS, SANS utiliser onEnterFrame qui m´obligerait a revoir une grosse partie de mon code ( c´est a dire que le personnage a une grosse fonction onEnterFrame qui a entre autres pour but de le deplacer d´un pas, si necessaire)
Et
d´avance
pas de lux ni de Tomtom en vue ![]()
si si je suis la... mais....
pour mieu t´aider il faudrait que je vois le code dans ta fonction onClipEvent(enterFrame).
pour savoir si il serais ou non possible de faire ton deplacement la.
Je seconde Tomtom > A l´aveuglette, c´est pas evident de te dire ce qui ne vas pas, surtout si tu ne veux pas toucher au reste de tes fonctions . ..
De plus, le deplacement " smoothe" va te poser plein d´autres problemes, comme le Z-sorting par tiles, et la gestion de tes collisions - C´est d´ailleurs surtout au niveau de la gestion des collisions que cela va te faire mal : un gestion du type " tile occupee = collision On" a l´avantage d´etre rapide et d´user peu de ressources - ton systeme smoothe va etre autrement plus chaud, et processeur intensif . .. cela va devenir de plus en plus compliquer de pouvoir t´aider sans analyser tout le code derriere, et je ne suis pas sur d´avoir le temps pour cela ( sans compter les capacites, si cela devient tres complique )
Juste a titre d´indication : j´avais tente le systeme " smoothe" pour Two Kingdoms . ..
Deplacement smooth =
- Scrolling smooth
- Gestion des collisions player/environnement plus complexe
- Gestion des collisions NPCs/environnement plus complexe
- Gestion des collisions player/NPCs plus complexe
Deplacement Tile par tile =
- Scrolling plus simple
- Gestion des collisions : une tile occupee ( decors, joueur, NPC ) devient non walkable . .. fini
. ..
Tout ce qui se rattache au deplacement Smooth fesait tellement tirer la langue au proc, que je n´ai pas vraiment eut le choix . ..
Maintenant, les ordis sont plus puissants, certes, mais tu n´es pas sorti de l´auberge, surtout si tu as du scrolling . ..
Tout ca est déjà " contourné":
-Scrolling déjà fait et marche impec
-Pour la gestion de collisions je suis sur le systeme tile occupé/tile libre
-Le z sorting ne s´applique qu´aux personnages et aux cristaux ( 8 clips au total), les tiles ne se debordent pas les uns sur les autres
( sauf un ou deux mais ils sont entourés de zones non praticables).
Bon alors je poste mon code avec commentaires, ca vaudra mieux : c´est la partie qui concerne le placement de personnages et tout ce qui va avec.
Je précise que j´ai un array personnages
qui s´organise comme ca:
personnages = [personnage1],[personnage2],....
et que dans " personnage 1", il y a toutes les stats du personnage 1 notées comme ceci
personnage 1 = xactuel, yactuel, xdestination, y destination, xtileoualler, ytileoualler, vitesse ( j´ai pas encore mis le reste).
la destination est le tile ou le perso veut se rendre ( celui ou le joueur a cliqué) et le tileoualler est la case ou le pathfinder indique de se rendre.
/ /On place les persos sur la map
for ( testdespersos=0; testdespersos<6; testdespersos++) {
personame = " player"+testdespersos;
if ( i == personnages[testdespersos][1] && j == personnages[testdespersos][0]) {
this.clip.attachMovie(personame, personame, mapWidth*mapHeight+testdespersos);
this.clip[personame]._x = ( tileW/2)*(j-i);
this.clip[personame]._y = ( tileH/2)*(j+i);
this.clip[personame].ID = testdespersos;
this.clip[personame].gotoAndStop(1);
/ /Le gros on enter frame
this.clip[personame].onEnterFrame = function() {
/ /Si le personnage n´est pas a sa destination
if ( (personnages[this.ID][2] ! = personnages[this.ID][0]) or ( personnages[this.ID][3] ! = personnages[this.ID][1])) {
this.coords = [personnages[this.ID][0], personnages[this.ID][1]];
this.destination = [personnages[this.ID][2], personnages[this.ID][3]];
pathfinder(this.coords, this.destination, this.ID);
/ /tourne le personnage vers la ou il va marcher ( j´aurai du mettre des else if, je corrigerai)
if ( personnages[this.ID][0]<personnages[this.ID][4]) {
this.gotoAndStop(1);
} else {
if ( personnages[this.ID][0]>personnages[this.ID][4]) {
this.gotoAndStop(3);
}
}
if ( personnages[this.ID][1]<personnages[this.ID][5]) {
this.gotoAndStop(2);
} else {
if ( personnages[this.ID][1]>personnages[this.ID][5]) {
this.gotoAndStop(4);
}
}
/ /ICI on lui fait faire son animation de pas fluide.
/ /Ces deux lignes sont en commentaires, c´est pour gérer le deplacement non fluide, d´un tile a l´aute
/ /this._x =
(tileW/2)*(personnages[this.ID][4]-personnages[thi
s.ID][5]);
/ /this._y =
(tileH/2)*(personnages[this.ID][4]+personnages[thi
s.ID][5]);
/ /on update ses coordonnées
personnages[this.ID][0] = personnages[this.ID][4];
personnages[this.ID][1] = personnages[this.ID][5];
}
};
/ /On selectionne le perso en cliquant dessus
this.clip[personame].onRelease = function() {
personnageselectionne = this.ID;
};
}
}
Voilà vous savez tout, merci d´avance ![]()
![]()
![]()