( Si si y´en a qui font de la 3d avec flash)
Hum, hello tout le monde j´ai commencé hier un moteur de jeu de plateforme en flash et je suis victime d´un vilain bug:
Le heros ( Philippe de Kolimine) ne s´affiche pas correctement quand on le balade sur de petites plateformes ( il s´affiche trop haut).
Je poste mon . fla et mon . swf en esperant de l´aide : j´ai beau chercher je comprend pas...
Pour ceux qui ont flash et qui veulent m´aider ( le code est à peu près propre et commenté. 285 lignes commentaires inclus):
http://darkgimpy.free.fr/Phen/v1.fla
Pour ceux qui veulent voir le probleme par eux meme:
http://darkgimpy.free.fr/Phen/v1.swf
Il est possible que votre navigateur affiche ça un peu n´importe comment ( zoomé, bords qui depassent...) vu que j´ai pas encore publié le fichier ni fait de page web pour l´afficher correctment.
Merci d´avance à tous
Déplcement : touches directionnelles
Hum en effet certaines fois il retombe parfaitement dessus et d´autres fois il monte trop haut. Simple rectification car il faut dire quand même que des fois ça fonctionne.
Effectivement et je n´arrive pas à determiner dans quelles circonstances il tombe correctement ou pas donc pas moyen de trouver l´erreur. ![]()
Ah oui j´oubliais, inutile d´essayer d´emprunter le petit passage à droite il est trop etroit
C´est parce que je vais rajouter une touche pour glisser par terre ( du coup on pourra descendre mais pas remonter par la ^^)
Nyu je sais pas ouvrir les fichiers FLA xD
Tu veux pas waller la partie du code qui gère les collisions ? ![]()
Normal il faut flash pour les lire.
Le code qui gere les collisions verticales c´est ca ( je sais pas ou waller pour virer les espaces):
function colitestV() {
//une colibox par iteration
for ( numerodelacoliboxVtest=0; numerodelacoliboxVtest<_root.mapnbrcolibox; numerodelacoliboxVtest++) {
//attribue les coordonnées de la colibox grace au pointeur
colitestVXg = _root.mapcolibox[numerodelacoliboxVtest][0];
colitestVXd = _root.mapcolibox[numerodelacoliboxVtest][1];
colitestVYh = _root.mapcolibox[numerodelacoliboxVtest][2];
colitestVYb = _root.mapcolibox[numerodelacoliboxVtest][3];
colitestVepaisseur = colitestVYb-colitestVYh;
//si les X sont dans la colibox
if ( (_root.philmapX>colitestVXg and _root.philmapX<colitestVXd)) {
//si veut rentrer par le bas d´une plateforme epaisse
if ( ((_root.philmapY-33)>=colitestVYb) and ( (_root.philmapYtente-33)<colitestVYb) and ( colitestVepaisseur>_root.epaisseurpermeable)) {
_root.philVy / = 3;
_root.colitestVresultat = 1;
}
//Si veut rentrer par le haut d´une plateforme : touche le sol
if ( _root.philmapY<=colitestVYh and _root.philmapYtente>=colitestVYh) {
_root.colitestVresultat = 1;
_root.philmapY = colitestVYh;
_root.philVy = 0;
//si c´est larrivee dun saut
if ( _root.philaction == 10 or _root.philaction == 11) {
_root.philnouvelleaction = 8;
_root.phil.stepsound();
}
}
}
}
//si 0 collisions
if ( _root.colitestVresultat == 0) {
//si veut sortir de l´ecran par le haut
if ( _root.philmapYtente<0) {
_root.colitestVresultat = 1;
}
//si veut sortir de l´ecran par le bas
if ( _root.philmapYtente>=_root.mapsizeY) {
_root.colitestVresultat = 1;
_root.philVy = 0;
_root.philnouvelleaction = 8;
_root.philmapY = _root.mapsizeY;
}
}
}
Bon quelques initiales:
Xg = Xgauche
Xd = Xdroite
Yh = Yhaut
Yb = Ybas
Le reste me parait a peu pres clair, si vous avez une question ben je vous ecoute ![]()
Remarque je pense pas que l´erreur soit située ici...(par contre j´e sais pas ou elle peut etre).
J´i ou blié de preciser:
philmapY c´est la coordonnée du pied des personnages.
Et donc philmapY-33 c´est sa tete ![]()
a mon avis, le probleme vient plutot du scrolling vertical que de la gestion des collisions...
C´est ce que j´aurai dit aussi mais je l´ai relu ce matin sans trouver d´erreur :Je viens parcontre de trouver la preuve que ce n´est pas dans les colisions que y´a l´erreur :
j´ai ajouté un trace de la position Y du heros quand il detecte une colision et, meme quand l´affichage est mauvais la coordonnée est bonne.
Je vous poste le code du scrolling ( vertical + horizontal et avant plan + arriere plan tant qu´a faire):
/ /SCROLLING
function scrolling() {
// Standard
_root.mapX = _root.mapsizeX/2-_root.philmapX+200;
_root.mapY = _root.mapsizeY/2-_root.philmapY+150;
//_root.philX = _root.mapsizeX/2;
//_root.philY = _root.mapsizeY/2;
// si perso Bord gauche
if ( _root.philmapX<200) {
_root.philX = _root.philmapX;
_root.mapX = _root.mapsizeX/2;
} else {
// si perso Bord droit
if ( _root.philmapX>_root.mapsizeX-200) {
_root.philX = _root.philmapX+400-_root.mapsizeX;
_root.mapX = _root.mapsizeX/2-_root.mapsizeX+400;
}
}
// si perso Bord haut
if ( _root.philmapY<150) {
_root.philY = _root.philmapY;
_root.mapY = _root.mapsizeY/2;
} else {
// si perso Bord bas
if ( _root.philmapY>_root.mapsizeY-150) {
_root.philY = _root.philmapY+300-_root.mapsizeY;
_root.mapY = _root.mapsizeY/2-_root.mapsizeY+300;
}
}
// affiche l´arriere plan
if ( premieraffichage ! = 1) {
_root.mapbottomfichier = _root.mapnom+"-bottom";
_root.attachMovie(_root.mapbottomfichier, ´mapbottom´, 20);
_root.mapbottom._x = mapX;
_root.mapbottom._y = mapY;
_root.mapbottom._visible = true;
premieraffichage = 1;
} else {
_root.mapbottom._x -= ( _root.maptop._x-_root.mapX)/6;
_root.mapbottom._y += ( _root.mapY-_root.maptop._y)/6;
}
// affiche la map
_root.maptopfichier = _root.mapnom+"-top";
_root.attachMovie(_root.maptopfichier, ´maptop´, 25);
_root.maptop._x = _root.mapX;
_root.maptop._y = _root.mapY;
_root.maptop._visible = true;
}
En esperant que c´est comprehensible, je vais dejeuner ![]()
c´est probablement ici :
/ / si perso Bord haut
if ( _root.philmapY<150) {
_root.philY = _root.philmapY;
_root.mapY = _root.mapsizeY/2;
} else {
/ / si perso Bord bas
if ( _root.philmapY>_root.mapsizeY-150) {
_root.philY = _root.philmapY+300-_root.mapsizeY;
_root.mapY = _root.mapsizeY/2-_root.mapsizeY+300;
}
}
tu peux nous expliquer en détail ? ![]()
[g l´impression que dans les commentaires, t´as inversé haut et bas]
bah oué, je connais pas l´actionscript meme si c´est compréhensible, je sais pas a quoi correspondent la classe " _root" et les différentes variables
Bon j´ai du mal avec ton code alors parlons algorithmique
Quand le mec arrive en tombant par le dessus d´une plate-forme, qu´est-ce que tu fais ?
1) Testes-tu la collision avant ou après avoir bougé le personnage ?
2) Que fais-tu quand collision il y aura/a ( selon la question 1) ?
et l´origine des axes elle se trouve en haut a gauche?
[vais déjeuner :D ]
1) Testes-tu la collision avant ou après avoir bougé le personnage ?
Avant ![]()
2) Que fais-tu quand collision il y aura/a ( selon la question 1) ?
( aura) :
-on ne fait pas le déplacement demandé
-selon la nature de la colision on fait des details en plus ( bruit du mec qui retombe par terre, diminution de la vitesse quand il se prend un plafond...)
" et l´origine des axes elle se trouve en haut a gauche? "
Oui
tu peux nous expliquer en détail ?
C´est une formule de Ptival ![]()
[g l´impression que dans les commentaires, t´as inversé haut et bas]
C´est possible
bah oué, je connais pas l´actionscript meme si c´est compréhensible, je sais pas a quoi correspondent la classe " _root" et les différentes variables
_root faites comme si c´etait pas là ( c´est pour pas paumer mes variables)
Les noms des variables me paraissent explicites > _<, lesquelles tu comprends pas?
Tu affiches bien la carte SELON la position du personnage APRES avoir déplacé complètement le personnage ?
Sinon, tu es sûr que tes rectangles de collisions sont bien définis ?
Hihi, j´ai du mal à trouver l´erreur quand c´est pas moi qui ait codé l´truc ![]()
la différence entre phil et philmap ? ![]()
phil c´est la coordonée du sprite par rapport au coin haut gauche de l´ecran et philmap c´est par rapport au coin haut gauche de la map.
rohlala... j´arrive vraiment pas a saisir la maniere selon laquelle tu procède ![]()
( ca doit etre moi)
j´espere que tu trouveras la réponse quand meme ; )
Ben c´est Ptival qui m´avait donné la formule ![]()
Youhou c´est reglé !
La formule etait bonne, j´ai trouvé la solution cette nuit mais je l´ai mal écrite ce matin et elle est restée en commentaire :
/ /_root.philX = _root.mapsizeX/2;
/ /_root.philY = _root.mapsizeY/2;
d ![]()
_root.philX = 200;
_root.philY = 150;
Fallait remettre le heros au milieu de l´ecran quand on est pas dans un des bords
Prochain ajout, des items à collecter ^^
lol