J'ai hésité plusieurs fois à faire ce tutoriel, mais je me dis que ça peut être un apprentissage sympa pour GM et qui change du casse-brique.
Cependant, il ne vaut peut être pas mieux commencer par ce tutoriel, car il reste plus compliqué que d'autres, donc n'y touchez que lorsque vous comprenez les bases de GM.
Pour commencer la programmation du moteur, il vous faudra différents sprites : le bomberman (les 4 directions), un sprite de bombe animé (elle explosera à la fin de l'animation), un sprite d'explosion, de mur (le bloc incassable), et de rocher ou autre (le bloc cassable).
Je vous ai réunis les sprites nécessaires dans un petit gm6.
>>Cliquez ici pour le télécharger<<Maintenant que vous avez les sprites, c'est parti pour la programmation.
Commencez par créer l'objet le plus simple : le mur.
Assignez lui son sprite, et cochez la case "Solid".
Ensuite, nous allons programmer le personnage. Créez donc un nouvel objet, et mettez lui son sprite initial, n'importe lequel, vers le bas ou la droite par exemple.
Dans l'event "Create"
Déposez l'icône "Execute a piece of code", qui se trouve dans l'onglet control et qui représente une petite feuille, puis entrez ce code :
Explication : "image_speed" est le nom de la variable qui contient la vitesse d'animation de l'objet. La vitesse de la room est de 30, si on laisse 1 comme valeur de l'image_speed, le sprite sera animé à 30 images par seconde, donc c'est un peu trop rapide :gniah:
Dans l'éditeur de sprite, j'ai regardé la vitesse qui me convenait, c'était 5, et comme 5 représente 1/6ème de 30, je mets image_speed=1/6 :-D
Vous pouvez adapter la valeur, et n'etes pas obligé de mettre une fraction, vous pouvez mettre "0.5" par exemple. Choisissez la vitesse d'animation qui vous convient.
Ensuite, dans l'event "Step"
Un autre "Execute a piece of code"
Et cette fois ci nous allons faire du vrai code :-D
J'explique avant ce que nous allons utiliser :
keyboard_check(code_touche) : retourne vrai si la touche est préssée, faux dans le cas contraire.
sprite_index : sprite actuel de l'objet
image_index : sous image actuelle de l'objet
x : position en x de l'objet
y : position en y de l'objet
Voilà les variables que vous devez connaître :-D
Maintenant je vais vous donner le code, mais avec des explications (lisez les bien sinon vous n'aurez rien appris !
)
- Code:
-
{
if not keyboard_check(vk_right) and not keyboard_check(vk_left) and not keyboard_check(vk_down) and not keyboard_check(vk_up)
image_index=1
//si aucune fleche de direction n'est préssée, la sous image affichée est la numéro 1
if keyboard_check(vk_left)
{sprite_index=spr_bomberman_left if place_free(x-4,y) x=x-4}
//si la touche gauche est préssée
//le sprite affiché est celui de la gauche, et s'il y a de la place à gauche, on y va
if keyboard_check(vk_right)
{sprite_index=spr_bomberman_right if place_free(x+4,y) x=x+4}
//si la touche gauche est préssée
//le sprite affiché est celui de la gauche, et s'il y a de la place à gauche, on y va
if keyboard_check(vk_up)
{sprite_index=spr_bomberman_up if place_free(x,y-4) y=y-4}
//si la touche gauche est préssée
//le sprite affiché est celui de la gauche, et s'il y a de la place à gauche, on y va
if keyboard_check(vk_down)
{sprite_index=spr_bomberman_down if place_free(x,y+4) y=y+4}
//si la touche gauche est préssée
//le sprite affiché est celui de la gauche, et s'il y a de la place à gauche, on y va
}
Vous pourrez bientôt regarder la marche de votre petit bomberman.
Mais il y a encore un problème, les collisions ne sont pas du tout au point, vous pouvez l'essayer si vous voulez, il se coincera partout !
La solution pour cela ? Modifier les origines, et ajouter un masque !
Ouvrez les différents sprites du bomberman, et mettez l'origine vers le bas, entre les jambes, au niveau de ses pieds si vous le voulez.
Vous ne comprenez peut être pas encore très bien, mais tout sera bientôt très clair
Créer un nouveau sprite, qui servira de masque. Vous tracerez une petite ellipse couchée, et metterez son origine au centre.
Ensuite, mettez ce petit sprite comme masque pour l'objet bomberman, puis vous pouvez créer une room, et déposer les murs et le petit personnage, normalement tout marchera bien
Si les sprites sont décalés, que ça ne vous convient pas, ajustez les origines comme bon vous semble.
Maintenant, nous allons commencer à programmer les bombes. C'est la phase la plus délicate héhé
Vous allez créer les 3 objets nécessaires tout de suite :
objet rocher, qui est solide, vous lui assignez son sprite.
objet explosion, pareil, son sprite... mais pas solide !
et enfin, l'objet bombe (vous savez quoi ? vous lui assignez son sprite :nezrouge: )
Ouvrez l'objet rocher, et mettez dans l'event "Collision avec l'objet explosion"
le code (un execute a piece of code pour ceux qui n'auraient pas compris)
- Code:
-
instance_destroy()
Ainsi, lorsque le rocher entrera en contact avec l'explosion, il se détruira.
On fait dans l'ordre du plus simple au plus compliqué, donc, après avoir ouvert l'objet rocher, ouvrez l'objet explosion. Si vous vous servez des sprites que j'ai donné, vous remarquerez que le sprite de l'explosion est plus grand qu'un mur, alors que dans les vrais bomberman, il fait la taille du mur
Donc pour éviter des collisions non voulues, mettez lui comme masque le sprite du mur.
Ensuite, si vous réfléchissez un peu, comme le sprite est plus grand, mais que l'origine du masque et celle de l'explosion sont à 0, l'explosion sera un peu... décalée. Pour cela, changez l'origine du sprite d'explosion, en situant dans votre tête où se trouve l'origine du sprite mur par rapport à celui ci. Si vous utilisez le sprite donné et que vous ne voulez pas réfléchir, entrez comme coordonnées : 2,15.
Comme pour le personnage, nous allons ajuster la vitesse d'animation de l'explosion. Ouvrez l'event create
, et entrez le code
- Code:
-
image_speed=2/3
C'est encore une valeur donnée, vous pouvez la modifier à votre bon vouloir, mais je vous montre qu'on peut l'utiliser plutôt que de dupliquer des frames dans l'édition des sprites, et prendre du poids inutilement.
Ouvrez l'event "Animation End" , et saisissez le code pour détruire l'objet. Si si, souvenez vous, vous l'avez déjà utilisé pour le rocher !
Maintenant, attaquons l'objet bombe, le plus coriace
Comme d'hab, vous pouvez régler la vitesse d'animation dans l'event create (moi je mets 2/30 comme valeur), je crois qu'à présent vous savez comment on fait :gniah:
Ajoutez aussi ce code :
- Code:
-
move_snap(15,15)
Move_snap(hsnap,vsnap) est une fonction qui déplace automatiquement l'objet sur une grille dont les cases mesurent 15 sur 15. C'est à dire que si cet objet se trouve en 47;160, il sera automatiquement déplacé en 45;165. Nous l'utilisons ici pour que la bombe ne se trouve pas en décalé.
Dans bomberman, les bombes sont solides, on ne peut pas les traverser.
Seulement, si vous la mettez solide directement, elle bloquera bomberman, puisqu'il la posera où il se trouve. Pour éviter cela, ouvrez l'event step, un execute a piece of code :
Ouvrez l'event animation end, et mettez-y le code "instance_destroy()" pour que la bombe se détruise à la fin de son animation.
Maintenant, le plus compliqué. Cliquez sur l'icône de feuille avec une petite flèche verte en haut pour créer un nouveau script, que vous appellerez "scr_explosion".
Ce script servira à produire une explosion à une coordonnée indiquée par la bombe, l'argument0 sera l'axe x et l'argument1 l'axe y. Dans bomberman, la bombe a une certaine portée d'explosion, pour nous ce sera tout le temps 3. S'il y a de la place à la gauche de la bombe, elle crée une explosion. Elle peut en créer 3 sur sa gauche, toujours un peu plus loin.
Mais si il y a un mur à sa gauche par exemple, elle ne va pas créer d'explosion de l'autre côté du mur ! (je sais c'est pas très clair ce que je dis :gniah: )
Copiez le code sur l'image ci-dessus, il signifie à peu près :
- Code:
-
Si can_explode=faux "on annule"
s'il y a de la place en x,y (argument0 et 1), on crée une explosion en x,y
autrement
{
s'il y a un mur en x,y
{can_explode=faux "on annule"}
s'il y a un rocher en x,y
{on crée une explosion en x,y can_explode=faux "on annule" (mais en fait heu lol c'est plutôt inutile le exit à la fin) }}
ouvrez maintenant l'event destroy de votre objet bombe, et déposez un "execute a piece of code".
Au début, vous initialisez la variable :
"can_explode=true"
Ensuite, vous faites une explosion où se trouve la bombe
"instance create(x,y,obj_explosion)"
Ensuite, on va se servir du script crée, on tente les explosions sur la gauche :
"scr_explosion(x-15,y)
scr_explosion(x-30,y)
scr_explosion(x-45,y)"
vous remettez "can_explode=true" et on tente les explosions sur la droite:
"can_explode=true
scr_explosion(x+15,y)
scr_explosion(x+30,y)
scr_explosion(x+45,y)"
pareil pour haut et bas :
"can_explode=true
scr_explosion(x,y-15)
scr_explosion(x,y-30)
scr_explosion(x,y-45)
can_explode=true
scr_explosion(x,y+15)
scr_explosion(x,y+30)
scr_explosion(x,y+45)"
Ajoutez dans l'event step de l'objet bomberman ce script :
- Code:
-
if keyboard_check(vk_space) && instance_number(obj_bombe)=0
instance_create(x-6.5,y-6.5,obj_bombe)
Le -6.5, c'est pour que la bombe soit crée au bon endroit, vous ajusterez le petit décalage, pour qu'elle se trouve au bon endroit
Lancez le jeu et appuyez sur espace, vous pouvez normalement poser des bombes à présent !
Voilà, vous avez votre base de bomberman, maintenant c'est à vous de rajouter les collisions avec le perso, de créer des ennemis, d'ajouter les bonus permettants de poser plusieurs bombes, etc...
Voici un gm6 un peu plus avancé, avec un ennemi basique :
http://www.zshare.net/download/4996544455751e/