Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.01.2010, 16:06
nickorsk вне форума Посмотреть профиль Отправить личное сообщение для nickorsk Найти все сообщения от nickorsk
  № 1  
Ответить с цитированием
nickorsk

Регистрация: Oct 2008
Сообщений: 52
По умолчанию Проблема с контейнерами

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

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


Последний раз редактировалось nickorsk; 06.01.2010 в 16:09.
Старый 06.01.2010, 16:24
Doctor76 вне форума Посмотреть профиль Отправить личное сообщение для Doctor76 Найти все сообщения от Doctor76
  № 2  
Ответить с цитированием
Doctor76
 
Аватар для Doctor76

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

Старый 06.01.2010, 16:31
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 3  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
Потом не понятно как создать так экземпляры PlayerCreate,ObstacleCreate,PolyCreate чтобы они были в контейнере Game.
var player:PlayerCreate = new PlayerCreate();
game.addChild(player);

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

Старый 06.01.2010, 17:12
nickorsk вне форума Посмотреть профиль Отправить личное сообщение для nickorsk Найти все сообщения от nickorsk
  № 4  
Ответить с цитированием
nickorsk

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

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

Старый 06.01.2010, 17:23
Doctor76 вне форума Посмотреть профиль Отправить личное сообщение для Doctor76 Найти все сообщения от Doctor76
  № 5  
Ответить с цитированием
Doctor76
 
Аватар для Doctor76

Регистрация: Nov 2007
Сообщений: 183
Цитата:
Кроме того контейнеры Game.ObstacleCreate, Game.PolyCreate содержат множество экземпляров класса Loader.
Зачем вам столько Loader -ов
Как это у вас контейнер Game автоматом создается??

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

Старый 06.01.2010, 18:28
nickorsk вне форума Посмотреть профиль Отправить личное сообщение для nickorsk Найти все сообщения от nickorsk
  № 6  
Ответить с цитированием
nickorsk

Регистрация: Oct 2008
Сообщений: 52
Да все же создавать несколько Loader не нужно...
Теперь вроде я создал как на картинке структуру, но все равно hitTestObject не работает


Последний раз редактировалось nickorsk; 06.01.2010 в 20:27.
Старый 07.01.2010, 00:17
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 7  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: 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.
Старый 07.01.2010, 17:01
nickorsk вне форума Посмотреть профиль Отправить личное сообщение для nickorsk Найти все сообщения от nickorsk
  № 8  
Ответить с цитированием
nickorsk

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

Старый 08.01.2010, 00:55
Felicast вне форума Посмотреть профиль Отправить личное сообщение для Felicast Найти все сообщения от Felicast
  № 9  
Ответить с цитированием
Felicast
 
Аватар для Felicast

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
есть две иерархии: иерархия наследования (наследуются свойства родителей) и иерархия отображения графических объектов (один объект вложен в другой, тот в третий и т.д.). не путайте их.
при создании экземпляра класса, он нигде не отображается. его нужно добавлять (addChild) в нужный контейнер, тем самым формирую иерархию отображения.
в вашем примере вы должны Game добавить в Main, а Player, Polygons и Obstacle добавить в Game. а как вы будете добавлять зависит от проектирования.
в вашем случае целесообразно, чтобы Main при создании Game сразу же и добавлял его, а Game в свою очередь при создании создавал и добавлял экземпляры Player, Polygons и Obstacle.
__________________
я могу стать всем, если только захочу

Старый 09.01.2010, 23:28
oloks вне форума Посмотреть профиль Отправить личное сообщение для oloks Найти все сообщения от oloks
  № 10  
Ответить с цитированием
oloks

Регистрация: Dec 2008
Сообщений: 7
Код HTML:
1. Описать ...
2. Создать ...
3. В этот основной контейнер ...
4. Далее все ...
5. После всего этого добавляете сам container на сцену - addChild(container) и все выводится на экран.
6. На container вешаете листенер на все события ...
mikhailk - а конкретного кода по строчке, обобщённо, синтаксис.

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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