Slick2d, leçon 9 :: Changement de carte

09 mars 2014 09:36 Slick2d - Leçons 0-9 Java, Jeux, Slick2d, Tutorial

Aujourd'hui nous allons voir comment changer de carte, à l'aide des triggers que nous avons vu dans un précédent article. A l'origine j'avais fait ce code sur demande d'un lecteur qui se reconnaîtra, et du coup cela me donne un nouvelle article à écrire.

Préparation

J'ai modifié la dernière version de la carte que nous avions vu dans la leçon sur les triggers, pour ajouter un trou qui nous téléportera dans une carte de désert.

tuto-slick2d-061-change-map

J'ai fais une nouvelle carte de désert, je n'y ai pas apporté beaucoup de soin, je l'avoue. Je vous passe les détails de la création de la carte, nous avons vu cela dans les précédentes leçons. Pour cette carte j'ai utilisé un tileset du projet avalon que j'ai encore trouvé sur OpenGameArt. Au centre de cette carte j'ai dessiner une petite montagne avec un visage. Si on passe devant on retourne sur la carte du départ.

tuto-slick2d-062-retour-map

Je n'ai pas utilisé le même type de trigger que la dernière fois. Cette fois-ci, c'est un change-map identique à un teleport mais avec une carte de destination. On peu presque dire que change-map hérite de teleport. D’ailleurs il réutilisera intégralement le code de la téléportation.

Code

Voici le code tel que nous l'avons laisser dans l'article sur les triggers :

@Override
public void update(GameContainer container, int delta) throws SlickException {
    updateTrigger();
     // code déplacement du personnage ( cf leçon 3 & leçon 5 )
     // code de mise à jour de la caméra ( cf leçon 4 )
}

private void updateTrigger() {
    this.onStair = false;
    for (int objectID = 0; objectID < this.map.getObjectCount(0); objectID++) {
        if (isInTrigger(objectID)) {
            if ("teleport".equals(this.map.getObjectType(0, objectID))) {
                teleport(objectID);
            } else if ("stair".equals(this.map.getObjectType(0, objectID))) {
                this.onStair = true;
            }
        }
    }
}

private boolean isInTrigger(int id) {
    return x > map.getObjectX(0, id)
            && x < map.getObjectX(0, id) + map.getObjectWidth(0, id)
            && y > map.getObjectY(0, id)
            && y < map.getObjectY(0, id) + map.getObjectHeight(0, id);
}

private void teleport(int id) {
    this.x = Float.parseFloat(this.map.getObjectProperty(0, id, "dest-x", Float.toString(this.x)));
    this.y = Float.parseFloat(this.map.getObjectProperty(0, id, "dest-y", Float.toString(this.y)));
}

Nous allons ajouter un nouveau cas dans nos test sur les triggers.

private void updateTrigger() throws SlickException {
    this.onStair = false;
    for (int objectID = 0; objectID < this.map.getObjectCount(0); objectID++) {
        if (isInTrigger(objectID)) {
            String type = this.map.getObjectType(0, objectID);
            if ("teleport".equals(type)) {
                teleport(objectID);
            } else if ("stair".equals(type)) {
                this.onStair = true;
            } else if ("change-map".equals(type)) {
                changeMap(objectID);
            }
        }
    }
}

Pour la méthode changeMap(), le test sur "undefined" est un peu du zèle, mais c'est toujours mieux qu'un "!= null". Pour mettre à jour les coordonnées on réutilise ni plus ni moins que la méthode teleport().

private void changeMap(int objectID) throws SlickException {
    teleport(objectID);
    String newMap = this.map.getObjectProperty(0, objectID, "dest-map", "undefined");
    if (!"undefined".equals(newMap)) {
        this.map = new TiledMap("map/" + newMap);
    }
}

Je remercie mes lecteurs et leurs commentaires qui me font très plaisir ! Continuez à me posez des questions je ferai de mon mieux pour vous aidez à chaque fois. N'hésiter pas non plus à me faire des propositions sur les prochains articles.

Ressources

par Shionn, dernière modification le 09 avril 2017 15:38
13 réflexions au sujet de « Slick2d, leçon 9 :: Changement de carte »
  • GeoffreyP 24 mars 2014 14:22

    Bonjour, j'ai un problème, ma fonction teleport et change map marchen ttoutes les 2 mais ma fonction changemap n'appelle pas teleport.

  • Shionn 25 mars 2014 11:25

    Comme ça, sans infos de plus je ne peu pas t'aider. Tu as bien définit le trigger dans la carte avec les coordonnées ? Ta regarder en début si ta méthode est appelée? Ta's essayé de mettre un log ?

    Si tu trouve pas. Tu peu toujours m'envoyer ton code par mail pour que j'y jette un œil.

  • Tony 11 avril 2014 01:23

    Bonjour, très bons tutoriels , je les ai tous suivi avec succès, cela m'a beaucoup aidé en étant a un stage en informatique au japon sans professeur français ^^merci .

    J'ai vu que vous aviez prévu une suite, savez vous quand allez vous les mettre en ligne? notamment la partie sur l ajout des monstres et le combat m’intéresse beaucoup, en sachant que vous êtes une source fiable ce serait un plaisir de suivre de nouvelles leçons .

    Bonne journée à vous.

  • Shionn 11 avril 2014 13:25

    Bonjour.

    Merci pour votre commentaire. Je suis actuellement sur un projet perso me prenant quasiment tous mon temps libre. Je n'arrive pas trouver ne serait-ce une journée pour écrire un tuto.

    Mais promis ca va venir.

    Le tuto sur les monstres et le combat risque d'être bien pointu. De fait je pense qu'il préférable d'essayer avant. Et si il faut je veux bien vous dépanner.

  • Maxime 18 juillet 2014 09:30

    Bonjour,

    Esque il y aurais une autre solution de faire un changement de map sans les trigger?

  • Shionn 18 juillet 2014 15:16

    Tout dépend ce que tu veux. Quel action declncherai la téléportation ? Bien sur que c'est possible on peu faire ce qu'on veux.

  • Jack 28 juillet 2014 19:19

    A quand la prochaine leçon c'est vraiment génial continuez s'il vous plaits :(

  • David 02 août 2015 17:58

    Salut ,

    Je suis avec passion vôtre tuto depuis le début, mais je suis tombé sur un os sur ce chapitre.... En effet, après l'avoir fini le jeux s'arrête automatiquement dès que mon perso rentre en collision avec l'objet qui permet de changer de map . Le console m'affiche alors ce genre de messages : -java.io.IOException: Transparent color not support in custom PNG Decoder -java.lang.ArrayIndexOutOfBoundsException: -1

    Je me suis donc permis de vous envoyer mon code et mes ressources par émail.

    Merci

  • Shionn 16 août 2015 07:33

    Suite à notre discussion par email, nous avons découvert que le problème venais de la carte.

  • Leo 21 mai 2016 19:12

    Bonjour,

    Vos tutos sont géniaux mais j'ai un petit problème.

    A cause du probleme du calque Objet dans les version récentes de Tiled je suis passé sur la version 0.9 mais je ne parvient a me téléporter dans les cartes que je créer avec cette version bien que j'arrive à les générer.

    De plus je ne parviens qu'a me téléporter dans des cartes ayant le même nombre de calque(sinon je dois supprimer un rendu). Comment faire?

  • Leo 21 mai 2016 19:34

    De plus, je peux les générer mais je ne peux pas m'y déplacer

  • Shionn 23 mai 2016 14:41

    Salut.

    Si tes maps n'ont pas le même nombre de calque il faut que tu adapte la méthode rendu (cf leçon 5). Idem si tu as un problème de collision, CF, leçon 5.

  • Leo 23 mai 2016 22:52

    Ok merci

    Le probleme venait bien de la collision étant donné que la map que j'avais créé ne contenait pas de calque "logic"

Laissez un commentaire

Vous pouvez utilisez du markdown pour la mise en forme

Votre adresse de messagerie ne sera pas publiée.

Temporairement, pour lutter contre les bots, il n'est pas permis de mettre http:// dans le commentaire.