Jetpack Hero
C’est la toute première partie d’une série consacrée à l’écriture d’un jeu avec DragonRuby.
DragonRuby en quelques mots
C’est un moteur de jeu 2D, payant, basé sur mruby et la SDL. Vous le trouverez ici. Il n’y a pas d’installation, un zip est fourni avec tout le nécessaire. J’utiliserai la dernière version du 20 mars 2025. Une fois le zip décompressé et le dossier renommé en jetpack-hero on peut commencer.
Création du personnage
Je m’inspire très fortement (et c’est peu dire :D) du jeu H.E.R.O de l’atari 2600 pour pondre ceci :
Le fichier original fait 7x17 pixels.
Affichage
L’image à afficher est décrite dans un hash.x
et y
sont les positions du
coin inférieur gauche (l’écran mesure 1280x720, on ne peut pas le modifier, et l’origine 0,0 se situe en bas à gauche).
w
et h
sont respectivement la largeur et la hauteur de l’image affichée. Ici
j’étire l’image originale d’un facteur 4.
Tout se passe dans la méthode tick
qui est appelée 60 fois par seconde.
Le paramètre args
est notre moyen de communiquer avec le moteur de jeu, on
pourra aussi y stocker ce qu’on veut.
Pour dessiner un fond noir, j’ajoute un hash à args.outputs.solids
qui décrit un rectangle de la taille de l’écran (x, y, w, h)
et de couleur noire (r, g, b).
Finalement j’affiche le personnage en ajoutant le hash hero
à args.outputs.sprites
.
# Fichier mygame/app/main.rb
HERO_SCALE = 4
def tick args
hero = {
x: 600,
y: 40,
w: 7 * HERO_SCALE,
h: 17 * HERO_SCALE,
path: 'sprites/hero.png'
}
args.outputs.solids << { x: 0, y: 0, w: 1280, h: 720, r: 0, g: 0, b: 0 }
args.outputs.sprites << hero
end
Pour lancer le jeu il suffit d’appeler l’executable à la racine du dossier :
$ ./dragonruby
L’idiome ||=
La création du hash contenant les infos du personnage est répétée 60 fois par
seconde. Pour éviter cette situation, l’idiome ||=
est partout présent dans DragonRuby.
Au lieu d’une affectation sans condition comme celle-ci :
def tick args
hero = { ... }
end
on utilisera ||=
qui créera le hash seulement si celui-ci n’existe pas. Donc
uniquement durant la première itération de tick
. Et on l’enregistrera dans
args.state
, pour le sauvegarder entre les différents appels de tick
:
def tick args
args.state.hero ||= { ... }
end
Déplacements
args.inputs
permet de tester les méthodes left
, right
, up
et down
.
Ces méthodes indiquent si on appuie sur une touche fléchée, sur “QSDZ” en azerty, ou sur la croix directionnelle d’une manette.
Notez qu’on peut accéder à un élément d’un hash avec la notation hash.key
, comme par
exemple dans args.state.hero.x
.
HERO_SCALE = 4
def tick args
args.state.hero ||= {
x: 600,
y: 40,
w: 7 * HERO_SCALE,
h: 17 * HERO_SCALE,
path: 'sprites/hero.png'
}
if args.inputs.left
args.state.hero.x -= 5
elsif args.inputs.right
args.state.hero.x += 5
end
if args.inputs.up
args.state.hero.y += 5
elsif args.inputs.down
args.state.hero.y -= 5
end
args.outputs.solids << { x: 0, y: 0, w: 1280, h: 720, r: 0, g: 0, b: 0 }
args.outputs.sprites << args.state.hero
end
Et en quelques lignes, notre personnage se déplace sur l’écran à l’aide du clavier ou d’une manette de jeu.
Références
- Vous trouverez le code de Jetpack Hero sur github
- DragonRuby
- Documentation de DragonRuby
Cet article fait partie d’une série :
Commentaires
Pas encore trouvé de solution simple et non-invasive pour avoir des commentaires sur le blog. En attendant vous pouvez laisser votre Commentaire sur mastodon@lkdjiin