AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 Depplacement type zelda (gestion des collision incluse)

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Depplacement type zelda (gestion des collision incluse)   Sam 30 Aoû 2008 - 20:23

Voila c'est un script que j'ai trouvé sur le web et que j'ai amélioré .
Comme ce qui l'ont fait n'ont pas donnés leurs nom ce script seras en partie anonyme.(encore merci a ceux qui l'ont crée).
Il permet d'effectuer exactement les mouvements de Link dans "The legend of zelda the minish cap"

-Avec la gestion des collision
-La gestion des sprites
-La gestion de la vitesse



Tout d'abord dans l'event create mettez ces 2 variables
pour que le script qui suit puisse fonctionner :

moving = 0 //l'objet est à l'arrêt
movespeed = 3 //la vitesse de déplacement




Maintenant voici le script : MovementBase

var fholdd, fholdu, fholdl, fholdr, cc;
holdd=keyboard_check(vk_down)
holdu=keyboard_check(vk_up)
holdl=keyboard_check(vk_left)
holdr=keyboard_check(vk_right)

if holdu && holdd {
holdu=0
holdd=0 }
if holdl && holdr {
holdl=0
holdr=0 }

if (holdd ||holdu || holdl || holdr)
{
if (!moving) {
if (holdd) { sprite_index=argument4; global.facing="D" }
else if (holdu) { sprite_index=argument5; global.facing="U" }
if (holdl) { sprite_index=argument6; global.facing="L" }
else if (holdr) { sprite_index=argument7; global.facing="R" }}
moving = 1
if (holdd && !holdl && !holdr) { sprite_index=argument4; global.facing="D" }
else if (holdu && !holdl && !holdr) { sprite_index=argument5; global.facing="U" }
else if (holdl && !holdd && !holdu) { sprite_index=argument6; global.facing="L" }
else if (holdr && !holdd && !holdu) { sprite_index=argument7; global.facing="R" }
if (holdd && holdl && sprite_index!=argument4 && sprite_index!=argument6) { sprite_index=argument6; global.facing="L" }
else if (holdd && holdr && sprite_index!=argument4 && sprite_index!=argument7) { sprite_index=argument7; global.facing="R" }
else if (holdu && holdl && sprite_index!=argument5 && sprite_index!=argument6) { sprite_index=argument6; global.facing="L" }
else if (holdu && holdr && sprite_index!=argument5 && sprite_index!=argument7) { sprite_index=argument7; global.facing="R" }
} else { moving=0 }
if (moving) {
if ((holdd || holdu) && (holdl || holdr)) { movestep+=(movespeed/sqrt(2)) }
else { movestep+=movespeed }
while (movestep>=1) {
movestep-=1
fholdd=0; fholdu=0; fholdl=0; fholdr=0;
for (cc=6; cc>0; cc-=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 }}}
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 }}}}
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 {
switch (sprite_index) {
case argument4: sprite_index=argument0; break;
case argument5: sprite_index=argument1; break;
case argument6: sprite_index=argument2; break;
case argument7: sprite_index=argument3; break;}
movestep=0 }

//le script se termine ici
//
//
////////////////////////////////////////////////
///////////////////////////////////////////////



Il seras à mettre dans l'event step comme ça : c'est un exemple

MovementBase(spr_bas_stp_lch,spr_hau_stp_lch,spr_gch_stp_lch,spr_drt_stp_lch, spr_bas_mvt_lch,spr_hau_mvt_lch,spr_gch_mvt_lch,spr_drt_mvt_lch)

/*
argument0 : sprite bas stop
argument1 : sprite haut stop
argument2 : sprite gauche stop
argument3 : sprite droite stop

argument4 : sprite bas mvt
argument5 : sprite haut mvt
argument6 : sprite gauche mvt
argument7 : sprite droite mvt

//////////////////////////////////////
////////////////////////////////////////



voila c'est terminé
conseillé a toute personne qui se lance dans un projet de type zelda
Revenir en haut Aller en bas
arthuro
Utilisateur confirmé: Rang ****
avatar

Messages : 1337
Localisation : Grenoble / Méribel
Projet Actuel : CBNA

MessageSujet: Re: Depplacement type zelda (gestion des collision incluse)   Sam 30 Aoû 2008 - 20:43

cool,
je te conseille de faire un gm6 d'exemple pour qu'on puisse le tester ou au moins mettre les code entre balise
Code:
[code][/code]

_________________

D'autres jeux :
In The Cube
In the cube 2
Revenir en haut Aller en bas
ocin53
Petit bavard
avatar

Messages : 51

MessageSujet: Re: Depplacement type zelda (gestion des collision incluse)   Mar 10 Oct 2017 - 19:51

Salut oni.

J'ai remarqué que quand on "longe" un mur en diagonale, le sprite avance en vitesse réduite, alors qu'il devrait aller à la vitesse "ligne droite"
Mais je vois pas comment corriger ça...
Ca implique de détecter quand on fait le "poisson rouge"...
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Depplacement type zelda (gestion des collision incluse)   Mar 10 Oct 2017 - 20:08

Houla ça date, j'ai malheureusement pas trop le temps de regarder, mais si tu joues sur movespeed après avoir detecté une collision j'imagine qu'y a moyen de remedier au probleme.

_________________
                 
Revenir en haut Aller en bas
ocin53
Petit bavard
avatar

Messages : 51

MessageSujet: Re: Depplacement type zelda (gestion des collision incluse)   Mer 11 Oct 2017 - 20:02

Ok je comprends. En fait, c'est ton code que j'ai eu du mal à déchiffrer.
La première partie c'est bon.
La partie collision, ok pour le principe (boucle pour déterminer le nombre de pixels à parcourir avant le mur)
Mais j'arrive pas à piger ce que sont les fholdu/d/l/r... le f c'est pour quoi ?
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Depplacement type zelda (gestion des collision incluse)   Mer 11 Oct 2017 - 20:07

Les holdx c'est pour savoir si une touche directionnelle a été pressée (l:left, r:right, u:up, d:down).
Et donc les fholdx c'est pareil, mais avec une information de collision en plus (f: free).

_________________
                 
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: Depplacement type zelda (gestion des collision incluse)   

Revenir en haut Aller en bas
 
Depplacement type zelda (gestion des collision incluse)
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Type 42 Class destroyer
» Vers quel type de poussette s'orienter?
» [test]Découvrez votre type d'homme
» GestLe ou l'outils de Stef pour la gestion de liste eclair
» JDR/Gestion

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Scripts GML-
Sauter vers: