Partage
  • Partager sur Facebook
  • Partager sur Twitter

Collisions...

    2 décembre 2016 à 20:55:19

    Bonjour à tous, j'ai crée un petit jeux en Java style "spaceInvader", il contient beaucoup d'objets et de variables mais pour tester mes collisions deux objets m’intéressent :

    un tableau d'invaders et un tableau de bullets

    J'effectue des actions quand une bullet touche un invader, pour le moment mon code se présente comme-ceci

    		for(int i = 0; i < bullets.length; i++)
    		{
    			for(int y = 0; y < invaders.length; y++)
    			{
    				if(bullets[i].isAlive() && bullets[i].getType() == 0 && invaders[y].isAlive())
    				{
    					if(Math.abs((invaders[y].getX()) - bullets[i].getX()) <= (Invader.taille+Bullet.taille)/2)
    					{
    						   if(Math.abs((invaders[y].getY()) - bullets[i].getY()) <= (Invader.taille+Bullet.taille)/2)
    						   {
    							   invaders[y].kill();
    							   bullets[i].kill();
    							   bonus.popBonus(invaders[y].getX(), invaders[y].getY());
    							   boum1.play();
    						   }
    					}
    				}
    			}
    		}

    Le problème se pose à certains niveaux quand j'ai 50 invaders et presque 100 bullets : chute de FPS

    J'aimerais savoir si vous avez des pistes pour gérer les collisions de manière moins gourmande puisque celles-ci doivent être testées à chaque rafraichissement d'image

    Le fait que les "hitBox" soient carrées est pour le moment volontaire

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2016 à 21:26:27

      Bonjour,

      Voici quelques pistes

      1) utilise des boucles for-each pour éclaircir ton code

      2) tu peux tester la validité des projectiles avant la boucle des invaders

      3) quand un projectile est tué, tu peux sortir de la boucle direct (instruction break)

      4) on peut faire (un peu) plus simple pour détecter les collisions

      • Partager sur Facebook
      • Partager sur Twitter
        2 décembre 2016 à 22:15:04

        Salut,

        Le problème est que tu test les collisions entre tous les objets entre eux, même si il y a de fortes chances que la plupart des objets ne soient même pas proche l'un de l'autre. En gros, énormément de calculs inutiles, pour au final peut-être seulement une ou deux collisions détectées.

        Il va falloir que t'implémentes une structure de données pour partitionner ton espace, type grille ou quadtree pour les plus "simples" (parce que ça reste relativement complexe à appréhender).

        Les mots clef à chercher sur le net : partitionnement de l'espace (space partitioning), quadtree, partition binaire de l'espace (binary space partitioning)

        Un article en Anglais assez intéressant et complet : http://gameprogrammingpatterns.com/spatial-partition.html

        Si tu choisis un algo en particulier et que t'as des questions hésite pas

        • Partager sur Facebook
        • Partager sur Twitter
          2 décembre 2016 à 22:37:13

          Ok merci beaucoup, je penses que c'est ce genre de trucs que je cherchais :)

          Je vous tiens au courant :)

          • Partager sur Facebook
          • Partager sur Twitter
            4 décembre 2016 à 12:09:52

            Est-ce que l'idée de gérer les collisions dans un Thread séparé vous parait judicieuse?

            • Partager sur Facebook
            • Partager sur Twitter
              4 décembre 2016 à 23:30:36

              Je saurais pas te dire comme ça, ça dépends comment tu as architecturé le moteur de ton jeu. En tout cas si tu laisses ta double boucle (une sur les "bullets" et une sur les "invaders") comme dans le code que tu nous as copié, même si tu déplaces ça dans un autre thread ça ne changera pas le problème
              • Partager sur Facebook
              • Partager sur Twitter

              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