[GM] Systèmes de marche simple

Démarré par Morwenn, 21 Juin 2008 à 16:56

0 Membres et 1 Invité sur ce sujet

21 Juin 2008 à 16:56 Dernière édition: 27 Juin 2008 à 15:04 par Morwenn
Ce tutoriel est destiné à mettre au clair tout ce qui peut être fait pour avoir un système de marche de base sous Game Maker. Ainsi, plusieurs méthodes vous seront proposées, à vous de choisir celle qui vous semble la plus appropriée pour votre jeu, ou celle que vous comprenez le mieux.


Première Méthode :

Cette méthode présente, en plus de l'aspect programmation, les bases du système de création des sprites et des objets sous Game Maker, elle est, dans un premier temps, plus simple à apréhender. Si vous débutez à peine, utilisez plutôt celle-ci, évitez juste de faire un simple recopiage sans comprendre.

Sprites :

Faites deux dossiers dans la partie « sprites ». (Click droit sur « sprites » : Add Group)
Un des deux s'appellera « Marche », et l'autre « Arrêt ».

Dans le premier dossier (Marche), créez un sprite appelé « spr_marche_haut ». Mettez-y les sprites du héros en train de marcher vers le haut.
Faites de même pour le héros marchant vers le bas. Il s'appellera « spr_marche_bas ».
Idem pour les sprites où le héros marchera vers la gauche et vers la droite.
Logiquement, on les appellera « spr_marche_gauche » et « spr_marche_droite ».

Dans le deuxième dossier (Arrêt), créez un sprite appelé « spr_arrêt_haut ». Mettez-y les sprites du héros en pause vers le haut.
Faites de même pour le héros stoppé vers le bas. Il s'appellera « spr_arrêt_bas ».
Idem pour les sprites où le héros sera arrêté vers la gauche et vers la droite.
Logiquement, on les appellera « spr_arrêt_gauche » et « spr_arrêt_droite ».

Bien entendu, les noms des sprites sont optionnels, mais ils aident à mieux se retrouver dans la base de données. Vous pouvez bien évidemment remplacer le mot « arrêt » par le mot « stop » par exemple.

Les sprites sont désormais inclus dans le jeu.


Programmation de la marche simple :

(Remarque : Tout ce qui est après « // » dans le Game Maker Langage n'est pas pris en compte. C'est donc un bon moyen de mettre un commentaire pour être plus explicite.)

Maintenant, dans l'objet du personnage, mettez l'event « Step » .
Comme action, utilisez « Execute a piece of code » de l'onglet « control », de la partie « code ».

Commençons par le haut... Insérez ce qui suit dans ce code :


// Système de marche et d'arrêt vers le haut

// Marche

if (keyboard_check_direct(vk_up)) // Si la flèche du haut est pressée
{
sprite_index = spr_marche_haut; // Le sprite de base devient ...
y-=3; // Vitesse = 3 
}

//Arrêt

if (keyboard_check_released(vk_up)) // Si la flèche du haut est relâchée
{
sprite_index = spr_arrêt_haut; // Le sprite devient ...
y-=0; // Vitesse = 0 
}

// Système de marche et d'arrêt vers le bas

// Marche

if (keyboard_check_direct(vk_down)) // Si la flèche du bas est pressée
{
sprite_index = spr_marche_bas; // Le sprite de base devient ...
y+=3; // Vitesse = 3  
}

//Arrêt

if (keyboard_check_released(vk_down)) // Si la flèche du bas est relâchée
{
sprite_index = spr_arrêt_bas; // Le sprite devient ...
y+=0; // Vitesse = 0 
}

// Système de marche et d'arrêt vers la gauche

// Marche

if (keyboard_check_direct(vk_left)) // Si la flèche de gauche est pressée
{
sprite_index = spr_marche_gauche; // Le sprite de base devient ...
x-=3; // Vitesse = 3 
}

//Arrêt

if (keyboard_check_released(vk_left)) // Si la flèche de gauche est relâchée {
sprite_index = spr_arrêt_gauche; // Le sprite devient ...
x-=0; // Vitesse = 0 
}


// Système de marche et d'arrêt vers la droite

// Marche

if (keyboard_check_direct(vk_right)) // Si la flèche de droite est pressée
{
sprite_index = spr_marche_droite; // Le sprite de base devient ...
x+=3; // Vitesse = 3 
}

//Arrêt

if (keyboard_check_released(vk_right)) // Si la flèche de droite est relâchée
sprite_index = spr_arrêt_droite; // Le sprite devient ...
x+=0; // Vitesse = 0 
}



Marche en diagonale :


Maintenant que la marche simple est erminée, nous allons voir une erreur que beaucoup de makers font : Link bouge trop vite en diagonale. Il bouge de 2 pixels en ligne droite et aussi de 2x2 pixels en diagonale, ce qui est plus rapide qu'en ligne droite. La diagonale d'une carré (en l'occurrence ici, un pixel) est plus longue que ces côtés:


L'image ci-dessus permet de bien voir la situation. C'est en quelque sorte une vue agrandie de 4 pixels. La ligne rouge représente le mouvement en ligne droite (2 pixels), la ligne verte le mouvement en diagonale (2x2 pixels). On voit très bien que la ligne verte est nettement plus longue que la ligne rouge. La courbe bleu permet de bien voir le rayon autour du personnage, un rayon de 2 pixels. La croisement entre la courbe bleue et la ligne verte représente l'endroit où le personnage devrait s'arrêter pour bouger de la même distance, ce qui correspond à environ 2/3 de la ligne verte. Évidemment, si on bouge de 2 pixels en ligne droite, on ne peut pas bouger 1,333.... pixels en diagonale (Ou du moins, sans avoir le sprite flou ou distorsionné). Il faut utiliser des vitesses "compatibles". Par exemple, avec 3 pixels en ligne droite, et 2x2 pixels en diagonale, on obtient bien le 2/3 du mouvement.


Sur l'image ici, on voit que le 2/3 représente presque la distance à un angle de 45°, légèrement moins, mais la différence est tellement minime qu'un être humain ne peut y faire une différence.

Un autre astuce, si on souhaite, par exemple, conserver la vitesse de deux pixels par frames (en ligne droite), consiste à effectuer le mouvement deux fois sur trois. C'est un peu plus compliqué, il faut faire une variable qui s'incrémente lors des mouvement en diagonale, et lorsqu'elle a la valeur de 3, on n'effectue pas le mouvement et on remet la variable à zéro. Cette méthode a particulièrement le défaut de rendre les mouvement un peu plus saccadés (Quoi que la différence peut être très minime, surtout si le jeu tourne à une bonne vitesse).






Seconde Méthode :

Cette méthode est un peu plus complexe à apréhender si vous débutez avec Game Maker, mais elle fonctionne tout aussi bien que la précédente. Cependant, elle fait appel à plus de fonctions du logiciel, donc si vous avez du mal, ou que vous débutez juste en programmation, préférez(lui la première méthode. Les noms des sprites sont les mêmes que ceux de la première méthode.

Donc voici le code :

- Tout d'abord créez trois variables dans Create : "sens", "dir", et "vit".

- Ensuite, dans Step mettez ceci :

sens=0; // Remise à 0 de la variable sens

if (keyboard_check(vk_right)) sens+=1; 
if (keyboard_check(vk_up)) sens+=2;     // Ces 4 lignes vont incrémenter la variable "sens" de façon a tester toutes les possibilités.
if (keyboard_check(vk_left)) sens+=4;
if (keyboard_check(vk_down)) sens+=8;   

switch (sens) // C'est ici que toutes les possibilitées de directions seront interpretées, les explications viennent après.
    {
    case 0: dir=0; vit=0; break;
    case 1: dir=0; vit=1; break;
    case 2: dir=90; vit=1; break;
    case 3: dir=45; vit=1; break;
    case 4: dir=180; vit=1; break;
    case 5: dir=0; vit=0; break;
    case 6: dir=135; vit=1; break;
    case 7: dir=90; vit=1; break;
    case 8: dir=270; vit=1; break;
    case 9: dir=315; vit=1; break;
    case 10: dir=0; vit=0; break;
    case 11: dir=0; vit=1; break;
    case 12: dir=225; vit=1; break;
    case 13: dir=270; vit=1; break;
    case 14: dir=180; vit=1; break;
    case 15: dir=0; vit=0; break;
    }

if (vit) move_contact_solid(dir,3); // Cette fonction va déplacer l'objet dans la direction "dir" à une vitesse de 3 si la variable "vit" est supérieure à 0.


Explication :

Tout d'abord, il ne sera pas ici expliqué comment fonctionne un switch, un peu de recherche ne vous tuera pas.
Ensuite, voici un tableau explicatif pour vous aider à mieux comprendre le raisonnement :


Prenons pour exemple le cas où les touches droite et haut sont pressées; la variable "sens" aura alors pour valeur 3.
Ensuite, le switch va mettre dir à 45 et vit à 1 (ce qui correspond a un true en booléen) la condition du if va donc être validée, et le déplacement se fera dans la direction dir à la vitesse voulue.
Ajoutons maintenant un changement de sprite :

- Toujours dans Step ajoutez ceci :

if (vit) // Si la vitesse est supérieure à 0 :
    {
    image_speed=0.3; // La vitesse de l'image est mise à 0.3 (c'est une bonne valeur pour un sprite de 4 image)
    switch (dir) // Selon la direction choisie, on change le sprite, mais seulement quand la direction est fixe, pour garder le sprite de la première touche pressée.
        {
        case 0: sprite_index=spr_marche_droite; break; // spr_marche_droite est le sprite du perso qui va vers la droite.
        case 90: sprite_index=spr_marche_haut; break;
        case 180: sprite_index=spr_marche_gauche; break;
        case 270: sprite_index=spr_marche_bas; break;
        }
    }
else // Si la variable vit est inférieure ou égale à 0
    {
    image_speed=0; // La vitesse le l'image sera mise à 0...
    image_index=0; // et l'index de l'image sera le premier (celui où le perso est fixe).}



Explication 2 :

Ici, je pense que tout est clair (les commentaires suffisent), il suffit de créer des sprite qui contiennent toutes les images de chaque direction en ayant pour première image celle ou le perso est fixe, comme il a été vu avec la première méthode. S'il s'agit juste d'un changement de méthode, vous pouvez garder les mêmes sprites.



Tuto proposé par : Link 57, -X2km-, HCkev, Maxs, l'équipe des Conseillers JA.