Битовая карта Javascript для простого обнаружения столкновений - PullRequest
2 голосов
/ 04 января 2012

Мне нужна помощь / совет для улучшения / комментирования моего текущего дизайна, пожалуйста:)

Это относится к обнаружению столкновений в простой игре: динамические тела (движущиеся) могут сталкиваться со статическими телами (то есть с землей, стенами)).Я портирую свою модель Obj-C на Javascript и сталкиваюсь с вопросами памяти / производительности относительно моего способа реализации этого.

Я использую очень простой подход: массив массивов представляет мой уровень в терминахс непрозрачностью.

  • бит установлен в 0: прозрачная область, тела могут проходить через

  • бит установлен в 1: непрозрачная область, тела сталкиваются

Тестирование прозрачности / непрозрачности пикселя происходит следующим образом:

if (grid[x][y]) {
 // collide!
}

Мои знания JS довольно ограничены с точки зрения производительности / памяти и могутОценить, насколько хорош этот подход :) Не знаю, насколько эффективно использовать массивы.

Просто представьте себе уровень шириной 1000 пикселей и высотой 600 пикселей.Это небольшой уровень, но это уже означает массив, содержащий 1000 массивов, каждый из которых содержит до 600 записей.Кроме того, я не нашел способа обеспечить создание элемента размером 1 бит, как у языков низкого уровня.

Используя следующее, могу ли я быть уверен, что запись не является чем-то «другим», чемнемного?

grid[x][y] = true;
grid[x][y] = false;

Спасибо за ваше время и комментарии / советы!

J.

Ответы [ 2 ]

1 голос
/ 04 января 2012

Если у вас есть сетка 1000x600, вы можете гарантировать, что у вас есть как минимум 601 массивов в памяти (1001, если вы делаете это наоборот).

Вместо того, чтобы делать это, я бы рассмотрел использование 1массив или (предпочтительно) один объект со схемой отображения.

var map = {};
map["1x1"] = 1;
map["1x3"] = 1;
// assume no-hits are empty and free to move through

function canGoIn(x, y) {
    return map.hasOwnProperty(x + "x" + y);
};

Поочередно;

var map = [];
var width = 600;
map.push(0);
map.push(1);
// etc

function canGoIn(x, y) {
    return map[(x * width) + y] == 1;
}
0 голосов
/ 04 января 2012

логическое значение не будет храниться как один бит, и это также верно для любого другого языка, который я знаю (включая C).

Если у вас есть проблемы с памятью, вы должны рассмотреть возможность реализации битового массива, подобного этому: https://github.com/bramstein/bit-array/blob/master/lib/bit-array.js

Вам нужно будет превратить ваш двумерный массив в простой вектор и преобразовать ваши координаты x, y следующим образом: offset = x + (y * width);

Просмотр массива все равно приведет к умножению для оценки смещения, поэтому использование вектора эквивалентно массивам.

Но я подозреваю, что вызов функции (если вы используете битовый массив) и выполнение некоторых вычислений внутри приведут к худшим результатам.

Я не думаю, что вы можете одновременно играть и экономить память.

...