|
|
|||||
Регистрация: Oct 2008
Сообщений: 52
|
Проблема с контейнерами
Проблема с контейнерами.
Создается игра, в игре следующая структура классов: Main - создает экземпляр класса Game, так же GUI и настройки. Game - создает объекты игры -игроков(экземпляр класса PlayerCreate), препятствия(экземпляр класса ObstacleCreate), полигоны передвижения(экземпляр класса PolyCreate), врагов... Нужна такая структура контейнеров: [IMG][/IMG] Как я понимаю классы PlayerCreate,ObstacleCreate,PolyCreate должны расширять класс Game. Сначала в Main создается экземпляр класса Game Потом не понятно как создать так экземпляры PlayerCreate,ObstacleCreate,PolyCreate чтобы они были в контейнере Game. Каждый класс PlayerCreate,ObstacleCreate,PolyCreate создают внутри себя экземпляр класса Loader -т.е. загружают внешнюю графику. Кроме того нужно еще создавать экземпляры этих классов, делать это в родительском классе нельзя -выходит ошибка стеков - как понимаю при создании экземпляра дочернего класса, родительский класс создается автоматически. Последний раз редактировалось nickorsk; 06.01.2010 в 16:09. |
|
|||||
Регистрация: Nov 2007
Сообщений: 183
|
Цитата:
Вам наверно надо сначала получще проработать - какой класс что делает. Если класс Game подразумевает только какое то поле - на котором размещаются игроки , препятствия, то я бы не наследовал класс "игрок" от класса "рабочее поле" |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Цитата:
game.addChild(player); Имхо, названия классов не очень удачные. Потом сами запутаетесь. |
|
|||||
Регистрация: Oct 2008
Сообщений: 52
|
>mikhailk
А как бы ты назвал?? >Doctor76 Game это рабочее поле, точнее контейнер. Как я понимаю если Game расширяет класс MovieClip -при создании его экземпляра автоматом создается контейнер Game. Тогда если PlayerCreate,ObstacleCreate,PolyCreate расширяют MovieClip , при создании экземпляров этих классов создаются контейнеры - PlayerCreate,ObstacleCreate,PolyCreate. Но сами эти классы создают экземпляры класса Loader. В итоге получается структура Child-ев: Game.PlayerCreate.Loader, Game.ObstacleCreate.Loader, Game.PolyCreate.Loader... Кроме того контейнеры Game.ObstacleCreate, Game.PolyCreate содержат множество экземпляров класса Loader. Конечная цель: Нужно чтобы была проверка hitTestObject - если пересекаются препятствие с полигоном передвижения, то нужно удалить полигон, так как ходить игрок по деревьям не умеет. Но как я понял Хиттестить объекты, которые находятся в разных контейнерах нельзя. В этом вся проблема. Я все правильно понял?? Спасибо заранее за ответы. |
|
|||||
Регистрация: Nov 2007
Сообщений: 183
|
Цитата:
Как это у вас контейнер Game автоматом создается?? Мне кажется вам нужно получше разобраться с ООП |
|
|||||
Регистрация: Oct 2008
Сообщений: 52
|
Да все же создавать несколько Loader не нужно...
Теперь вроде я создал как на картинке структуру, но все равно hitTestObject не работает Последний раз редактировалось nickorsk; 06.01.2010 в 20:27. |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
nickorsk, Вам тут будут постоянно советовать изучать ООП.
Правда в том, что AS3 - это не ООП в его классическом понимании, когда ты постоянно пишешь расширения материнского класса, а некоторая достаточно занятная субстанция, когда все классы на 90% есть расширения класса Sprite или MovieClip, а основное, что нужно не забыть - это добавить их друг в друга и на сцену через addChild. Напрямую они друг с другом родительскими отношениями как правило не связаны. В общем, в Вашем случае надо сделать так: 1. Описать все классы как расширения класса Sprite 2. Создать основной контейнер container, в котором будет вариться вся каша. 3. В этот основной контейнер нужно положить еще один или несколько контейнеров друг на друга. На практике я лично пользуюсь тремя контейнерами, которые последовательно создаю и добавляю в container через addChild() - containerBackground, containerObjects и containerNavigation (статика на заднике, то, что шевелится, и элементы управления всем этим хозяйством). 4. Далее все игровые сущности нужно создать в порядке их появления на сцене и разложить в эти три контейнера опять же через addChild(). 5. После всего этого добавляете сам container на сцену - addChild(container) и все выводится на экран. 6. На container вешаете листенер на все события, которые порождают объекты, копошащиеся внизу, и пишете логику, которая их дергает в зависимости от текущих событий. Когда будете генерировать события внизу, не забудьте ставить для bubbles значение true, иначе события не будут всплывать наверх Возможно, то, что я написал, не совсем понятно - надо зайти в хэлп, взять примеры для классов DisplayObjectContainer, Event/EventDispatcher и запустить их. Там все достаточно прозрачно. Последний раз редактировалось mikhailk; 07.01.2010 в 00:20. |
|
|||||
Регистрация: Oct 2008
Сообщений: 52
|
<mikhailk
Спасибо. Проблема на саммом деле была в другом -у меня не получалось Хиттестить. Оказывается просто я хиттестил после события Event. COMPLITE - объект загружен в память, но его свойства еще не инициализированны(длинна, ширина и пр.) -поэтому хиттестить бессмысленно до Event.INIT. Есл и это не знаешь -в голову идут не нужные мысли, что проблема или в контейнерах или еще в чем. Конечно ваше предложения постараюсь учесть, Спасибо. |
|
|||||
есть две иерархии: иерархия наследования (наследуются свойства родителей) и иерархия отображения графических объектов (один объект вложен в другой, тот в третий и т.д.). не путайте их.
при создании экземпляра класса, он нигде не отображается. его нужно добавлять (addChild) в нужный контейнер, тем самым формирую иерархию отображения. в вашем примере вы должны Game добавить в Main, а Player, Polygons и Obstacle добавить в Game. а как вы будете добавлять зависит от проектирования. в вашем случае целесообразно, чтобы Main при создании Game сразу же и добавлял его, а Game в свою очередь при создании создавал и добавлял экземпляры Player, Polygons и Obstacle.
__________________
я могу стать всем, если только захочу |
|
|||||
Регистрация: Dec 2008
Сообщений: 7
|
1. Описать ... 2. Создать ... 3. В этот основной контейнер ... 4. Далее все ... 5. После всего этого добавляете сам container на сцену - addChild(container) и все выводится на экран. 6. На container вешаете листенер на все события ... Созданный руками, и из библиотеки руками добавленный на сцену клип как, можно-ли добавить и куда??? |
Часовой пояс GMT +4, время: 03:50. |
|
« Предыдущая тема | Следующая тема » |
|
|