Пересечение объектов

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Ответить
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Пересечение объектов

Сообщение Agiliter »

Добрый день!
Создавая инвентарь, столкнулся с одной проблемой. Но обо всем по порядку. Я создал класс ячейки инвентаря Slot, класс предмета Item и класс InventorySystem. Сам инвентарь и все операции в нем реализованы в классе InventorySystem. Сначала я создаю inventory:Vector.<Slot>, который содержит все ячейки из которых состоит инвентарь, за тем пихаю в ячейки вещи. Всё логично и работает. Хорошо. Я подумал, а почему бы не реализовать drag-and-drop.
Подумал немного и сделал так. В цикле прошелся по всем слотам и прицепил к непустым из них слушатели событий

Код: Выделить всё

inventory[i].getItem().addEventListener(ItemEvent.ITEM_PICKED_UP, onItemPickedUp );inventory[i].getItem().addEventListener(ItemEvent.ITEM_DROPPED, onItemDropped); 
Предварительно, разумеется, каждый из Item внутри собственного класса слушает события захвата и отпускания мыши

Код: Выделить всё

this.addEventListener(MouseEvent.MOUSE_DOWN, onItemPickedUp );this.addEventListener(MouseEvent.MOUSE_UP, onItemDropped);
и диспатчит в обработчике

Код: Выделить всё

private function onItemPickedUp(e:MouseEvent):void  {this.dispatchEvent(new ItemEvent(ItemEvent.ITEM_PICKED_UP));}      private function onItemDropped(e:MouseEvent):void {this.dispatchEvent(new ItemEvent(ItemEvent.ITEM_DROPPED)); }
Соответственно в классе InventorySystem описаны обработчики

Код: Выделить всё

protected function onItemPickedUp(e:ItemEvent):void {    e.target.startDrag();}   protected function onItemDropped(e:ItemEvent):void {     ...     e.target.stopDrag();     e.target.setCenter(mouseX, mouseY); //Получаем point - координаты центра item                 for (var i:int = 0; i < numOfSlots; i++)     {    if(inventory[i].hitTestPoint(e.target.getCenter().x, e.target.getCenter().y, false))    {        trace("Пересекает ячейку с id: " + i);                ...    }     }}   
Всё отлично работает. Специально здесь урезал все операции, чтобы не захламлять код в теме. Но суть итак, думаю, ясна. Я просто перебираю все слоты в inventory и проверяю их на столкновение с центром e.target (т.е. item). В пределах одного инвентаря всё работает отлично.

Но возникла проблема. Мне понадобилось создать два инвентаря и реализовать drag-and-drop между ними. Но я не знаю как проверять столкновение между слотом и предметом в двух разных InventorySystem. Единственное, что пока пришло на ум - это создать два разных массива внутри одного InventorySystem и тогда тупо

Код: Выделить всё

if(inventory1[i].hitTestPoint(e.target.getCenter().x, e.target.getCenter().y, false)if(inventory2[i].hitTestPoint(e.target.getCenter().x, e.target.getCenter().y, false)
Но это ни есть хорошо. Костылей стараюсь избегать. Мне нужен класс, который бы реализовывал инвентарь независимо от того будут там другие инвентари или нет.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Пересечение объектов

Сообщение XELAD »

Код: Выделить всё

function onItemDropped(e:ItemEvent):void{    //...    e.target.stopDrag();     var arr:Array = [inventory1,inventory2,inventory3,inventory999];    for each (var t in arr) {        for each (var i in t) {            if (i.hitTestPoint(mouseX,mouseY,false)) {                trace("Hits", i.name);            }        }    }}
Использовал i в качестве ссылки на экземпляр, а не в качестве индекса.
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Пересечение объектов

Сообщение Agiliter »

Про each-цикл я знаю. Но, боюсь, вы меня не поняли. Это я могу, умею, практикую. Речь о другом. Обработчик onItemDropped(e:ItemEvent) находится внутри InventorySystem, как и вектор Inventory. Мне нужно проверять пересечение либо перетаскиваемого предмета со слотом, либо слота с точкой-центром предмета. Для этого я проверяю: Слот.hitTestPoint(центр предмета).

Однако, возникла проблема, когда я создаю два InventorySystem:
var inventory1:InventorySystem= new InventorySystem();
var inventory2:InventorySystem= new InventorySystem();

В каждом из них свой вектор, содержащий слоты ( inventory:Vector.<Slot>). При этом внутри inventory1 и inventory2 по отдельности предметы перемещаются все хорошо, а вот когда мне нужно перетащить из слота, принадлежащему к inventory1, в слот, принадлежащий inventory2, я не знаю как отслеживать перемещение пересечений.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Пересечение объектов

Сообщение XELAD »

Как я понял: вы создаёте N инвентарей, но каждый не знает другого, у каждого свой обработчик.
Создаёте
static private var <имя>:Array = new Array();
в классе InventorySystem, который будет хранить ссылки на все ваши инвентари.
В public function InventorySystem добавляете строку
<имя>.push(this);
Перетащили предмет, прошлись вышеуказанной функцией по всем имеющимся инвентарям (записаны в <имя>), удалили из инвентаря A предмет, добавили в слот инвентаря B.
Ответить