Détection de collision avec de nombreux objets
Je me suis concentré principalement sur les aspects Graphiques pour créer un peu 2DGame. J'ai regardé/a regardé plusieurs tutos mais aucun d'entre eux ont été que plus agréable. J'ai déjà un joueur(un carré) déplacement et d'entrer en collision avec d'autres carrés sur l'écran. La gravité etc. Sont également effectués.
S'il y a seulement que beaucoup d'objets comme on le voit sur l'écran (30*20), tout fonctionne parfaitement bien. Mais si je l'augmenter à disons 300*300 le programme commence à courir très lent car il doit vérifier si de nombreux objets.
Vraiment, je ne comprends pas comment des jeux comme Minecraft peut travailler avec TOUS les blocs et mon programme donne déjà sur 300*300 blocs.
J'ai déjà essayé de SEULEMENT vérifier les collisions lorsque les objets sont visibles, mais qui conduit le programme de vérification de chaque objet pour la visibilité de pointe pour le même problème.
Ce que je fais mal? Aide appréciée.
Je vais poster quelques code qui me permet de gérer les collisions.
player.collision(player, wall);
public void collision(Tile object1, Tile[] object2){
collisionCheckUp(object1, object2);
collisionCheckDown(object1, object2);
collisionCheckLeft(object1, object2);
collisionCheckRight(object1, object2);
}
public void collisionCheckDown(Tile object1, Tile[] object2){
for (int i = 0; i < Map.tileAmount; i++){
if(object2[i] != null && object2[i].visible)
{
if(object1.isCollidingDown(object2[i])){
object1.collisionDown = true;
return;
}
}
}
object1.collisionDown = false;
}
public void compileHullDown(){
collisionHull = new Rectangle((int)x+3, (int)y+3, width-6, height);
}
int wallCount = 0;
for (int x=0;x<Map.WIDTH;x++) {
for (int y=0;y<Map.HEIGHT;y++) {
if (Map.data[x][y] == Map.BLOCKED) {
wall[wallCount] = new Tile(x * Map.TILE_SIZE, y * Map.TILE_SIZE);
wallCount++;
}
}
}
source d'informationauteur Gjallar
Vous devez vous connecter pour publier un commentaire.
L'approche habituelle pour optimiser la détection de collision est d'utiliser un l'espace de la partition de classer et de gérer vos objets.
L'idée générale de la méthode est de construire un arbre représentant l'espace et de mettre vos objets dans l'arbre, en fonction de leurs positions. Lorsque vous calculer les collisions, vous parcourez l'arborescence. De cette façon, vous aurez à effectuer de manière significative moins de calculs que l'utilisation de l'approche par force brute, parce que vous serez en ignorant tous les objets dans les branches autres que celui que vous êtes traversant. Minecraft et similaires probablement utiliser octrees de collision (et peut-être pour le rendu trop).
Le plus commun de l'espace de la partition structures sont BSP-Arbreskd-Trees (un type spécial de BSP-arbres). L'approche la plus simple serait d'utiliser un uniforme de l'espace de la partition pour les start - split votre espace dans l'axe aligné moitiés.
La meilleure ressource sur la collision que j'ai découvert est ce livre. Il doit préciser toutes vos questions sur le sujet.
C'est que si tu voulais bien faire les choses. Si vous voulez le faire rapidement, vous pourriez tout simplement de l'échantillon de la couleur du tampon autour de votre personnage, ou seulement dans la direction de mouvement pour déterminer si un obstacle est proche.
Comme Kostja mentionné, il sera utile pour vous de partition de votre espace. Toutefois, vous aurez besoin d'utiliser QuadTrees au lieu de Octrees que vous êtes seulement en 2D, pas de la 3D.
Voici une belle l'article pour vous obtenir a commencé sur les QuadTrees.
Vous pouvez réduire vos frais généraux par un facteur de 4, au lieu de calculer les collisions pour haut/bas/gauche/droite, calcul des collisions une fois et à l'aide de la position relative des deux objets pour savoir si vous avez touché un plancher, le mur ou le plafond. Une autre bonne idée est de ne payer l'attention sur les objets qui se trouvent à proximité, peut-être une fois tous les 0,25 secondes, faire une liste de tous les objets qui sont sans doute assez proches d'entrer en collision avec le côté de 0,25 secondes?