Programmation Orientée Jeux

Les Jeux de Plateforme - La Map

Comment gérer la Map ?

Dans cette partie là, il n'y a pas vraiment le choix, il faut faire usage des Tiles (par chance le moteur de jeu propose leur utilisation). Mais avant d'aller plus loin, pourquoi l'usage de Tiles ? Pourquoi ne pourrait-on pas charger directement l'image d'un niveau et l'afficher tout simplement (Sprite) ?

1) Une représentation

Map

Avant de se lancer dans la réalisation d'un niveau, il faut réfléchir à ce que comporte un niveau. Ce n'est pas simplement une image sur laquelle on se ballade. C'est avant tout une zone compréhensible par notre programme, puisqu'il faudra gérer par la suite des Collisions (ce qui permettra de ne pas traverser le décor). Pensez-vous qu'il serait judicieux de chercher à gérer des collisions à partir d'une image d'un niveau ? Que se passe-il lorsque l'on veut faire plusieurs niveaux ? Faut-il refaire à chaque fois le mappage des collisions ? La réponse est évidement non !

C'est ce qui justifie l'usage de Tiles. En effet, un Tile peut être considéré comme un conteneur, dans lequel on stocke des informations:

2) Un découpage pour une composition

Si on utilise les Tiles, il nous faudra nécessairement une image contenant tous les Tiles de référence (comme vu dans le moteur), soit une image comme celle-ci:

Tiles

Pour composer un niveau (comme dans l'exemple cité juste avant), il faudra organiser les Tiles d'une certaine façon. Une bonne méthode, qui permet d'économiser de la place (lors du stockage), consiste à ne sauvegarder que les Tiles qui ont une existence (pas de sauvegarde d'absence de Tile donc). C'est un peu comme la différence entre une image au format BMP et PNG. Dans le premier, on sauvegarde toutes les informations (le fichier fait donc la même taille quelque soit le contenu, à dimension d'image égale). Par contre, pour le second, on se contente de ne sauvegarder que les informations utiles, sans perte. C'est ce qui explique qu'un BMP est toujours plus lourd qu'un PNG, alors que l'image affichée est strictement la même (contrairement au JPG, mais là on s'éloigne). Revenons-en à notre niveau et au système de Tiles.

L'idée est de sauvegarder dans un fichier chaque Tiles, avec son Numéro et ses Coordonnées. Pour faire simple, on considèrera 3 entiers (number, x, y). Il est facile de charger tout cela dans un tableau. Ainsi, lors de l'affichage du niveau, il suffira de parcourir ce tableau, et d'afficher le Tile numéro N, aux coordonnées X et Y. Nous verrons plus tard comment gérer les collisions. Concentrons nous d'abord sur la gestion de l'affichage du niveau: (Code donné purement à titre illustratif, ce n'est en aucun cas l'implémentation finale !)

// Rappellons qu'un Tile contient 3 entiers (numero, x, y)

// Chaque case du tableau doit contenir un Tile avec ses informations
Tile[][] tiles = null;

// Image contenant tous les tiles de reference
TiledSprite surface = null; // Merci au moteur de jeu pour le type TiledSprite

void load() {
    tiles = new Tile[36][32]; // on va supposer qu'il y a au maximum 36 * 32 tiles, hauteur et largeur
    surface = new TiledSprite("tiles.png", 16, 16); // On decoupe l'image en Tiles de dimension 16*16
    
    // On parcourt ici tout le tableau, h est la hauteur, w la largeur (le couple [h][w] designe un Tile)
    for (int h = 0; h < tiles.length; h++) {
        for (int w = 0; w < tiles[h].length; w++) {
            tiles[h][w].n = w + h * 32;
            tiles[h][w].x = w * 16;
            tiles[h][w].y = h * 16;
        }
    }
}

void update(double extrp) {

}

void render(Graphics2D out) {
    // On affiche chaque tile numero N, en X, Y
    for (int h = 0; h < tiles.length; h++) {
        for (int w = 0; w < tiles[h].length; w++) {
            surface.render(tiles[h][w].n, tiles[h][w].x, tiles[h][w].y);
        }
    }
}

Dans cet exemple, en prenant cette IMAGE comme référence de tiles, la carte affichée sera CELLE-CI (c'est juste un test). Dans la pratique, il faudra charger les informations depuis le fichier contenant les données du niveau. Ce qui revient à charger (au moment ou il s'agit de changer les Tiles) 3 entiers par Tiles (number, x, y). L'organisation du fichier contenant les données du niveau dépend bien évidement de ce que contient le niveau. A vous de bien vous organiser (nous reviendrons sur ce point plus tard).

Tile Résumé

Lire la suite: Les Jeux de Plateforme - Le Joueur

Programmation Orientée Jeux ©2010-2014
Byron 3D Games Studio