Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Slick][Algo] Traitement des collisions

    14 février 2012 à 8:57:02

    Bonjour à tous les Zeros !

    Après quelques semaines sans poster de questions, je reviens vers vous avec une petite demande de fonctionnement. Je m’explique :

    Je code pour le moment (mais de façon trèès légère :D ) un petit jeu en Java à l’aide de la librairie SLICK2D. Tout fonctionne parfaitement pour le moment, excepté la gestion des collisions qui est … Comment dire… Un peu foireuse :D

    Je précise que la Détection des collisions ne pose pas de problème ! Uniquement les traitements de celles-ci. Pour vous permettre de visionner un peu la chose, je vais vous détailler un petit peu comment fonctionne mon code (Bien que je ne posterai pas les 5000 lignes de codes ici xD)


    Si vous souhaitez m'aider, voici le fonctionnement global de l'application (Attention, c'est du lourd, du très très lourd ! :D )


    Tout d’abord, je travaille sur une TiledMap avec comme référence (0,0) la tile centrale de celle-ci.
    Ainsi, chaque personnage possède une position absolue et une position en Tiles. Cette position permet de positionner n’importe quelle entité sur la carte. Par exemple, sur une carte de 101tilesx101tiles, la position absolue (0,0) du personnage correspondra à la tile (50.5,50.5) => Ce qui correspond à positionner le centre du personnage sur le centre de la tile (50,50).

    Ensuite, chaque entité travaille avec une Touchzone qui est un Cercle. Cette Touchzone permet de déterminer sa portée (morsures et griffes, explosifs,etc) d’une entité. La détection de collision est relativement simple car il s’agit de savoir si la somme des deux rayons est supérieure ou non à la distance séparant les deux positions absolues. Cette détection est extrêmement rapide et suffisamment précise pour son utilisation.
    Chaque entité possède une position absolue courante et une position absolue de fin, qui permet de déterminer si par exemple, un projectile a perdu toute sa vitesse et tombe à terre, ou bien si un ennemi a atteint un point de parcours et doit changer de direction. Chaque entité possède aussi un vecteur de direction, que permet de garder une vitesse constante sur différentes machines équipées de CPU différents.

    Chacune de ces entité possède une fonction makeOneStep() et goBackOneStep() qui permettent, respectivement, de calculer la prochaine position de l’entité ou de revenir à son ancienne position dans le temps.
    Enfin, toute entité est gérée par l’EntityManager qui se charge d’obtenir de nouvelles entités, de mettre à jours ces dernières, de les garder en mémoire, de les dessiner sans pour autant ralentir le programme. Je n’entrerai pas dans le code complet de l’EntityManager car c’est relativement long et complexe à expliquer, mais sachez que l’EntityManager garde la référence des objets créés en mémoire sous forme d’ArrayLists.
    Néanmoins, le problème se situe après la mise à jour des Entités Enemies.

    Je souhaite qu’après la mise à jour des Enemies, le calcul des collisions se fasse et que pour chaque entité collisionnée, on revienne à sa position précédente. Néanmoins, pour des raisons obscures, cela ne fonctionne pas correctement … Parfois des entités se traversent quand même car on dirait qu’elles ne tiennent pas compte de la position de celle qui est censée être « Collisionnée ».


    Désolé d'avoir créé ce long post, mais je préfère essayer d'être le plus précis possible pour obtenir de l'aide :)

    Ma question est : Sous forme algorithmique, auriez vous une suggestion afin de traiter toutes les entités qui sont entrées en collisions?


    Voici le code que je voudrais adapter :


    //Update part of the Enemies
    //indexEnemies = position de la derniere entité de type ENEMY active
    for(i=0;i<indexEnemies;i++){	
              arrayEnemy.get(i).update(delta, container, map);
    }
    else{
         break;
    }
    //Après update, si Collision => Faire un retour en arrière pour ENEMY_I
    for(i=0;i<indexEnemies;i++){	
         if(arrayEnemy.get(i).isActive()){
            	//Test collisions for all enemies (they are stupid)		
    		for(j=0;j<indexEnemies && j!=i;j++){
    			if(arrayEnemy.get(i).collideWith(arrayEnemy.get(j))){
       		         //If ENEMY_I touch ENEMY_J
       		arrayEnemy.get(i).goBackOneStep();
                    arrayEnemy.get(i).setStatus("WAITING");
    		break;
    	    }											
          }
    }
    


    Si vous avez une quelconque idée afin de gérer ces collisions, je suis tout ouïe :)

    D'avance, Merci :)
    • Partager sur Facebook
    • Partager sur Twitter

    [Slick][Algo] Traitement des collisions

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown