
Slick2d, leçon 9 :: Changement de carte
09 March 2014 09:36 Slick2d - Leçons 0-9Aujourd'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.
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.
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
- Repo git : GitHub
- Tileset du desert : projet avalon / OpenGameArt
Bonjour, j'ai un problème, ma fonction teleport et change map marchen ttoutes les 2 mais ma fonction changemap n'appelle pas teleport.
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.
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.
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.
Bonjour,
Esque il y aurais une autre solution de faire un changement de map sans les trigger?
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.
A quand la prochaine leçon c'est vraiment génial continuez s'il vous plaits :(
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
Suite à notre discussion par email, nous avons découvert que le problème venais de la carte.
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?
De plus, je peux les générer mais je ne peux pas m'y déplacer
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.
Ok merci
Le probleme venait bien de la collision étant donné que la map que j'avais créé ne contenait pas de calque "logic"