Форум программистов, компьютерный форум, киберфорум
Наши страницы
ActionScript
Войти
Регистрация
Восстановить пароль
 
agiliter
1 / 1 / 0
Регистрация: 13.12.2012
Сообщений: 102
1

Пересечение объектов в разных классах

11.09.2014, 18:12. Просмотров 385. Ответов 1
Метки нет (Все метки)

Добрый день!
Создавая инвентарь, столкнулся с одной проблемой. Но обо всем по порядку. Я создал класс ячейки инвентаря Slot, класс предмета Item и класс InventorySystem. Сам инвентарь и все операции в нем реализованы в классе InventorySystem. Сначала я создаю inventory:Vector.<Slot>, который содержит все ячейки из которых состоит инвентарь, за тем пихаю в ячейки вещи. Всё логично и работает. Хорошо. Я подумал, а почему бы не реализовать drag-and-drop.
Подумал немного и сделал так. В цикле прошелся по всем слотам и прицепил к непустым из них слушатели событий
ActionScript 3
1
2
inventory[i].getItem().addEventListener(ItemEvent.ITEM_PICKED_UP, onItemPickedUp );
inventory[i].getItem().addEventListener(ItemEvent.ITEM_DROPPED, onItemDropped);
Предварительно, разумеется, каждый из Item внутри собственного класса слушает события захвата и отпускания мыши
ActionScript 3
1
2
this.addEventListener(MouseEvent.MOUSE_DOWN, onItemPickedUp );
this.addEventListener(MouseEvent.MOUSE_UP, onItemDropped);
и диспатчит в обработчике
ActionScript 3
1
2
3
4
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 описаны обработчики
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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[i] и проверяю их на столкновение с центром e.target (т.е. item). В пределах одного инвентаря всё работает отлично.

Но возникла проблема. Мне понадобилось создать два инвентаря и реализовать drag-and-drop между ними. Но я не знаю как проверять столкновение между слотом и предметом в двух разных InventorySystem. Единственное, что пока пришло на ум - это создать два разных массива внутри одного InventorySystem и тогда тупо
ActionScript 3
1
2
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)
Но это ни есть хорошо. Костылей стараюсь избегать. Мне нужен класс, который бы реализовывал инвентарь независимо от того будут там другие инвентари или нет.

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

Однако, возникла проблема, когда я создаю два InventorySystem:
ActionScript 3
1
2
var inventory1:InventorySystem= new InventorySystem();
var inventory2:InventorySystem= new InventorySystem();
В каждом из них свой вектор, содержащий слоты ( inventory:Vector.<Slot>). При этом внутри inventory1 и inventory2 по отдельности предметы перемещаются все хорошо, а вот когда мне нужно перетащить из слота, принадлежащему к inventory1, в слот, принадлежащий inventory2, я не знаю как отслеживать перемещение пересечений.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2014, 18:12
Ответы с готовыми решениями:

Пересечение объектов
Всем добрый день. Может кто подсказать как проверить столкновение объектов...

Мухобойка: пересечение объектов
Подскажите как отследить при клике что объект (муха) находится под мухобойкой....

Проверит пересечение с массивом объектов
Как проверит пересечение с массивом объектов? Массив делаю так: for(var...

Проверка столкновения двух объектов, созданных в разных функциях
Создаю игру. Создал оружие (пулемёт), который при зажатии ЛКМ стреляет, при...

Удалить один из объектов и увеличить другой при соприкосновении объектов.
Как сделать так чтобы (Когда Sprite1 дотронулся до Sprite2 тогда sprite2...

1
Theoryofgames
253 / 237 / 50
Регистрация: 20.12.2011
Сообщений: 707
11.09.2014, 18:43 2
Цитата Сообщение от agiliter Посмотреть сообщение
Я просто перебираю все слоты в inventory[i] и проверяю их на столкновение с центром e.target (т.е. item).
Зачем делать столько лишней работы, если у вас есть координаты мышки и вы можете без перебора определить нужную ячейку?
Собственно я может неправильно понял проблему, но вообще по логике я бы делал примерно так -
1) при событии MOUSE_DOWN на предмете - я бы его запоминал (например можно использоваться статическую переменную класса InventorySystem) и вешал бы на сцену и на инвентори обработчик события MOUSE_UP.
2) При отпускании предмета сначала всплывало бы событие инвентаря (в том случае, если мы отпкстили над ним), и тогда мы проверяем координаты мышки (находим слот в который нужно все положить), смотрим на запомененный предмет и сохраняем его в инвентаре, удаляем слушатель со сцены (так как она нам больше не нужен).
3) Если все-же мы словили событие на сцене, значит перетащили мы куда-то не туда и тогда в зависимости от логики - делаем что-то другое (например удаляем предмет).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2014, 18:43

Код в кадрах или в классах?
А какова разница писать код в кадре или создавать отдельные as файлы?

Прелоадер при коде в классах
Подскажите пжста, как все-таки сделать правильно прелоадер. Есть мейн класс...

Выбор игры! Покадровая или на Классах?
Всем привет! Решил написать среднюю игру для ВК, посоветуйте... как удобнее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru