![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jan 2013
Адрес: Москва, Сходня
Сообщений: 41
|
Привет всем,
Изучаю actionScript недолго и как мне кажется, он себя очень странно ведет. Что ни начну делать, всё ему не так. Хотел узнать почему. Всё работает, если пишу только в главном классе. А я хочу разделить прогу на 2 класса - Main и Beatle(это у меня игрок). 1). К примеру, хочу сделать обычное перемещение с помощью стрелок. На мой взгляд логично, если всё это будет в классе Beatle. Задается скорость передвижения, добавляются слушатели событий и сами функции передвижения, а в Main просто создается объект класса Beatle. В конструкторе класса Beatle добавляю слушатель клавиатуры: Так не работает, пробую еще так и так: Цитата:
Цитата:
Цитата:
Добавляю слушатель событий в класс Main, работает: Добавляю функцию onKeyDownEvent() в класс Main, в которой вызываю метод beatle.walkLeft(); Да, при нажатии любой клавиши на клавиатуре объект должен двигаться влево: Но метод объекта beatle не вызывается из этой функции, хотя из конструктора класса Main он вызывается. Даже на таких простых вещах у меня уже проблемы, AS3 просто не дает мне разделить код на классы такими способами, хотя на мой взгляд они вполне логичны и удобны: 1). Слушатели событий и функции слушателей в классе Beatle, а в классе Main только создается объект класса Beatle и добавляется на сцену. 2). В классе Main слушатели событий и функции слушателей, которые вызывают нужные методы объектов, типа beatle.walkLeft(); Как разделить на классы программу так, что бы это работало? |
|
|||||
|
Регистрация: May 2012
Сообщений: 38
|
Код в студию, думаю шаманов гораздо меньше чем тех, кто просто мог бы помочь.
![]() |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Вам бы включить строгий режим компиляции, чтобы получать от компилятора сообщения об ошибках.
Строго говоря, public function onKeyDownEvent():void вообще не должно компилиться, так как обработчик события обязан принимать объект события в качестве аргумента. То есть Цитата:
Добавлено через 16 минут Что же касается попыток подписаться на события клавиатуры из класса Beatle, то надо понимать, что это событие не многоцелевое, как ентерфрейм например. Его получает только стейдж и тот дисплейный объект, который в момент события находился в фокусе. То есть экземпляр Вашего битла сможет получать события клавиатуры только после того, как будет добавлен на сцену и получит фокус. Поэтому единственным "перспективным" решением было подписать stage. Однако Вы сделали это видимо опять же в конструкторе класса Beatle. А в конструкторе у объекта нет ссылки на стейдж, так как он только создается и еще не добавлен на сцену. Обо всем этом Вам должен был рассказать компилятор, лучший друг программиста.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Jan 2013
Адрес: Москва, Сходня
Сообщений: 41
|
Wolsh, большое спасибо! Теперь многое прояснилось.
Включил строгий режим, помогло: компилятор нашел ошибки, о которых я даже не подозревал. Теперь ясно, почему методы класса Beatle не работали. Действительно очевидно. Упс, это я уже в сообщении ошибку допустил. Разобрался и понял, почему "перспективным" было написано в кавычках. ![]() Не разобрался только в том, как поделить программу на классы более эстетично. Ведь несколько слушателей событий клавиатуры в классе Main для разных методов разных объектов - это не правильно, да? Можно сделать класс Keys, который будет заниматься событиями клавиатуры, но он не сможет вызывать методы других экземпляров, к примеру beatle.moveUp без ссылки на них, а писать код перемещения персонажа в классе Keys неправильно, поскольку это код класса Beatle. Как правильно поделить программу на классы? |
|
|||||
|
Если вы хотите сделать управление внутри класса Beatle, то это может выглядеть примерно так (простой вариант):
package { import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; /** * ... * @author Samana */ public class Beatle extends Sprite { private var keyLeft:Boolean=false; private var keyRight:Boolean=false; public function Beatle() { addEventListener(Event.ADDED_TO_STAGE, addedToStage); } private function addedToStage(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, addedToStage); addEventListener(Event.REMOVED_FROM_STAGE, removedFromStage); addEventListener(Event.ENTER_FRAME, enterFrame); stage.addEventListener(KeyboardEvent.KEY_DOWN, stage_keyDown); stage.addEventListener(KeyboardEvent.KEY_UP, stage_keyUp); } private function enterFrame(e:Event):void { if (keyLeft) x -= 5; if (keyRight) x +=5; } private function stage_keyUp(e:KeyboardEvent):void { if (e.keyCode == 37) keyLeft = false; if (e.keyCode == 39) keyRight = false; } private function stage_keyDown(e:KeyboardEvent):void { if (e.keyCode == 37) keyLeft = true; if (e.keyCode == 39) keyRight = true; } private function removedFromStage(e:Event):void { removeEventListener(Event.REMOVED_FROM_STAGE, removedFromStage); removeEventListener(Event.REMOVED_FROM_STAGE, removedFromStage); removeEventListener(Event.ENTER_FRAME, enterFrame); stage.removeEventListener(KeyboardEvent.KEY_DOWN, stage_keyDown); stage.removeEventListener(KeyboardEvent.KEY_UP, stage_keyUp); } } } |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 239
|
Цитата:
|
|
|||||
|
Регистрация: Jan 2013
Адрес: Москва, Сходня
Сообщений: 41
|
Цитата:
А если if else if или switch использовать - то нажатия двух клавиш одновременно не будут фиксироваться. По-моему пример юзера samana правильный. Добавлено через 5 минут Упс, а хотя да. e.keyCode не может быть равен двум значениям, нужно использовать switch. Только не совсем понимаю, если нажаты 2 и более клавиш, то через кадр по очереди будут разные коды в e.keyCode? Как тогда определяется нажатие двух клавиш, ведь действительно e.keyCode не может равняться двум значениям, если он не массив... |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Цитата:
Всех благ.
__________________
Reality.getBounds(this); |
|
|||||
|
Наверно, на данном этапе Вашего развития лучше не задавать вопросы про проектирование и ООП - вас здесь запутают только, и слово "правильно" хорошо бы вычеркнуть из лексекона. Просто посмотрите как делают люди:
http://xitri.com/ http://www.flasher.ru/forum/showthread.php?t=83431 Если позже, когда напишите что-то минимально рабочее Вас заинтересует архитектура, то подхода к играм здесь 3: - MVC (хорош, где много GUI и всяких расчетов что за сколько при каких скидках и в какой промежуток времени можно купить и использовать, для социалок, короче) - Entity system (хорош для реал-тайм аркад) (фреймворк Starling, говорят, исползьует - сам не пробовал, Unity3d тоже, да что там, старый Контрстрайк на нём работает) - "ненавижу архитектурных астронавтов" - подход, _реально_ используемый при написании 30% социалок и 80% аркад на флеше. Использование этого подхода объясняется высоким уровнем IQ среди программистов, достаточным, чтобы не запутаться в макаронах, коие они генерируют. Ну ещё простотой небольшого числа аркад, где Entity-system мало чего даёт. Последний раз редактировалось expl; 07.01.2013 в 19:24. |
|
|||||
|
Регистрация: Jan 2013
Адрес: Москва, Сходня
Сообщений: 41
|
samana, спасибо, пример работает. Правда пока что времени не было с ним разобраться полностью, что сейчас и буду делать.
expl, уже видел эту серию уроков о создании аркады, для меня пока сложновато, хотя немного я все же разобрал эти примеры. Первая ссылка очень понравилась, очень интересный блог, просто супер! Полезная информация, буду изучать сейчас. Спасибо. Wolsh, не совсем понимаю. Если писать код перемещения персонажа в классе Keys, то мне ведь придется писать свойства класса Beatle в классе Keys, такие как speed, например. И много чего другого из класса Beatle... А свойство speed должно быть в классе Beatle, как его изменять из другого класса, кроме класса main - тоже загадка для меня пока что. 2ALL В общем решил так - понимания АС3 у меня пока что мало, вопросы задавать нет смысла, т.к. их слишком много, лучше поразбираю исходники всякие, посмотрю что и как сделано, что бы не изобретать велосипеды. Большинство вопросов после этого сами собой отпадут. Помню, заходил на какой-то англоязычный сайт, там было много примеров по AS3, типа перемещения стрелками объекта, перемещение по диагонали при нажатии двух стрелок, также следование объекта за мышкой, примеры с машинками, коллизиями и т.д. Ищу этот сайт, не могу найти. Хочу разобрать все эти примеры и уже смогу что-то делать на АС3. Быть может если кто знает этот сайт, киньте ссылку, помню там очень хорошие примеры были. Добавлено через 1 час 35 минут Еще хотел вот что спросить: Большинство примеров, которые я видел написаны на AS2, в т.ч. и по ссылке, которую мне дал тов. Экспл. Я сразу начал изучать AS3 и не стал вникать в AS2 и AS1, чтобы не запутаться еще сильнее. Правильный ли это подход? Дело в том, что хочется уже побыстрее изучить AS3 и сделать небольшую игрушку. Добавлено через 1 час 37 минут P.S. А вообще, до этого на PHP кодил, поэтому AS3 мне кажется очень запутанным и мудреным, хотя чем больше начинаю его понимать, тем более логичным мне он кажется. Добавлено через 2 часа 0 минут Нашел сайт, про который я писал. Вот он - http://www.freeactionscript.com/ Может кому пригодится, очень хорошие исходники. Последний раз редактировалось zzSpirit; 08.01.2013 в 09:03. |
![]() |
![]() |
Часовой пояс GMT +4, время: 10:36. |
|
|
« Предыдущая тема | Следующая тема » |
|
|