Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема с контейнерами (http://www.flasher.ru/forum/showthread.php?t=134633)

nickorsk 06.01.2010 16:06

Проблема с контейнерами
 
Проблема с контейнерами.
Создается игра, в игре следующая структура классов:
Main - создает экземпляр класса Game, так же GUI и настройки.
Game - создает объекты игры -игроков(экземпляр класса PlayerCreate), препятствия(экземпляр класса ObstacleCreate), полигоны передвижения(экземпляр класса PolyCreate), врагов...
Нужна такая структура контейнеров:
[IMG]http://pikucha.ru/248597/Mygame.jpeg[/IMG]

Как я понимаю классы PlayerCreate,ObstacleCreate,PolyCreate должны расширять класс Game. Сначала в Main создается экземпляр класса Game
Код AS3:

game:Game=new Game()

Потом не понятно как создать так экземпляры PlayerCreate,ObstacleCreate,PolyCreate чтобы они были в контейнере Game.
Каждый класс PlayerCreate,ObstacleCreate,PolyCreate создают внутри себя экземпляр класса Loader -т.е. загружают внешнюю графику. Кроме того нужно еще создавать экземпляры этих классов, делать это в родительском классе нельзя -выходит ошибка стеков - как понимаю при создании экземпляра дочернего класса, родительский класс создается автоматически.

Doctor76 06.01.2010 16:24

Цитата:

Game - создает объекты игры -игроков(экземпляр класса PlayerCreate), препятствия(экземпляр класса ObstacleCreate), полигоны передвижения(экземпляр класса PolyCreate), врагов...
Нужна такая структура контейнеров:
А что такое сам класс Game? Почему PlayerCreate, PolyCreate,... доджны от него именно наследоваться?
Вам наверно надо сначала получще проработать - какой класс что делает.
Если класс Game подразумевает только какое то поле - на котором размещаются игроки , препятствия, то я бы не наследовал класс "игрок" от класса "рабочее поле"

mikhailk 06.01.2010 16:31

Цитата:

Потом не понятно как создать так экземпляры PlayerCreate,ObstacleCreate,PolyCreate чтобы они были в контейнере Game.
var player:PlayerCreate = new PlayerCreate();
game.addChild(player);

Имхо, названия классов не очень удачные.
Потом сами запутаетесь.

nickorsk 06.01.2010 17:12

>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 - если пересекаются препятствие с полигоном передвижения, то нужно удалить полигон, так как ходить игрок по деревьям не умеет. Но как я понял Хиттестить объекты, которые находятся в разных контейнерах нельзя. В этом вся проблема.

Я все правильно понял?? Спасибо заранее за ответы.

Doctor76 06.01.2010 17:23

Цитата:

Кроме того контейнеры Game.ObstacleCreate, Game.PolyCreate содержат множество экземпляров класса Loader.
Зачем вам столько Loader -ов
Как это у вас контейнер Game автоматом создается??

Мне кажется вам нужно получше разобраться с ООП

nickorsk 06.01.2010 18:28

Да все же создавать несколько Loader не нужно...
Теперь вроде я создал как на картинке структуру, но все равно hitTestObject не работает :(

mikhailk 07.01.2010 00:17

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 и запустить их. Там все достаточно прозрачно.

nickorsk 07.01.2010 17:01

<mikhailk
Спасибо. Проблема на саммом деле была в другом -у меня не получалось Хиттестить.
Оказывается просто я хиттестил после события Event. COMPLITE - объект загружен в память, но его свойства еще не инициализированны(длинна, ширина и пр.) -поэтому хиттестить бессмысленно до Event.INIT. Есл и это не знаешь -в голову идут не нужные мысли, что проблема или в контейнерах или еще в чем.
Конечно ваше предложения постараюсь учесть, Спасибо.

Felicast 08.01.2010 00:55

есть две иерархии: иерархия наследования (наследуются свойства родителей) и иерархия отображения графических объектов (один объект вложен в другой, тот в третий и т.д.). не путайте их.
при создании экземпляра класса, он нигде не отображается. его нужно добавлять (addChild) в нужный контейнер, тем самым формирую иерархию отображения.
в вашем примере вы должны Game добавить в Main, а Player, Polygons и Obstacle добавить в Game. а как вы будете добавлять зависит от проектирования.
в вашем случае целесообразно, чтобы Main при создании Game сразу же и добавлял его, а Game в свою очередь при создании создавал и добавлял экземпляры Player, Polygons и Obstacle.

oloks 09.01.2010 23:28

Код HTML:

1. Описать ...
2. Создать ...
3. В этот основной контейнер ...
4. Далее все ...
5. После всего этого добавляете сам container на сцену - addChild(container) и все выводится на экран.
6. На container вешаете листенер на все события ...

mikhailk - а конкретного кода по строчке, обобщённо, синтаксис.

Созданный руками, и из библиотеки руками добавленный на сцену клип
как, можно-ли добавить и куда???


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

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