| | Script de marche incomprit | |
|
| Auteur | Message |
|---|
jerelink Discret


Nombre de messages: 115 Age: 18 Programme utilisé (Gm/RmXp/...): game maker Date d'inscription: 14/01/2006
 | Sujet: Script de marche incomprit Jeu 1 Oct - 17:05 | |
| Bonjour a tous =p, je vient car j'ai un petit problème, sa va maintenant faire 1 mois que je cherche sans en trouvé la cause  . Ya pas mal de temps j'ai trouvé un script de marche pour un jeu type zelda, il marche super bien, seulement quelque chose "bug" je dirait. Lors des collisions sur les pentes en diagonal en arrivant de gauche ou de droite sa va, mais en venant de haut ou bas, là, le perso va trop vite sur la collision o_o..... J'ai pensé a un bug, un ami ayant un bien meilleur niveau que moi a pensé a sa aussi. Sans tardé, voici le code (j'ai laissé les com expret) : | Spoiler: | | | | Code: | if global.walk=1 { movestep=0 movespeed=3
var fholdd, fholdu, fholdl, fholdr, cc;
// Check keys holdd=keyboard_check(vk_down) holdu=keyboard_check(vk_up) holdl=keyboard_check(vk_left) holdr=keyboard_check(vk_right) // Cancel opposing keys if holdu && holdd { holdu=0 holdd=0 } if holdl && holdr { holdl=0 holdr=0 }
// This is where you may want to add other conditionals which keep you from moving, // such as if you are using an item, or you are in a menu. // Just add the conditions to the end of this next "if" line. // example: // if (holdd ||holdu || holdl || holdr) && !usingshield {
if (holdd ||holdu || holdl || holdr) && !usingsword{ // Change sprites if you haven't already if (!moving) { if (holdd) { sprite_index=Link_walk_down; global.facing="D" } else if (holdu) { sprite_index=Link_walk_up; global.facing="U" } if (holdl) { sprite_index=Link_walk_left; global.facing="L" } else if (holdr) { sprite_index=Link_walk_right; global.facing="R" } } moving=1 // Sprite correction if (holdd && !holdl && !holdr) { sprite_index=Link_walk_down; global.facing="D" } else if (holdu && !holdl && !holdr) { sprite_index=Link_walk_up; global.facing="U" } else if (holdl && !holdd && !holdu) { sprite_index=Link_walk_left; global.facing="L" } else if (holdr && !holdd && !holdu) { sprite_index=Link_walk_right; global.facing="R" } if (holdd && holdl && sprite_index!=Link_walk_down && sprite_index!=Link_walk_left) { sprite_index=Link_walk_left; global.facing="L" } else if (holdd && holdr && sprite_index!=Link_walk_down && sprite_index!=Link_walk_right) { sprite_index=Link_walk_right; global.facing="R" } else if (holdu && holdl && sprite_index!=Link_walk_up && sprite_index!=Link_walk_left) { sprite_index=Link_walk_left; global.facing="L" } else if (holdu && holdr && sprite_index!=Link_walk_up && sprite_index!=Link_walk_right) { sprite_index=Link_walk_right; global.facing="R" } } else { moving=0 }
if (moving) { // Determine the delay between movement steps // (or how many times to move per step). if ((holdd || holdu) && (holdl || holdr)) { movestep+=(movespeed/sqrt(2)) } else { movestep+=movespeed } // Start doing the movement. while (movestep>=1) { movestep-=1 fholdd=0; fholdu=0; fholdl=0; fholdr=0; // Corner-cutting loop. // Feel free to change the initial "cc" variable for corner sensitivity. // Between 4 and 8 is recommended, use 0 for none. for (cc=8; cc>0; cc-=1; ) { if holdl { if !place_free(x-1,y) { if place_free(x-1,y-cc) && !(holdd || fholdd) { fholdu=1 } else if place_free(x-1,y+cc) && !(holdu || fholdu) { fholdd=1 } } } else if holdr { if !place_free(x+1,y) { if place_free(x+1,y-cc) && !(holdd || fholdd) { fholdu=1 } else if place_free(x+1,y+cc) && !(holdu || fholdu) { fholdd=1 } } } if holdu { if !place_free(x,y-1) { if place_free(x-cc,y-1) && !(holdr || fholdr) { fholdl=1} else if place_free(x+cc,y-1) && !(holdl || fholdl) { fholdr=1 } } } else if holdd { if !place_free(x,y+1) { if place_free(x-cc,y+1) && !(holdr || fholdr) { fholdl=1 } else if place_free(x+cc,y+1) && !(holdl || fholdl) { fholdr=1 } } } } // End corner-cutting loop. // Determine the movement direction, and move. xstep=(holdr || fholdr)-(holdl || fholdl) ystep=(holdd || fholdd)-(holdu || fholdu) if (place_free(x+xstep,y)) { x+=xstep } if (place_free(x,y+ystep)) { y+=ystep } } } else { // Get the right sprite when you stop moving. switch (sprite_index) { case Link_walk_down: sprite_index=Link_stop_down; break; case Link_walk_up: sprite_index=Link_stop_up; break; case Link_walk_left: sprite_index=Link_stop_left; break; case Link_walk_right: sprite_index=Link_stop_right; break; } movestep=0 }
} // end of script |
|
Vous voyez la boucle for ?, c' est ici que sa se passe, la première condition, a l'interieur sa verifie que "si il y a de la place ici alors sa le deplace sinon on essaie de l'autre coté." Sa c' est pour left et right. La deuxieme plus bas fait la même chose mais pour haut et bas, seulement, étrangement le perso se déplace plus vite oO. Je remercie la personne qui résout ce casse tête sa serait vraiment super ! Merci et conne journée  |
|
 | |
Xierra54 Admin - .: el traductor :.


Nombre de messages: 8504 Age: 50 Programme utilisé (Gm/RmXp/...): GM (6.1 et 7 enregistrées), Purebasic (démo) Etudes: Supérieures Loisirs: ordinateur Date d'inscription: 13/08/2005
 | Sujet: Re: Script de marche incomprit Sam 24 Oct - 14:06 | |
| Personne ne souhaite répondre à Jerelink ? PS : ayant arrêté GM depuis longtemps, je n'ai plus le niveau nécessaire pour remédier au souci de Jerelink. |
|
 | |
blblxy Connaisseur


Nombre de messages: 385 Age: 14 Programme utilisé (Gm/RmXp/...): Game Maker 7 Pro Etudes: 3ème Date d'inscription: 03/03/2009
 | Sujet: Re: Script de marche incomprit Sam 24 Oct - 15:06 | |
| | Xierra54 a écrit: | Personne ne souhaite répondre à Jerelink ?
|
j'aimerais bien mais je n'ai pas le niveau requis pour trouver la solution à la réponse |
|
 | |
robinlife Connaisseur


Nombre de messages: 323 Age: 11 Programme utilisé (Gm/RmXp/...): GM 7 Loisirs: tous ce qui est bien(chuis un boss pour dessiner les mangas ) Date d'inscription: 24/06/2009
 | Sujet: Re: Script de marche incomprit Sam 24 Oct - 16:36 | |
| |
|
 | |
Fireranger Possedé par Mark Overmars


Nombre de messages: 1360 Age: 16 Programme utilisé (Gm/RmXp/...): Game Maker 7 PRO, Visual Basic 9.0, Visual C++ et Code::Blocks Date d'inscription: 22/11/2007
 | Sujet: Re: Script de marche incomprit Sam 24 Oct - 19:26 | |
| J'ai vérifié le script. Je n'ai pas trouvé quoi que ce soit d'anormal, sinon quelques optimisations qui peuvent être faites. Quelques conseils, réduit la valeur de cc (ln 27, for), remplace /sqrt(2) par *0.7071 (ln 110, movestep), etc. Sinon, pour ton problème de base, qu'est-ce que ça fait au juste ? La partie qui te dérange dans la boucle for fait ceci : -si on ne peut pas aller à la position souhaitée; -on regarde si on peut aller à cc en haut ou en bas; -sinon, on réduit cc et on recommence Et ça pour gauche/droite aussi. Ta room est elle étirée, joues-tu en plein écran ? |
|
 | |
playboy Timide


Nombre de messages: 25 Programme utilisé (Gm/RmXp/...): GM7.0 (pro) Etudes: Université Loisirs: Gamemaker Date d'inscription: 11/09/2009
 | Sujet: Re: Script de marche incomprit Dim 25 Oct - 0:46 | |
| Hooo il a pas mis résolu ? Dès qu'il a posé la question je l'ai contacté par MP pour lui proposer mon aide  Il en est ressorti après 2 heures que j'ai trouvé la ligne incriminée et qui résout bien le soucis  Donc ca date en faite la réponse mais je la remet ici  Elle est au niveau du : | Code: | xstep=(holdr || fholdr)-(holdl || fholdl) ystep=(holdd || fholdd)-(holdu || fholdu) if (place_free(x+xstep,y)) { x+=xstep } if (place_free(x,y+ystep)) { y+=ystep } |
Ca regarde sur les Y après avoir fait la modifications des X ce qui n'est pas logique puisque la vérifications doit se faire en même temps ! Cela donne en correction :
| Code: | xstep=(holdr || fholdr)-(holdl || fholdl) ystep=(holdd || fholdd)-(holdu || fholdu) if (place_free(x+xstep,y)) { x+=xstep } if (place_free(x-xstep,y+ystep)) { y+=ystep } |
Voila 
Sinon Moi par contre j'ai comme avis que faire une boucle de 8 n'avais pas grand intérêt mais si vous arrivez à me prouvez le contraire. Sinon c'est vrai que ce script est beau Très très sympa et cool ! Chapeau à celui qui l'a sorti !_________________ [Démo du RPG (30 Juin 2009) = Aeris] ------------------ [Jeux Finis/Mon topic = Laguna]  
Dernière édition par playboy le Dim 25 Oct - 11:14, édité 2 fois |
|
 | |
Fireranger Possedé par Mark Overmars


Nombre de messages: 1360 Age: 16 Programme utilisé (Gm/RmXp/...): Game Maker 7 PRO, Visual Basic 9.0, Visual C++ et Code::Blocks Date d'inscription: 22/11/2007
 | Sujet: Re: Script de marche incomprit Dim 25 Oct - 3:24 | |
| Pas tout à fait, car dans ce cas, si la condition en x ne s'effectue pas, il va encore y avoir une erreur... | Code: | xstep=(holdr || fholdr)-(holdl || fholdl) ystep=(holdd || fholdd)-(holdu || fholdu) if (place_free(x+xstep,y)) { x+=xstep} else xstep = 0 if (place_free(x-xstep,y+ystep)) { y+=ystep } |
|
|
 | |
playboy Timide


Nombre de messages: 25 Programme utilisé (Gm/RmXp/...): GM7.0 (pro) Etudes: Université Loisirs: Gamemaker Date d'inscription: 11/09/2009
 | Sujet: Re: Script de marche incomprit Dim 25 Oct - 11:10 | |
| Oups merci de la correction  " c'est vrai que ca poserait soucis dans ce cas là. Bien la je pense que c'est bon  Et limite je vais mettre au courant jerelink de ce changement  Je sais pas quelles solutions il a utilisé ou je lui ai donné  Il me semble lui avoir envoyé ceci : | Code: | gardex=x gardey=y xstep=(holdr || fholdr)-(holdl || fholdl) ystep=(holdd || fholdd)-(holdu || fholdu) if (place_free(gardex+xstep,gardey)) { x+=xstep} if (place_free(gardex,gardey+ystep)) { y+=ystep } |
Mais bon pour être sur je le contacte Parce que je sais pas s'il va venir voir ici vu qu'il pense sa solution terminé  _________________ [Démo du RPG (30 Juin 2009) = Aeris] ------------------ [Jeux Finis/Mon topic = Laguna]   |
|
 | |
jerelink Discret


Nombre de messages: 115 Age: 18 Programme utilisé (Gm/RmXp/...): game maker Date d'inscription: 14/01/2006
 | Sujet: Re: Script de marche incomprit Jeu 29 Oct - 22:52 | |
| Ouaw... Tellement j'étaie captivé par la grande aide de Playboy et j'ai complètement oublié ce sujet car personne n'y répondait  ' Sa me choque de voir toute ces réponse oO Et bien merci a tous  En tout cas tout marche parfaitement maintenant =) |
|
 | |
| | Script de marche incomprit | |
|