![]() |
|
||||||||||
|
|||||
|
Регистрация: Feb 2014
Сообщений: 192
|
Подскажите, пожалуйста, каким образом лучше организовать код в игре.
Допустим игра танки. Одним танком управляет игрок, другими компьютер. В игре 3 вида танков. Я сделал общий класс Tank, куда включил такие свойства как скорость, прочность и т.д. Затем, расширил этот класс тремя другими, представляющими разные виды танков, в которых различные свойства скорости и прочности. Но у меня возникли вопросы: 1. У трех танков есть метод movie(), который должен управляться игроком или компьютером, в зависмости от того, какой танк выберет пользователь. ТАК каким образом дать знать программе, что этот танк должен управляться игроком? использовать флажок или дополнительные классы? 2. Для управления танком игроком необходимо зарегистрировать слушатели клавиш клавиатуры и слушатель Enter_FRAME. У меня вопрос, где лучше регистрировать слушатели в конструкторе классов танков либо в главном классе main? Подскажите, хоть примерно, так как опыта еще не имею. |
|
|||||
|
[+4 06.05.14]
|
1. Флажок ясное дело, сами подумайте причем тут доп сущность. Из за одного параметра ее не создают. Если бы у вас был конфиг или какой то контроллер где все обрабатывалось и проверялось, тогда да. А так - флажок в моделе танка. ( надеюсь модели то у вас есть ?! )
2. В main - вообще кода быть не должно кроме controller.init() или как кому нравится. Регистрировать интер-фрейм лучше во вьюшках танка, вполне, клавиатуру тоже можно, хотя я бы этим занялся в контроллере, где происходила бы обработка нажатий и дальнейший посыл куда надо.
__________________
Марк Tween |
|
|||||
|
Цитата:
Цитата:
и для ENTER_FRAME тоже отдельный класс. Но все это в данном случае можно и в Main добавить, чтобы лишний раз себе голову не засорять. Цитата:
private function onClick(e:MouseEvent):void { if (e.target is Tank) { // допустим у танка есть метод isPlayer():Boolean который показывает, может ли игрок воспользоваться этим танком var targetTank:Tank = e.target as Tank; if (targetTank.isPlayer()) { _playerTank = targetTank; } } }
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
Регистрация: Feb 2014
Сообщений: 192
|
Спасибо вам!
Если можно в двух словах объясните про контроллеры и вьюшки, или ссылку дайте. Вопрос - если исспользовать отдельный класс для событий Enter_FRAME, то какой класс он должен рассширять? Может EventDispatcher. И в блоке кода этого класса, как я понимаю, должны вызываться методы move() и другие, или генерироваться событие Event? Прошу заранее прощение, если глупость написал. |
|
|||||
|
[+1 22.07.14]
[+4 12.08.14] [+1 09.02.15] Регистрация: May 2014
Сообщений: 182
|
Цитата:
Добавлено через 26 минут package { public class SimpleClass implements IEnterFrame { public function SimpleClass() { } public function move():void { } } } package { import flash.display.Stage; import flash.events.Event; public class EnterFameClass { private var _stage:Stage; private var _objects:Array = []; private var _count:int; public function EnterFameClass(stage:Stage) { _stage = stage; } public function start():void { _stage.addEventListener(Event.ENTER_FRAME, stage_enterFrameHandler); } public function stop():void { _stage.removeEventListener(Event.ENTER_FRAME, stage_enterFrameHandler); } public function insert(object:IEnterFrame):void { if (_objects.indexOf(object) != -1) return; _objects[_count++] = object; } public function remove(object:IEnterFrame):void { var index:int = _objects.indexOf(object); if (index == -1) return; _objects.splice(index, 1); _count--; } private function stage_enterFrameHandler(event:Event):void { for (var i:int = 0; i < _count; i++) { _objects[i].move(); } } } } Последний раз редактировалось LifeIsRhythm; 28.05.2014 в 14:17. |
|
|||||
|
Цитата:
Существует негласное (ну или даже не совсем не гласное) правило, что название интерфейса должно быть прилагательным, а название класса существительным в единственном числе Я бы назвал интерфейс IUpdatable, а в нем бы создал один метод update() LifeIsRhythm, ваш код не рабочий Цитата:
Цитата:
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
[+1 22.07.14]
[+4 12.08.14] [+1 09.02.15] Регистрация: May 2014
Сообщений: 182
|
Исправил
![]() |
|
|||||
|
Не обязательно иметь ссылку на stage, чтобы слушать enterframe.
Можно создать внутри любой DisplayObject и подписаться на него.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
|
[+1 22.07.14]
[+4 12.08.14] [+1 09.02.15] Регистрация: May 2014
Сообщений: 182
|
Цитата:
|
|
|||||
|
Цитата:
Этот код все равно будет кишеть ошибками, как говорят американцы the code is error prone. Переменная _count там вообще нафиг не нужна. Наверняка попадется тот случай, когда она каким-то чудом не будет равна длине массива. Вместо нее лучше использовать _object.length; (хотя здесь вообще не надо знать длину массива нигде) А цикл с этого заменить на этот
__________________
Ко мне можно и нужно обращаться на ты) |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:36. |
|
|
« Предыдущая тема | Следующая тема » |
|
|