CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Compter les pixels en 3D isometrique....

fil_razorback
fil_razorback
Niveau 10
01 mai 2005 à 12:09:01

Hello tout le monde, j´ai un peu honte de poster ca mais je vais pas rester bloqué pour si peu :sarcastic:
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 :-)

fil_razorback
fil_razorback
Niveau 10
01 mai 2005 à 12:11:53

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)

Lapintade
Lapintade
Niveau 30
01 mai 2005 à 12:57:54

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.

tomtomclancy
tomtomclancy
Niveau 9
01 mai 2005 à 15:21:14

humm....

en gros je te conseille tout simplement de soit faire une class vector2D, qui contiendra ta vitesse.

tu sais faire une class :question:

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 ^^

fil_razorback
fil_razorback
Niveau 10
01 mai 2005 à 15:28:29

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 :-)

tomtomclancy
tomtomclancy
Niveau 9
01 mai 2005 à 15:31:00

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

fil_razorback
fil_razorback
Niveau 10
01 mai 2005 à 15:31:30

Merci :-)

tomtomclancy
tomtomclancy
Niveau 9
01 mai 2005 à 15:33:59

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); }
};

fil_razorback
fil_razorback
Niveau 10
01 mai 2005 à 15:37:59

C´est tres joli lol, et euh..apres? ( je me doute bien que tu es en train de l´ecrire)

tomtomclancy
tomtomclancy
Niveau 9
01 mai 2005 à 15:38:07

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);

fil_razorback
fil_razorback
Niveau 10
01 mai 2005 à 15:43:01

Ok merci, mais comment j´explique a mon clip de suivre ce vecteur? je mets quoi dans x et y? etc etc...

tomtomclancy
tomtomclancy
Niveau 9
01 mai 2005 à 15:55:34

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.

:d)un pour sa position en x,y
:d)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:
:d)vecteurPos.addV(vecteurVitesse);

ensuite tu as juste a faire correspondre les coordonnée avec le clip

:d)monClip._x = vecteurPos.x;
:d)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.
:d)vecteurVitesse.mulN(number);

fil_razorback
fil_razorback
Niveau 10
01 mai 2005 à 16:24:39

Merci je vais essayer ( si si, je suis au lycée, je connais un minimum les vecteurs..mais pas en flash) :)

fil_razorback
fil_razorback
Niveau 10
01 mai 2005 à 18:13:59

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 :-)

fil_razorback
fil_razorback
Niveau 10
02 mai 2005 à 10:08:33

:up:
Ou c´est qu´il est TomtomClancy?

fil_razorback
fil_razorback
Niveau 10
02 mai 2005 à 20:12:11

Je suis désolé de squatter la premiere page mais parfois il fau bien :(

tomtomclancy
tomtomclancy
Niveau 9
02 mai 2005 à 20:54:51

je suis la Ruffi vien de me prevenir que tu me cherchais, je lit tes post et je reponds

Ruffi
Ruffi
Niveau 9
02 mai 2005 à 21:06:13

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.

tomtomclancy
tomtomclancy
Niveau 9
02 mai 2005 à 21:21:36

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.
:d) . ..N ( example addN, mulN) pour effectuer l´operation avec un nombre.
:d) . ..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:
:d) monCLip._x = position.x
:d) 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:
:d) interpolation des coordonnée entre de point de depart et le point d´arrivé.

:d) 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:
:d) 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.
:d) velocity.divN(10);
De cette maniere ton personnage effectuera son deplacement en 10 fois.

pour resumer:
:d) dans ta fonction qui boucle en permanence, l´equivalent du idle, tu fais appel a une fonction update de ton personnage.

:d) 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

fil_razorback
fil_razorback
Niveau 10
03 mai 2005 à 10:48:59

Oui, je pense avoir compris, merci beaucoup :)

Y´a plus qu´a tester :-)

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment