Slick2d, leçon 5 :: Collision & Avant plan

02 February 2014 09:00 Slick2d - Leçons 0-9 Java, Jeux, Slick2d, Tutorial

Suite de ma série de tutoriels sur Slick2D. Dans l'article précédent nous avons traité la gestion d'une camera qui suivait notre personnage, mais celui ci traversait toujours les murs.

Théorie

Il existe plein de technique pour gérer la collision, aujourd'hui je vous présente une des plus simple à mettre en place. L'idée est de faire une image masque qui indiquerait ou le personnage peu se déplacer et ou il ne peu pas.

Préparation

Il nous faut rééditer notre carte avec l’éditeur Tiled. Je lui ajoute un nouveau tileset de ma propre création. Cela dis ce n’était pas trop dure :]. tuto-slick2d-037-tuile-logic Je crée un nouveau calque que je nomme logic et je barbouille ma carte afin d'obtenir quelque chose de correct. L'idée est de mettre une tuile partout ou le personnage ne peu pas se déplacer.

tuto-slick2d-037-edition-carte

Code :: Collision à la tuile prés

L’idée de l’algorithme est très simple. Lors de la mise à jour des coordonnées du personnage on calcule les futures coordonnées et si il y a une tuile à cet endroit dans le calque logic c'est qu'il y a collision et on arrête le déplacement.

Première étape, calculer les coordonnés théorique future de notre personnage. Puis nous n'allons rien faire de plus que d'assigné ces coordonnée future à celle du personnage. Ainsi le comportement du code reste identique et tous ce que nous avons fait, est d'introduire des variables intermédiaires futur.

@Override
public void update(GameContainer container, int delta) throws SlickException {
    if (this.moving) {
        float futurX = this.x;
        float futurY = this.y;
        switch (this.direction) {
        case 0: futurY = this.y - .1f * delta; break;
        case 1: futurX = this.x - .1f * delta; break;
        case 2: futurY = this.y + .1f * delta; break;
        case 3: futurX = this.x + .1f * delta; break;
        }
        this.x = futurX;
        this.y = futurY;
    }
    [... mise à jour de la camera ...]
}

A ce niveau la le comportement n'as pas changé. Maintenant avant d'affecter les valeurs futurX et futurY à x et y, on peu chercher si il y a une tuile à ces coordonnées. Pour ce faire on utilise la méthode getTiledImage(x,y,layer) de l'objet map. Il faut noter que dans cette méthode x et y ne sont pas des coordonnées en pixel mais en tuile. Il faut donc faire un petit calcul par rapport aux coordonnées de notre personnage.

@Override
public void update(GameContainer container, int delta) throws SlickException {
    if (this.moving) {
        // [... calcul de futurX et futurY ...]
        Image tile = this.map.getTileImage(
                (int) futurX / this.map.getTileWidth(), 
                (int) futurY / this.map.getTileHeight(), 
                this.map.getLayerIndex("logic"));
        // il y a colision si la tuile "tuture" existe
        boolean collision = tile != null;
        if (collision) {
            this.moving = false;
        } else {
            this.x = futurX;
            this.y = futurY;
        }
    }
    // [... mise à jour de la camera ...]
}

tuto-slick2d-038-premier-resultat

C'est un premier essai. Mais ce n'ai pas encore parfait. En effet la collision est précise à une tuile pré...

tuto-slick2d-039-defaut-collision-tuile

Code :: Collision au pixel

Pour remplir le calque de collision, j'ai utilisé plusieurs types de tuile ce n’était pas pour faire joli. Maintenant en plus de tester la présence d'une tuile on va tester la présence d'un pixel non transparent dans la tuile.

@Override
public void update(GameContainer container, int delta) throws SlickException {
    if (this.moving) {
        // [... calcul de futurX et futurY ...]
        Image tile = this.map.getTileImage(
                (int) futurX / this.map.getTileWidth(), 
                (int) futurY / this.map.getTileHeight(), 
                this.map.getLayerIndex("logic"));
        // il y a collision si il y a une tuile
        boolean collision = tile != null;
        if (collision) {
            // il y a toujours collision si il y a un pixel non transparent dans la tuile 
            Color color = tile.getColor(
                    (int) futurX % this.map.getTileWidth(), 
                    (int) futurY % this.map.getTileHeight());
            collision = color.getAlpha() > 0;
        }
        if (collision) {
            this.moving = false;
        } else {
            this.x = futurX;
            this.y = futurY;
        }
    // [... mise à jour de la camera ...]
}

tuto-slick2d-040-collision-pixel

Un peu de refactoring car cela ne ressemble à rien, voila c'est plus propre.

@Override
public void update(GameContainer container, int delta) throws SlickException {
    if (this.moving) {
        float futurX = getFuturX(delta);
        float futurY = getFuturY(delta);
        boolean collision = isCollision(futurX, futurY);
        if (collision) {
            this.moving = false;
        } else {
            this.x = futurX;
            this.y = futurY;
        }
    }
    // [... mise à jour de la camera ...]
}

private boolean isCollision(float x, float y) {
    int tileW = this.map.getTileWidth();
    int tileH = this.map.getTileHeight();
    int logicLayer = this.map.getLayerIndex("logic");
    Image tile = this.map.getTileImage((int) x / tileW, (int) y / tileH, logicLayer);
    boolean collision = tile != null;
    if (collision) {
        Color color = tile.getColor((int) x % tileW, (int) y % tileH);
        collision = color.getAlpha() > 0;
    }
    return collision;
}

private float getFuturX(int delta) {
    float futurX = this.x;
    switch (this.direction) {
    case 1: futurX = this.x - .1f * delta; break;
    case 3: futurX = this.x + .1f * delta; break;
    }
    return futurX;
}

private float getFuturY(int delta) {
    float futurY = this.y;
    switch (this.direction) {
    case 0: futurY = this.y - .1f * delta; break;
    case 2: futurY = this.y + .1f * delta; break;
    }
    return futurY;
}

Code :: Affichage des layers

La collision c'est bon, mais l'affichage c'est pas ça. Avant tous il ne faut pas afficher le calque de collision, et ensuite il faudrait quand même que le personnage ne passe pas devant les arbres. Il suffit de modifier l'affichage en affichant calque par calque et d'afficher le personnage entre les calques du fond et les calques de l'avant. Voici une capture de chaque calque pour mieux comprendre.

Les 3 premiers calques sont affiché avant le joueur, c'est à dire en dessous. Decoupage en layer 1 Decoupage en layer 2 Decoupage en layer 3 Les deux suivants sont affiché apres le joueur, c'est à dire au dessus. Decoupage en layer 4 Decoupage en layer 5

Et voici le code qui correspond :

@Override
public void render(GameContainer container, Graphics g) throws SlickException {
    // [... gestion de la camera ...]
    this.map.render(0, 0, 0);
    this.map.render(0, 0, 1);
    this.map.render(0, 0, 2);
    // [... affichage du personnage ...]
    this.map.render(0, 0, 3);
    this.map.render(0, 0, 4);
}

Et voila le résultat cela commence presque à ressembler à quelque chose.

tuto-slick2d-046-affichage-multi-plan

Pour aller plus loin

On peu bien sur améliorer les algorithmes, mais la base est la. On peu imaginer faire glisser le personnage lors d'une collision sur une bordure inclinée. On peu aussi imaginer des tuiles différentes qui déclencherait un comportement différent comme une téléportation ou autre chose. La prochaine fois nous verrons comment déclencher des événements lors du déplacement sur la carte.

Ressource

par Shionn, dernière modification le 09 April 2017 09:26
46 réflexions au sujet de « Slick2d, leçon 5 :: Collision & Avant plan »
  • kahnar 20 February 2014 22:02

    Bonsoir

    Je suis étudiant en maths info et a mes heures perdues, je fais des petits jeux en java. Je me suis mis il y a peu a utiliser la librairie Slick2D et j'ai suivi vos tutos qui sont très bien vu que tout fonctionne.

    Sauf que j'ai un petit souci. J'ai voulu extraire un fichier.jar pour pouvoir passer ce petit jeu a un ami. Donc j'ai extrait le jar d'Eclipse et j'ai fait en sorte qu'il marche en utilisant jarsplice.

    Seulement voilà, quand je lance mon .jar, l'application s'ouvre puis se ferme automatiquement (chose qui n'arrivais pas avant l'introduction de la map au format tmx) Du coup je me demandais si il y avit une solution ? Pasque ce serait dommage de garder mon projet pour moi seul sur mon Eclipse.

  • Shionn 21 February 2014 17:11

    Bonjour,

    Je ne connais pas jarsplice. Mon article sur l'ajout de musique pour Dimanche est déjà prêt. Mais pour dimanche en 15 je peu te préparer la création d'un script Maven ou d'un Script Ant permettant la génération d'une archive jouable.

    Dans ton cas le problème viens certainement de la localisation de la carte et des tuiles. Dans mon tuto on charge la carte comme suit : new TiledMap("map/exemple-avec-grotte.tmx"), mais je ne pense pas que cela ne marche pas si la carte est embarqué dans le jar il faut que la carte soit dans un dossier à coter du jar exécutable. Il me serai utile d'avoir la trace de l'erreur pour t'aider. Si tu pouvais me la donner par mail ou par commentaire je pourrai plus facilement t'aider.

    Sinon il est possible de chargé par un flux, par exemple : new TiledMap(this.getClass().getClassLoader().getRessourceAsStream("map/exemple-avec-grotte.tmx")); Mais dans ce cas il ne trouvera certainement pas les tuiles.

    Je vais cherché pour te proposer une solution convenable et en faire un article pour dimanche 2 Mars.

  • youenn 23 February 2014 20:35

    Lors de la création d'un jar avec Eclipse, j'ai ces deux messages d'erreur

    JAR creation failed. See details for additional information.
      Resource is out of sync with the file system: '/Azhur/res/level/lvl_test.tmx'.
      Resource is out of sync with the file system: '/Azhur/res/tileset/Thumbs.db'.
    

    (jai peut etre du oublier de faire qqch mais je ne sais pas du tout ou ...)

  • Shionn 26 February 2014 09:21

    Salut c'est simplement un problème de synchronisation de ton workspace et de ton dossier. Il faut que tu rafraîchisses le contenu de ton projet sous eclipse ( clic droit sur ton projet > Refresh )

    Mais la génération de ce genre de jar n'est pas suffisant. Slick2D utilisant OpenGL à l'aide de native (des .dll sous windows) il faut que le dossier contenant les natives soit indiqué grâce à la directive -Djava.library.path=dossier-des-natives

  • Quentin 07 March 2014 21:49

    bonsoir, très bon tuto mais j'ai un problème, mon personnage bouge dès l'initialisation de la fenêtre, comment faire pour le stopper dès le début et pour le stopper dès qu'on relâche les flèches directionnelles ?

  • Shionn 07 March 2014 22:53

    Merci.

    Je trouve surprenant que ton personnage bouge des l'initialisation. Ta direction est bien initialiser a 0 ? Si tu veux tu peux m'envoyer ton code par mail pour que j'y jette un œil. Quand a ta seconde question elle me donne une idée pour le prochain tuto. Il est vrais que les contrôles que j'ai fait sont loin d'être super.

  • Fanor 13 June 2014 18:45

    Hello, moi j'ai un autre probleme j'ai pris le même code que toi mais j'ai un probleme de colision :/ est ce que la taille de notre fenetre compte ou pas ? car là j'ai beau bidouiller ça ne marche pas :/

  • Shionn 01 July 2014 15:03

    Salut.

    Désolé de te répondre si tard. Je n'ai pas le temps de m'occuper du blog en ce moment. La taille de la fenêtre ne compte pas. En revanche la taille du sprite compte. Si tu ne trouve pas tu peu m'envoyer ton code par mail. J'y jeterai un œil.

  • Bekeno 18 July 2014 10:09

    Bonjour, alors moi en fait mon jeu se lance mais quand je fait une seul touche pour bouger il se fermer et la console m'indique:

    Fri Jul 18 11:05:31 CEST 2014 ERROR:Game.update() failure - check the game code.
    org.newdawn.slick.SlickException: Game.update() failure - check the game code.
    	at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:669)
    	at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
    	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
    	at core.Game.main(Game.java:82)
    

    Après avoir fait des test, j'ai remarquer que c'est la ligne Image tile = map.getTileImage((int) futurX / map.getTileWidth(), (int) futurY / map.getTileHeight(), map.getLayerIndex("logic")); qui posait problème. Une idée?

  • Bekeno 18 July 2014 10:25

    Je crois que c'était parce que je n'avais pas mis les tuiles de collision dans le folder "tuiles" à près du folder map. Bref maintenant le jeu ne s’allume plus et la console me met:

     Fri Jul 18 11:22:14 CEST 2014 ERROR:Resource not found: map/C:/Users/Fabien/Desktop/logic.png
    java.lang.RuntimeException: Resource not found: map/C:/Users/Fabien/Desktop/logic.png
    	at org.newdawn.slick.util.ResourceLoader.getResourceAsStream(ResourceLoader.java:69)
    	at org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:185)
    	at org.newdawn.slick.Image.(Image.java:192)
    	at org.newdawn.slick.tiled.TileSet.(TileSet.java:124)
    	at org.newdawn.slick.tiled.TiledMap.load(TiledMap.java:661)
    	at org.newdawn.slick.tiled.TiledMap.(TiledMap.java:106)
    	at org.newdawn.slick.tiled.TiledMap.(TiledMap.java:90)
    	at core.WindowGame.init(WindowGame.java:34)
    	at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:393)
    	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:317)
    	at core.WindowGame.main(WindowGame.java:125)
    Fri Jul 18 11:22:14 CEST 2014 ERROR:Failed to parse tilemap
    org.newdawn.slick.SlickException: Failed to parse tilemap
    	at org.newdawn.slick.tiled.TiledMap.load(TiledMap.java:695)
    	at org.newdawn.slick.tiled.TiledMap.(TiledMap.java:106)
    	at org.newdawn.slick.tiled.TiledMap.(TiledMap.java:90)
    	at core.WindowGame.init(WindowGame.java:34)
    	at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:393)
    	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:317)
    	at core.WindowGame.main(WindowGame.java:125)
    Caused by: java.lang.RuntimeException: Resource not found: map/C:/Users/Fabien/Desktop/logic.png
    	at org.newdawn.slick.util.ResourceLoader.getResourceAsStream(ResourceLoader.java:69)
    	at org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:185)
    	at org.newdawn.slick.Image.(Image.java:192)
    	at org.newdawn.slick.tiled.TileSet.(TileSet.java:124)
    	at org.newdawn.slick.tiled.TiledMap.load(TiledMap.java:661)
    	... 6 more
    
  • Shionn 18 July 2014 15:18

    Bonjour.

    Sans le code je ne peu pas t'aider. Peu tu me le joindre par email ?

  • Novice 28 October 2014 16:24

    Vos tutoriels sont incroyables le code utilisé est à la fois simple et efficace tout marche..Merci de les avoir mis à notre disposition

  • Shionn 28 October 2014 22:41

    Merci beaucoup.

    Cependant tous conseil est bon a prendre aussi n'esitez pas a me faire des remarques ou des propositions.

  • Vashnak 21 December 2014 11:20

    J'ai une petite remarque à faire, 2 en fait :)

    • Actuellement, il y a un bug avec la gestion des collisions, je ne sais pas ci c'est du aux palettes de collision que tu utilise ou au code, mais quand tu arrives jusqu'à la collision, le personne se bloque évidemment dans la direction voulue, mais également dans les 2 autres directions non inverses. (Petit exemple pour comprendre : s'il y a un lac a droite, j'avance puis je suis bloqué, logique, cependant je ne peux ni aller vers le bas, ni le haut, il faut que je reviennent 1 pixel vers la gauche pour pouvoir, du coup c'est un peu dommage et je pense que la gestion des collisions est peut être a revoir, je fais ça dans la journée et je poste le code)

    • Deuxième point, le key released. Si je me deplace vers le haut, que je veux directement aller a droite (et donc il arrive très souvent qu'on ai pas encore relaché la touche haut et qu'on appuis en même temps sur la droite) du coup, si je relache la touche haut après avoir pressé la touche droite, le personnage s'arrête, il faut donc considérer dans le key released que si la touche est attribué a la direction, ok on s'arrête, mais sinon, non. Pareil qu'en haut, je "répare" ça et je le poste ici

  • Vashnak 21 December 2014 11:33

    Voila la résolution du key released, c'est basique ^^

    public void keyReleased(int key, char c) {
      switch(key){
      case Input.KEY_UP: 
        if(direction == 0) this.moving = false; 
          break;
      case Input.KEY_LEFT: 
        if(direction == 1) this.moving = false;
          break;
      case Input.KEY_DOWN: 
        if(direction == 2) this.moving = false;
          break;
      case Input.KEY_RIGHT: 
        if(direction == 3) this.moving = false;
          break;
        }
    }
    
  • Shionn 21 December 2014 20:07

    Salut et merci pour tes commentaires ^^

    Ton problème de collision proviens de ton implémentation, je n'ai pas rencontré ce problème. Dans ton cas je pense que tu t'ai trompé dans le code des "futurs x et y".

    Pour la second problème ton tu parle, j'en suis bien conscient et il existe plein de manière plus ou moins élégante de le corriger. Je le laisse volontairement justement pour que mes lecteurs cherche un peu par eux mêmes ! Chose que tu as fait et ce qui est une bonne chose :]

  • Shionn 21 December 2014 20:08

    Chuuuuuttttt ! :]

    C'est d’ailleurs je crois la solution que je propose dans les tutos 12/13 par la...

  • Vashnak 21 December 2014 23:45

    Salut

    Si tu n'as pas ce problème, c'est probablement mon implémentation en effet, ou un problème de compilation suite a l'architecture de ma configuration, mais j'en doute.

    J'ai remarqué que le problème vient du fait qu'on utilise des flottant pour se déplacer, mais qu'on cast (et donc qu'on tronque) en int lors de l'appel de la méthode getTileImage(int, int , int). Si par exemple, dans le code de mon deplacement, j'incremente de 1 au lieu de 0.1, je n'ai plus aucun problème, donc je vais regarder scrupuleusement la correction, jusqu'à faire un copier-coller et voir d'ou vient ce probleme ^^

  • Vashnak 21 December 2014 23:50

    Problème résolu ! mon implémentation n'était pas tout a fait juste sur un point ^^ c’était l'appel de isCollision et des paramètres que je passais qui était pas top.

  • Shionn 22 December 2014 08:21

    Je suis comptent que tu ai résolu ton problème, je t'avoue que j'avais pas de piste pour t'aider à ce niveau. Ta remarque sur le casting est pertinente, je regarderai si cela peu poser problème dans d'autre cas, mais j'en doute.

  • Ryu 01 March 2015 14:03

    Bonjour, je suis votre super tuto pour développer une idée que j'avais de manière concrète.

    Tout s'est bien déroulé jusqu'au moment ou je lance et lorsque j'appuie sur touche de déplacement. J'ai un : "java.lang.ArrayIndexOutOfBoundsException". Cherchant alors pendant un long moment d'ou peut provenir l'erreur. En vain.. j'ai trifouillé sans trouver.

    Pourriez vous m'aider ?

    PS: J'ai de même, copié/collé votre source code, mais la même chose se produit..

  • Shionn 01 March 2015 14:16

    Bonjour,

    bien sur que je peu t'aider ^^, envoie moi ton code par mail avec si possible la stacktrace complète.

  • Vincent 15 March 2015 02:25

    Bonjour,

    Super tuto ! Nothing else :)

    Cependant j'ai un soucis, depuis que j'ai implémenté la collision au pixel, j'arrive à faire traverser mon personnage au travers des obstacles en spammant les touches directionnelles. Celui avance pas à pas sur l'obstacle, mais finis par le traverser ! Est-ce un problème dût à Tiled ?

    Merci !

  • Shionn 15 March 2015 09:16

    Non ca ne peu pas être du à slick, vu que slick ne fait pas de phisique. C'est du a ton implémentation, désoler ;]

    // Cela se passe ici : 
    float futurX = getFuturX(delta);
    float futurY = getFuturY(delta);
    boolean collision = isCollision(futurX, futurY);
    if (collision) {
      this.moving = false;
    } else {
      this.x = futurX;
      this.y = futurY;
    }
    

    Comme tu le vois on calcul les coordonnées qu'aura le personnage dans le futur, des coordonnées hypothétiques, ensuite on test si ces future coordonnée sont dans un mur, et si c'est le cas on arrête le perso sinon on lui assigne les nouvelle coordonné.

    L'algo que je propose se comporte exactement pareil en collision au pixel / block.

    L'autre erreur que je peu voir c'est ici sur l'appel à la méthode isColision(x,y). Si dans cette méthode tu as utilisé this.x et this.y à la place des paramètres x, y alors en effet, le bug que tu décrit peu ce produire.

    Si tu as toujours le problème, je t'invite à m'envoyer le code par mail pour que je puisse t'aider d'avantage.

  • Fuzo 16 March 2015 14:53

    Bonjour,

    Merci pour ce super tuto bien complet et très clair ! :)

    J'ai juste un problème avec la collision. J'ai suivis à la lettre le tuto mais il semblerais que ma couche logique soit "décalée". la collision, au lieu de s'effectuer sur le lac, se fait plus loin dans la même direction (beaucoup plus loin).

    Je ne comprend pas très bien d'où cela puisse venir.

    Merci

  • Shionn 16 March 2015 16:58

    Salut Fuzo,

    • Soit tu t'es trompé dans le test de collision (méthode isCollision).
    • Soit tu t'es trompé dans l'affichage, décalage de la carte ou du personnage.

    Commence par reprendre l'affichage de la carte et du personnage. Ensuite reprend l'algo de collision à 0.

    Tu peu aussi comparer le code avec ce qui est dispo sur le repo git.

    Si tu as toujours le problème, envoie moi ton code par mail j'y jetterai un œil.

  • Rémi L. 01 August 2015 00:57

    Salut à tous !

    Je viens d'arriver sur votre tuto ;) Je connais déjà pas mal les manip' et ce tuto est simple mais efficace bravo !

    Je commente juste pour dire : Mais c'est une parcelle de la map de Zelda sur Gameboy pas vrai !? :D

  • Shionn 16 August 2015 07:30

    Salut

    Franchement j'ai séché le jeux étant petit, et ça me dis rien, quand j'ai fais cette carte je pensais a aucun jeux en particulier.

    PS : désoler d'avoir pris du temps à te répondre.

  • Zavavore 28 January 2016 19:39

    Bonjour, je sais que ça fait deux ans qu'il n'y a plus de commentaires et je ne sais pas si ce site est toujours géré mais j'ai le même soucis que deux des personnes qui ont posté un commentaire : celui où lorsque j'appuie sur une touche pour me déplacer le jeu se ferme direct avec les messages d'erreur suivant dans la console :

    Thu Jan 28 19:34:54 CET 2016 ERROR:-1
    java.lang.ArrayIndexOutOfBoundsException: -1
    	at java.util.ArrayList.elementData(Unknown Source)
    	at java.util.ArrayList.get(Unknown Source)
    	at org.newdawn.slick.tiled.TiledMap.getTileImage(TiledMap.java:197)
    	at main.gameTest.isCollision(gameTest.java:112)
    	at main.gameTest.update(gameTest.java:89)
    	at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:663)
    	at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
    	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
    	at main.gameTest.main(gameTest.java:136)
    Thu Jan 28 19:34:54 CET 2016 ERROR:Game.update() failure - check the game code.
    org.newdawn.slick.SlickException: Game.update() failure - check the game code.
    	at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:669)
    	at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:411)
    	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:321)
    	at main.gameTest.main(gameTest.java:136)
    

    Je ne sais pas comment vous avez réglé le problème mais si vous avez la solution j'aimerai bien l'avoir merci !

  • Shionn 28 January 2016 19:55

    Salut ;) Je suis pas mort :p

    Ici ton problème n'est pas le même que les autres. Ça viens soit de ta carte soit de ton code. Relis bien le tuto, si tu n'y arrives pas envoie ton code par mail avec la carte je joue au debuguer ;)

  • Zavavore 30 January 2016 22:53

    Ah ça doit alors être ma carte mais qu'est-ce qui pourrait causer ce soucis ?

    Parce que lorsque je me déplace sur la carte sans les lignes de code de la collision ça fonctionne bien mais des que je met la détection des blocs "logic" des que j'appuie sur une touche pour me déplacer ça me ferme la fenêtre direct.

    Je vais la modifier pour voir ce qui n'irai pas

  • Shionn 31 January 2016 07:58

    Probablement l'index du layer de colision. Je pourrai te le dire en 5minute si j'avais le code sous les yeux avec la carte.

  • Shionn 31 January 2016 21:09

    Si vous rencontrez le même problème que zavavore, son problème était que le nom du calque de collision diffère entre le code et le fichier.

  • ultraime 02 February 2016 13:19

    Salut ,

    je voulais savoir si il y avait un moyen d'animer les élements du décord (l'eau par exemple) via Tiled ?

  • Shionn 02 February 2016 14:12

    Nativement non ce n'est pas possible. Et même si tiled le supporte, slick le supportera pas.

    J'ai déjà évoqué des solutions de couternement facile à mettre en place dans led commentaire de la leçon 3.

  • ultraime 03 February 2016 13:13

    Merci beaucoup :).

  • Clément 10 February 2016 10:18

    Bonjour,

    pour les besoins de mon projet j'ai besoin de faire spawn des bâtiments et des unités (un peu a la manière de Starcraft mais en simplifié bien sur) je voulais savoir si c’était possible de gérer dynamiquement la création des hitbox de ces bâtiments. (j’espère juste que le seul moyen n'est pas de faire des conditions "if" dégueulasses...)

    Merci d'avance pour la réponse !

  • Shionn 10 February 2016 11:43

    Bonjour clément.

    Bien sur qu'il est possible de faire un belle collision avec des bâtiments que tu ajouterais ou avec des objets qui se déplaceraient. Mais Cela demande de l'algorithmie en plus. Dans ton cas j'ajouterai une List<Batiment> chaque bâtiment avec sa coordonnée (x/y) et sa taille (w/h) ce qui délimite un rectangle. Si le personnage entre dans un des rectangles alors collision. Après on peu s'amuser à tester au pixel prêt avec l'image du bâtiment.

  • Clément 10 February 2016 15:01

    En effet je n'y avait pas pensé

    Merci pour la réponse rapide !

  • Baudelaire 07 March 2016 10:44

    Bonjour, on essaie de faire un petit jeu sous Java et on n'arrive pas à faire les collisions malgrè qu'on ait suivi toutes vos inscrutions. Pourrions-nous vous envoyez notre codage pour trouver le problème ? Merci.

  • Shionn 07 March 2016 11:33

    Bien sur sans soucis :] tu trouvera mon mail dans la partie contact du site.

  • Hugo C 12 March 2016 16:05

    Bonjour Shionn, je n'arrive pas à faire fonctionner les collisions à la tuile et au pixel pres alors que je possede le meme code que vous, pourriez-vous m'aider ??

  • Shionn 12 March 2016 16:54

    Bien sur sans soucis. Je te laisse m'envoyé ton code par mail que tu trouvera dans la categorie "contact"

  • Ioannis Noukakis 28 July 2016 17:47

    Merci encore pour vos tutoriels qui m'auront été grandement utiles! En trouver un de cette qualité et en français de surcroît dépassait toute mes espérances!

    Merci encore!

    Ioannis Noukakis

  • Sami 26 February 2017 21:21

    Salut, Je ne comprends pas comment le personnage peut se déplacer après avoir repéré une collision sachant qu'on a set le this.moving à false.

  • Sami 26 February 2017 21:30

    En fait tout est good j'ai compris mon erreur

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.