Прежде всего, я только на короткое время писал свою собственную игровую логику, поэтому я прошу прощения, если это может показаться прямым.
Я много читал о квад-деревьях и обнаружении столкновений на основе сетки. Я понимаю логику - в основном не проверяйте на столкновение, если объекты в основном не находятся рядом. Но никогда не упоминается, как на самом деле выполнить это.
У меня есть несколько возможных методов в моей голове, но я не уверен, что лучше
Общий тест на столкновение - без оптимизации
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
хранить соседей (метод 1) Но что, если мы хотим оптимизировать коллизии, чтобы проверять только те объекты, которые находятся рядом. Мы все еще пробегаем все объекты или создаем массив с близкими объектами для проверки?
var objects:Array = new Array();
var neighbours:Array = new Array();
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
neighbours.push(objectA, objectB);
}
}
}
//somewhere else
for(i:int = 0; i < neighbours.length; i++){
//only check neighbours
for(j:int = i + 1; j < neighbours.length; j++){
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
Зацикливание всех объектов, но только проверка соседей на наличие коллизий (метод 3) . Другая возможность состоит в том, что мы все еще проходим все циклы, но проверяем, находятся ли объекты рядом, до тестирования коллизии.
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
//they are near - check collision!
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
}
Сохранение объектов в данных мозаики (метод 3) Использование системы на основе мозаики позволяет использовать другую опцию; Сохраните объекты, которые находятся на определенной плитке, в самих данных плитки. Проверьте, на какой плитке находится объект, окружающие плитки содержат любые объекты, с которыми он может столкнуться:
var ObjectA;
for(var i:int = 0; i < 4; i ++){
//check 4 surrounding tiles from object A
if(Object.currentTile + surroundingTile[i] CONTAINS collidable object){
//check collision!
if(objectA.collidesWith(surroundingTile.object){
//handle collision logic
}
}
}
Я всегда стараюсь смотреть на реальный мир в качестве примера. Если бы я хотел сравнить элементы одного цвета, было бы нелогично проверять каждый элемент целиком, даже если они не соответствуют цвету (метод 2, проверьте каждый элемент). Я бы, вероятно, собрал предметы одного цвета (объекты, которые находятся рядом друг с другом) и проверил бы их (метод 1), вместо того, чтобы проверять все.
Это не подходящее сравнение, поскольку элементы в проверке столкновений постоянно перемещаются, поэтому порядок перепутан. Это меня смущает.
Будет ли эффективнее проверять каждый элемент, тем самым устраняя нагрузку, связанную с продолжением генерации массива соседей.
Или более эффективно найти соседей, таким образом, не обходя так много объектов, чтобы проверить столкновение?
Постоянно меняйте данные на каждой плитке, так что, кажется, очень интенсивно, так что я не уверен, что это хорошая идея.
Я думал об игре защиты башни, где башня должна обнаруживать объекты, если объекты находятся в пределах досягаемости, прежде чем она стреляет в нее. И, кажется, глупо проверять все предметы, в то время как в некоторых случаях рядом не будет никаких предметов.
Я прошу прощения за длинный пост, всегда возникают проблемы с объяснением себя!