Ajouter une échelle

pour Issa (Rosny-sous-bois)

Les échelles sont un bon moyen de donner de la verticalité à ton jeu. Elles peuvent permettre au joueur d'atteindre une partie plus haute de ton jeu, ou de remonter là où il était après une chute. Tu peux aussi utiliser ce hack pour réaliser de grandes surfaces grimpables, et imaginer un level design qui les met à profit.

Importer une image

Pour commencer, il va te falloir une image. Réalises-en une si tu ne l'as pas déjà fait, ou utilise celle ci-dessous (click droit -> enregistrer-sous).

Charger l'image dans le programme

Importe ensuite ton image dans ton projet en la plaçant dans le bon dossier : assets/sprites/. Puis, ajoute cette ligne au début de ton script game.js, comme suit.

// chargement des images du jeu
loadSprite( "bean"   , "assets/sprites/bean.png"   ) ;
loadSprite( "grass"  , "assets/sprites/grass.png"  ) ;
loadSprite( "portal" , "assets/sprites/portal.png" ) ;

loadSprite( "ladder" , "assets/sprites/ladder.png" ) ;

Déclarer un symbole

Nous allons maintenant déclarer un nouveau type d'objet que tu vas pouvoir placer dans ton jeu. Dans cet exemple nous avons choisi le caractère H. Dans le script level.js, trouve la variable LEVEL_CONFIG et ajoutes-y le code ci-dessous, comme suit.

// défini ce à quoi correspond chaque symbole dans le niveau
const LEVEL_CONFIG = {
  
  // taille en pixel de chaque case
  width: 64,
  height: 64,

  // sol
  "=": () => [
    sprite("grass"), 
    area(), 
    solid(), 
    origin("bot")
  ],
  
// echelle "H": () => [ sprite("ladder"), area(), origin("bot"), "climbable", ],
} ;

Placer les échelles

Tu vas maintenant pouvoir choisir l'emplacement de tes échelles dans ton niveau. Toujours dans le script level.js, trouve le tableau LEVELS et places des caractères H là où tu le souhaites. Dans cet exemple, les échelles font deux cases de hauteur, c'est pourquoi elles ont été placées à une case d'intervalle verticalement. N'hésite pas à regarder l'exemple de jeu plus haut pour voir le résultat.

// plan du niveau
const LEVELS = [
  
  [
    "                     " ,
    "                     " ,
    "      =========      " ,
    "    H           H    " ,
    "                     " ,
    " #  H           H    " ,
    "=======       =======" ,
  ],
  
];

Tes échelles sont maintenant apparentes dans ton niveau. Tu peux les voir, mais elles ne sont pas encore utilisables.

Créer deux nouveaux composants

Pour que ton joueur puisse emprunter ces échelles, il va nous falloir créer deux nouveaux composants, un pour les échelles, un pour le joueur. Rends-toi dans le script component.js et ajoutes-y ces deux fonctions.

function climbSurface() { return { require: [ "pos", "area", ], add() { this.onCollide("climbableExit", (e) => { destroy(e); }); }, load() { const epw = 20 , mrgw = 10 , mrgh = 30 ; const x = this.pos.x , y = this.pos.y ; const h = this.height , w = this.width ; let m = []; for ( let i = 0 ; i < 5 ; i ++ ){ m[i]=add([ rect(epw,epw), opacity(0), area(), pos(this.pos.x,this.pos.y), origin("bot"), "climbableExit", ]); } m[0].height = h ; m[1].height = h ; m[2].width = w * 2 + epw + mrgw ; m[3].width = w * 2 + epw + mrgw ; m[4].width = w * 2 + epw + mrgw ; m[0].pos.x = x - w - mrgw ; m[1].pos.x = x + w + mrgw ; m[2].pos.y = y + mrgh ; m[3].pos.y = y - h - mrgh / 2 ; m[4].pos.y = y - h - mrgh * 2 - epw ; }, } } function climb(climbKey = "up") { const climbPower = 600 ; let onLadder = false ; return { require: [ "pos" , "area" , "body" ], add() { this.onCollide("climbableExit", (p) => { onLadder = false ; }); this.onCollide("climbable" , (p) => { onLadder = true ; }); this.onHeadbutt( (p) => { onLadder = false ; }); onKeyDown(climbKey, () => { if (onLadder) this.jump(climbPower) ; }); }, } }

Ajouter les nouveaux composants

Maintenant que les composants existent, il nous faut les ajouter aux échelles et au joueur. Dans le script level.js puis dans la variable LEVEL_CONFIG, retrouve le passage où nous avons déclaré l'échelle, puis ajoutes-y cette ligne.

  // echelle
  "H": () => [
    sprite("ladder"), 
    area(), 
    origin("bot"), 

    climbSurface(),

    "climbable",
  ],

Maintenant, dans le script game.js, rends-toi dans la scène game, trouve la variable player, puis ajoutes-y cette ligne.

const player = add([
    sprite("bean"),
    pos(0, 0),
    area(),
    body(),
    startingPosition(),
    origin("center"),

    climb(),

    "player",
  ]);