Projet Jeu 3
Objectifs
- Créer une scène de fin de jeu en cas de défaite.
- Revenir au jeu après avoir perdu.
- Compter le nombre de pièces ramassées.
- Afficher le score à l'écran de fin de jeu.
- Créer plusieurs niveaux.
Scène
Créer une scène de fin de jeu en cas de défaite en ajoutant ceci à la fin du code :
scene("lose", () => {
add([text("You Lose"), color("#ffffff"), pos(center()), anchor("center")]);
});
Mettre à jour la collision avec les dangers en changeant de scène en cas de collision :
onCollide("player", "danger", (player, danger) => {
addKaboom(player.pos);
go("lose");
});
Pour revenir au jeu après avoir perdu, il faut mettre le niveau dans une scène.
Pour cela, commencer par créer une scène game vide :
scene("game", () => {
// contenu de la scène
});
Tout le code dans la scène sera exécuté lorsqu'on appellera la scène game avec go("game").
Déplacer les éléments du niveau dans la scène :
- L'ajout du fond :
add(["background", ...]). - L'ajout optionnel du texte de fond :
add(["text", ...]). - La définition du niveau :
const level = addLevel(...); - Les collisions :
onCollide(...); - La définition du personnage :
const player = level.get("player")[0]; - Les contrôles du personnage :
onKeyPress(...);
Exemple
scene("game", () => {
add(["background", pos(0, 0), rect(width(), height()), color("#eee8d5")]);
const level = addLevel(
[
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ^ ",
" === ",
" ",
" @ ^ $ $ $ ",
"================",
],
{
tileWidth: 40,
tileHeight: 40,
tiles: {
"@": () => [
"player",
circle(20),
color("#dc322f"),
area(),
body(),
anchor("topleft"),
],
"=": () => [
"grass",
rect(40, 40),
color("#859900"),
outline(),
area(),
body({ isStatic: true }),
anchor("topleft"),
],
"$": () => [
"coin",
circle(20),
color("#b58900"),
area(),
anchor("topleft"),
],
"^": () => [
"danger",
rect(40, 40),
color("#d33682"),
area(),
anchor("topleft"),
],
},
},
);
const player = level.get("player")[0];
onKeyPress(["space", "up"], () => {
player.jump();
});
onKeyDown("right", () => {
player.move(256, 0);
});
onCollide("player", "danger", (player, danger) => {
addKaboom(player.pos);
});
}); // Fin de la scène "game"
Commencer le jeu en appelant la scène game avec go("game") à la fin du code (après les scènes) :
go("game");
Vérifier que le jeu fonctionne toujours correctement.
Pour revenir au jeu en appuyant sur n'importe quelle touche après avoir perdu, modifier la scène de défaite :
scene("lose", () => {
add([text("You Lose"), color("#ffffff"), pos(center()), anchor("center")]);
onKeyPress(() => {
go("game");
});
});
Vérifier qu'on peut recommencer le jeu après avoir perdu.
Score
Pour compter le nombre de pièces ramassées, il faut :
- Créer une variable qui va stocker le nombre de pièces ramassées.
- Afficher le nombre de pièces ramassées à l'écran (après le fond pour qu'il soit dessiné après).
...
setGravity(1600);
let score = 0;
scene("game", () => {
add(["background", pos(0, 0), rect(width(), height()), color("#eee8d5")]);
const scoreLabel = add([text(score), color("#ffffff"), pos(16)]);
...
});
Mettre à jour le score à chaque fois que le joueur ramasse une pièce :
onCollide("player", "coin", (player, coin) => {
...
score = score + 1;
scoreLabel.text = score;
});
Le score se met-il à jour lorsque vous ramassez une pièce ?
Afficher le score à l'écran de fin de jeu.
- Modifier le texte de la scène de défaite pour afficher le score :
main.js
scene("lose", () => {
add([text("You Lose " + score), color("#ffffff"), pos(center()), anchor("center")]);
...
}); - Utiliser
\npour faire un saut de ligne dans le texte.
Essayer de ramasser des pièces, toucher un danger et recommencer le jeu. Que se passe-t-il et comment corriger cela ?
Plusieurs niveaux
Créer un autre niveau :
- Copier la scène
gameet la renommergame-2. - Renommer la première scène
game-1. - Vérifier que tout fonctionne toujours correctement.
- Ajouter un portail dans le premier niveau qui permet de passer au deuxième niveau.
- Ajouter un nouveau type de tuile
*avec comme tagportal. - Lorsqu'on touche un portail, on passe au deuxième niveau.
- Ajouter un nouveau type de tuile
Bonus
Quelques idées de fonctionnalités à ajouter.
Sprites animés
- Dessiner une sprite avec plusieurs images (animation) sur Piskel.
- Sauvegarder la sprite dans un fichier png, chaque frame de l'animation sera sur une colonne.
loadSprite("identifiant", "chemin-vers-l'image", {
sliceX: 1, // Nombre de colonnes
sliceY: 2, // Nombre de lignes
anims: {
// Nom de l'animation avec les index des images à afficher
idle: {
from: 0,
to: 1,
loop: true,
speed: 2, // Nombre de frames par seconde
},
},
});
...
[
"tag",
sprite("identifiant", {
width: 40,
height: 40,
anim: "idle", // démarrer avec l'animation "idle"
}),
]
Shake
Faire trembler l'écran en utilisant la fonction shake() :
shake(16);
Double Saut
Pour que le personnage puisse faire un double saut, ajouter le composant doubleJump :
const player = add([
"player",
circle(32),
color("#dc322f"),
pos(128, 256),
area(),
body(),
doubleJump(2),
]);
Utiliser la méthode doubleJump() au lieu de jump() pour faire sauter le personnage :
player.doubleJump();
Quitter l'écran
Définir une action lorsque le personnage sort de l'écran, ajouter le composant offscreen() :
const player = add([
"player",
circle(32),
color("#dc322f"),
pos(128, 256),
area(),
body(),
offscreen(),
]);
Définir les actions à effectuer lorsque le personnage sort de l'écran :
player.onExitScreen(() => {
shake(8);
});
Son
Voir la documentation sur les sons.
Points de vie
Voir health.
Shooter
Voir l'exemple.