AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 Depplacement type zelda (gestion des collision incluse)

Aller en bas 
AuteurMessage
onilink_
Modérateur
avatar

Messages : 9026
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
En ligne
arthuro
Utilisateur confirmé: Rang ****
avatar

Messages : 1400
Localisation : Paris
Projet Actuel : Diagon https://arthursonzogni.com/Diagon

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
Utilisateur moyen
avatar

Messages : 61

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 : 9026
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
En ligne
ocin53
Utilisateur moyen
avatar

Messages : 61

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 : 9026
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
En ligne
Craki
Utilisateur confirmé: Rang ****
avatar

Messages : 1473
Localisation : Dans l’univers de métamatière

MessageSujet: Re: Depplacement type zelda (gestion des collision incluse)   Jeu 21 Déc 2017 - 22:17

Rooh ****** oni le boulet qui connait pas les balises [code] ! Oups!

_________________
Revenir en haut Aller en bas
hyper
Utilisateur confirmé: Rang ****
avatar

Messages : 1434

MessageSujet: Re: Depplacement type zelda (gestion des collision incluse)   Mar 26 Déc 2017 - 21:47

Je crois qu'en dix ans il a eu le temps d'en avoir entendu parler Razz

_________________
côt.
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)
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Type 42 Class destroyer
» [test]Découvrez votre type d'homme
» GestLe ou l'outils de Stef pour la gestion de liste eclair
» JDR/Gestion
» l'ambigu ou la Gestion précaire des ressources humaines

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