Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Сетка столкновений (http://www.flasher.ru/forum/showthread.php?t=104442)

qwerter 25.11.2007 23:29

Сетка столкновений
 
Есть объект, который по нажатию мыши стреляет пулями. требуется проверять эту пулю на столкновения с другими объектами, этих объектов слишком много чтобы пользоваться полным перебором. единственный выход это использовать так называемую сетку. получится что проверять придется не все объекты а только те котрые находятся в клетке пули, а точнее в четырех соседних клетках(т.е. рядом с ней). сам алгоритм мне известен, у меня вопрос насчет реализации...
моя идея:создать трехмерный массив(т.е. матрица у каждого элемента которой будет свой массив или объект, в котором мы будем хранить ссылки на объекты, которые принадлежат этой клетке). я застрял на добавлении и удалении объекта в массив или объект. можете объяснить как это делать? и вообще как хранить ссылки на объекты которые принадлежат клетке? или подкиньте другую идею насет реализации.
P.S. ссылк на перевод Nox Noctisa не давать. читал, там описано поверхностно.

wvxvw 26.11.2007 11:03

Array.push() - добавить к концу,
Array.unshift() - добавить к началу
Array.splice(указатель, количество элементов, чем заменить) - заменить\добавить\убрать в произвольном месте.
Array.shift() - убрать первый элемент
Array.pop() - убрать последний

Object.prop = value - любое свойство объекта можно добавить просто так, ну или более замысловато - Object.addProperty("prop",setFunction,getFunction)

Чтобы говорить конкретнее - надо видеть хотя бы простой пример того, что нужно сделать...

qwerter 26.11.2007 13:47

Добавлять в массив я уже пробовал, но со временем массив разрастается. короче там не просто так тупо добавлять.

Chas 26.11.2007 14:08

чувак, среди программистов ясновидящих мало =)
ясно объясни в чем у тебя траблы.
если у тебя 3х мерное пространство, то тебе нужен
четырехмерный массив. 3 размерности массива - это оси x,y,z. Четвертая содержит список объектов с которыми ты проверяешь столкновение. это может быть и массив, по которому ты пройдешься в цикле, или , как подсказывает wvxvw (пальчы сломал набирая ник =)) просто экземпляр Object. На самом деле пример обычного хеширования. при желании можно взять и двумерный массив и делать смещение xPos+yPos+zPos или даже одномерный вообще.
что ты добавляешь в массив, что он у тебя разрастается? пули? так их нужно удолять после столкновения.

qwerter 26.11.2007 20:53

Вложений: 1
вы совсем из меня дурака сделали) эт понятно что трехмерная(третье измерение-как бы хранилище). а пули я удаляю, но остаются пробелы и со временем массив разрастается, что не есть хорошо. например: есть массив из 20-ти объектов, удаляем 10-ый получится пробел и если так продолжать он разрастется, а это не хорошо. вы наверное предложите цикл фор ин, но он тоже будет замедлятся при разрастании массива и вообще не технично это как то так тупо с массива объекты удалять. вот я и спрашиваю, может кто нибудь знает какие алгоритмы или сталкивался с таким. в аттаче клип, для того чтобы ввести вас в курс дела) в сетку я буду заносить и соотвественно удалять танчики. у каждого клипа свой класс.

wvxvw 26.11.2007 21:58

Ну, а чем скомпилированая флешка должна помочь?
Код:

var _arr:Array = [1,2,3,4,5,6,7,8,9,0];
_arr.splice(5,1);
trace(_arr); // 1,2,3,4,5,7,8,9,0

Если удалять элемент из массива не заменяя, а именно удаляя - массив разрастаться не будет...

qwerter 26.11.2007 23:39

Спасибо. Я просто примерно хотел показать в чем дело. Если надо могу и исходник.

Волгоградец 27.11.2007 11:23

Цитата:

Сообщение от qwerter
Спасибо. Я просто примерно хотел показать в чем дело. Если надо могу и исходник.

Надо! (если имеешь ввиду готовый исходник)

qwerter 27.11.2007 20:58

Код:

grid=new Array;
grid.length=_global.width/50;
//делаем двумерный массив
for (var i=0;i<grid.length;i++){
        grid[i]=new Array;
        grid[i].length=_global.height/50;
}
//делаем трехмерный массив
for (var i=0;i<grid.length;i++){
        for (var j;j<_global.height/50;j++){
                grid[i][j]=new Array;
        }
}

в чем ошибка? третье измерение не создает...

Вот ссылка на исходник:
http://www.**************/?1jbl930jlx3

wvxvw 27.11.2007 21:40

Синтаксические ошибки:
grid.length=_global.width/50
Вообще не понятно, что имеется в виду... наверное, создать массив с зарезервированными Н позициями?
grid[i]=new Array
Не хватает круглых скобок после Array.
Создать двумерный массив:
Код:

ar twoD_arr:Array = new Array(10); // 10 is the lenght of the newly created array.
for(var i:Number=0; i<twoD_arr.length; i++){
        twoD_arr[i] = new Array(10);
}
//or, even faster
var twoD_arr:Array = [];
while(twoD_arr.length<10){
        twoD_arr.push(new Array(10));
}



Часовой пояс GMT +4, время: 09:20.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.