Hello tout le monde, j´ai un peu honte de poster ca mais je vais pas rester bloqué pour si peu ![]()
Mon problème :
Le déplacement de mon personnage sur une tile based map en 3D isometrique fonctionne, il se deplace tile par tile, impecable.
J´essaie maintenant de lui faire faire un mouvement continu entre les tiles, pour cela j´ai une variable vitesse.
Mes tiles ont une largeur de 42.4 et une hauteur de 21.2
Voici le code, sans la syntaxe Actionscript et sans les elements qui n´ont rien a voir pour que tout le monde puisse suivre, correspondant au passage d´un tile à l´autre:
if ( x en tiles du personnage < x en tiles de la destination) {
deplacementx = 63.6/vitesse
} else {
if ( x en tiles du personnage>x en tiles de la destination) {
deplacementx = -(63.6/vitesse)
}
}
if ( y en tiles du personnage < y en tiles de la destination) {
deplacementy = 63.6/vitesse
} else {
if ( y en tiles du personnage > y en tiles de la destination) {
deplacementy = -(63.6/vitesse)
}
}
for ( pas=0; this.pas<vitesse; pas++) {
_x += ( (2/3)*deplacementx)+((1/3)-deplacementy);
_y += ( (2/3)*deplacementy)+((1/3)-deplacementx);
}
this.deplacementx = 0;
this.deplacementy = 0;
J´espere que c´est compréhensible pour tout le monde, le probleme c´est que le personnage bouge n´importe comment; si quelqu´un peut me dire pourquoi mon raisonnement est faux et m´en indiquer un plus juste ca serait très sympa; merci d´avance ![]()
Euh, à la fin faites comme si y´avait pas les this. ^^
De plus, fautes de frappe, ce n´est pas
_x += ( ( 2/3)*deplacementx)+((1/3)-deplacementy);
_y += ( ( 2/3)*deplacementy)+((1/3)-deplacementx);
mais
_x += ( ( 2/3)*deplacementx)+((1/3)*deplacementy);
_y += ( ( 2/3)*deplacementy)+((1/3)*deplacementx);
( y´a pas de faute dans le vrai code)
C´est un peu complexe tout ton bazar.
Pour resoudre ton probleme, il faut le simplifier.
1/ Tu gere tout ton jeu dans un repere 2D vu du dessus. Tu fais tes deplacement, tes vitesses, etc . ..
2/ Tu te fais une fonction qui converti tes coordonnées dans ton repere 2D vers ton repere isometrique/ecran ( et cette fonctione ne fait rien de plus).
Ainsi tu as deux petits problemes, qui sont bien plus simples a resoudre que ton gros probleme de depart.
humm....
en gros je te conseille tout simplement de soit faire une class vector2D, qui contiendra ta vitesse.
tu sais faire une class
ensuite tu creer ton vecteur avec la difference entre les coordonnées d´arrivé et de depart
et tu as juste a chaque boucle de ton programme a ajouter ton vecteur a la position du perso
c´est super simple ^^
Euh, c´est bizarre, j´ai refait mon code sur le meme principe mais avec quelques modifs ; il marche ( le perso suit le bon trajet) mais la boucle for doit passer trop vite et on percoit pas le mouvement enter les cases.
Je pense donc que je vais suivre ta methode...mais je ne sais pas créer une classe ![]()
oki pas de soucis tu creer un fichier action script dans nouveau et je te poste le code tu aura juste a faire copier coller
Merci ![]()
class Vector2d {
var x;
var y;
public function Vector2d(__x:Number, __y:Number) { // constructor
x = __x; y = __y; }
public function setParam(__x:Number, __y:Number) { // function set parameters
x = __x; y = __y; }
public function setParamV(v:Vector2d) { // function set parameters
x = v.x; y = v.y; }
public function addN(num:Number) { // function to add a number
x += num; y += num; }
public function addV(v:Vector2d) { // function to add a vector2d
x += v.x; y += v.y; }
public function mulN(num:Number) { // function to multiply a number
x *= num; y *= num; }
public function mulV(v:Vector2d) { // function to multiply a vector2d
x *= v.x; y *= v.y; }
public function divN(num:Number) { // function to divide a number
x / = num; y / = num; }
public function divV(v:Vector2d) { // function to divide a vector2d
x / = v.x; y / = v.y; }
public function lenght():Number { // retrieve vector´s lenght
return Math.sqrt(x*x + y*y); }
public function norm() { // normalize the vector
x / = this.lenght(); y / = this.lenght(); }
public function trace() { // trace value on the screen
var texte:String = new String("x : " +x+" , y : " +y);
trace(texte); }
};
C´est tres joli lol, et euh..apres? ( je me doute bien que tu es en train de l´ecrire)
maintenant tu renomme ton fichier Vector2d.as
et dans la premiere frame de l´image la plus haute dans ton ficher fla, tu mes import Vector2d;
maintenant pour creer un object de type vector tu fais:
var monVecteur:Vector2d;
monVecteur = new Vector2d(x,y);
Ok merci, mais comment j´explique a mon clip de suivre ce vecteur? je mets quoi dans x et y? etc etc...
désolé j´oubliais que tu connaissais pas les vecteur.
en fait tout object sur un plan 2d peux se voir modelisé sous forme de vecteur2D.
un pour sa position en x,y
un autre pour sa vitesse
ensuite tu as juste a utiliser la fonction addV de la class Vector2d pour additionner les deux vecteurs.
ca donnerais
la nouvelle position:
vecteurPos.addV(vecteurVitesse);
ensuite tu as juste a faire correspondre les coordonnée avec le clip
monClip._x = vecteurPos.x;
monClip._y = vecteurPos.y;
Si tu veux reduire l´interval de deplacement a chaque frame, il te suffi de multiplier ton vecteur vitesse par un nombre inferieru a 1.
vecteurVitesse.mulN(number);
Merci je vais essayer ( si si, je suis au lycée, je connais un minimum les vecteurs..mais pas en flash) ![]()
Bon je ne comprends pas ton code donc je me suis cntenté de copier coller et d´essayer de bidouiller mais ca ne marche pas.
l´import se passe bien mais le personnage ne bouge pas, j´ai fait ce code et quelques variantes:
var vecteurdedeplacement:Vector2d;
vecteurdedeplacement = new Vector2d(42.4, 21.2);
vecteurPos.addV(1);
this._x = vecteurPos.x;
this._y = vecteurPos.y;
Aucune de me t´entatives n´a marché, si tu pouvais me dire ou je dois rentrer des données et lesquelles ca m´aiderait beaucoup...merci d´avance ![]()
![]()
Ou c´est qu´il est TomtomClancy?
Je suis désolé de squatter la premiere page mais parfois il fau bien ![]()
je suis la Ruffi vien de me prevenir que tu me cherchais, je lit tes post et je reponds
je suis pas expert en flash ni en 3D iso, mais il me semble que ton probleme est juste de faire une interpolation entre 2 case.
Pour ça, tu fait un truc du genre
float interpolation(float start, float end, float factor)
{
if(factor<=0) return start;
if(factor>=1) return end;
return ( start/factor)+ ( end/(1-factor)) ;
}
( à tester)
Apres, tu adapte ce principe à ta classe vecteur.
Tu fait bouger le factor de 0 ( point de depart) à 1 ( point d´arivé) afin de calculer les diferentes postions de ton personage.
oki.
Aller programmeur en herbe je vais t´expliquer comment utiliser la class que je t´ai filé.
d´abors, j´ai nomé les fonctions de la maniere suivante.
. ..N ( example addN, mulN) pour effectuer l´operation avec un nombre.
. ..V ( example addV, mulV) pour effectuer l´operation avec un autre vecteur.
en regardant vite fait tu vois ce que chaque fonction doit recevoir comme paramettre, en plus c´est meme commenté, t´abuses.
bon maintenant tu creer un vecteur position et un vecteur vitesse.
var position:Vector2d;
var velocity:Vector2d;
jusque la ca va.
maintenant dans ton vecteur position tu mes la position en x et en y de ton perso.
position = new Vector2d(posX, posY);
la dans ton vecteur de position se trouve les coordonnée de ton perso, pour faire se deplacer ton perso en fonction des valeur contenu dans ton vecteur tu fait juste:
monCLip._x = position.x
monClip._y = position.y
maintenant ton clip se placera a l´endroit convenu(mais noubli pas de faire cette affectation a chaque fois que tu modifie ton vecteur, sinon le clip ne bougera pas).
pour le moment pas de mouvement normal t´as pas de vitesse.
pour la vitesse:
interpolation des coordonnée entre de point de depart et le point d´arrivé.
velocity.setParam(tile._x-position.x, tile._y-position.y).
Dans ton vecteur se trouve maintenant la distance entre ton tile et ta position.
En additionnant velocity a position:
position.addV(velocity)
et evidement tu oublie pas de remmettre ta position a ton perso.
monClip._x = position.x;
monClip._y = position.y;
Tu verras ton personnage directement sur le tile.
maintenant si tu veux effectuer le deplacement en plusieurs etape, il te suffi de diviser ton vecteur vitesse comme ceci.
velocity.divN(10);
De cette maniere ton personnage effectuera son deplacement en 10 fois.
pour resumer:
dans ta fonction qui boucle en permanence, l´equivalent du idle, tu fais appel a une fonction update de ton personnage.
dans la fonction update tu effectue ton deplacement:
function update() {
position.addV(velocity);
monClip._x = position.x;
monClip._y = position.y;
}
maintenant si tu veux que ton perso bouge tu lui mes un vitesse non null.
tu peux tester en associant a tes touche clavier une vitesse, sachant que:
vecteur(0,0) ne bouge pas
vecteur(1,0) 1 vers la droite
vecteur(-1,0) 1 vers la gauche
vecteur(0,1) 1 vers le bas
vecteur(0,-1) 1 vers le haut
vecteur(1,1) 1 vers la diagonal droite, bas
vecteur(1,-1) 1 vers la diagonal droite, haut
vecteur(-1,1) 1 vers le diagonal gauche, bas
vecteur(-1,-1) 1 vers le diagonal gauche,haut
j´espere que tu as mieu compris la maniere dont ca fonctionne
Oui, je pense avoir compris, merci beaucoup
Y´a plus qu´a tester ![]()