Вот основная концепция, которую я быстро набросал:
Код: Выделить всё
public class SpatialHashGridElement
{
HashSet gameObjects = new HashSet();
}
static final int SPATIAL_HASH_GRID_ROWS = 4;
static final int SPATIAL_HASH_GRID_COLUMNS = 5;
static SpatialHashGridElement[] spatialHashGrid = new SpatialHashGridElement[SPATIAL_HASH_GRID_ROWS * SPATIAL_HASH_GRID_COLUMNS];
void updateGrid()
{
float spatialHashGridElementWidth = screenWidth / SPATIAL_HASH_GRID_COLUMNS;
float spatialHashGridElementHeight = screenHeight / SPATIAL_HASH_GRID_ROWS;
for(SpatialHashGridElement e : spatialHashGrid)
e.gameObjects.clear();
for(GameObject go : displayList)
{
for(int i = 0; i < go.vertices.length/3; i++)
{
int row = (int) Math.abs(((go.vertices[i*3 + 1] / spatialHashGridElementHeight) % SPATIAL_HASH_GRID_ROWS));
int col = (int) Math.abs(((go.vertices[i*3 + 0] / spatialHashGridElementWidth) % SPATIAL_HASH_GRID_COLUMNS));
if(!spatialHashGrid[row * SPATIAL_HASH_GRID_COLUMNS + col].gameObjects.contains(go))
spatialHashGrid[row * SPATIAL_HASH_GRID_COLUMNS + col].gameObjects.add(go);
}
}
}

Здесь у нас есть два сталкивающихся игровых объекта (красный и синий). Каждый из них находится в 4 ячейках => поэтому в каждой ячейке будет одна и та же пара для проверки.
Я не могу придумать какой-то эффективный подход, чтобы исключить возможность дублирования пар без необходимости фильтровать сетку после ее создания в updateGrid(). Есть ли какой-нибудь блестящий способ обнаружить, что какая-то пара коллизий уже была вставлена даже во время функции updateGrid? Буду очень благодарен за любые советы!
Подробнее здесь: https://stackoverflow.com/questions/311 ... -hash-grid
Мобильная версия