Форум 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=208013)

Dmitriy154 27.05.2014 21:58

организация кода в игре
 
Подскажите, пожалуйста, каким образом лучше организовать код в игре.
Допустим игра танки. Одним танком управляет игрок, другими компьютер.
В игре 3 вида танков.
Я сделал общий класс Tank, куда включил такие свойства как скорость, прочность и т.д. Затем, расширил этот класс тремя другими, представляющими разные виды танков, в которых различные свойства скорости и прочности.
Но у меня возникли вопросы:
1. У трех танков есть метод movie(), который должен управляться игроком или компьютером, в зависмости от того, какой танк выберет пользователь. ТАК каким образом дать знать программе, что этот танк должен управляться игроком?
использовать флажок или дополнительные классы?
2. Для управления танком игроком необходимо зарегистрировать слушатели клавиш клавиатуры и слушатель Enter_FRAME. У меня вопрос, где лучше регистрировать слушатели в конструкторе классов танков либо в главном классе main?
Подскажите, хоть примерно, так как опыта еще не имею.

in4core 27.05.2014 23:05

1. Флажок ясное дело, сами подумайте причем тут доп сущность. Из за одного параметра ее не создают. Если бы у вас был конфиг или какой то контроллер где все обрабатывалось и проверялось, тогда да. А так - флажок в моделе танка. ( надеюсь модели то у вас есть ?! )
2. В main - вообще кода быть не должно кроме controller.init() или как кому нравится. Регистрировать интер-фрейм лучше во вьюшках танка, вполне, клавиатуру тоже можно, хотя я бы этим занялся в контроллере, где происходила бы обработка нажатий и дальнейший посыл куда надо.

caseyryan 28.05.2014 07:38

Цитата:

В main - вообще кода быть не должно кроме controller.init() или как кому нравится.
Для того, чтобы понять как все работает, и более менее разобраться в коде, то можно для начала и в Main писать всю логику, ничего страшного в этом не вижу. Все эти вьюшки и контроллеры новичку ни к чему. Со временем все это придет.
Цитата:

Регистрировать энтер-фрейм лучше во вьюшках танка, вполне, клавиатуру тоже можно, хотя я бы этим занялся в контроллере, где происходила бы обработка нажатий и дальнейший посыл куда надо.
У меня для этого вообще отдельный класс используется, в котором есть статический метод isDown(keyCode:uint):Boolean
и для ENTER_FRAME тоже отдельный класс. Но все это в данном случае можно и в Main добавить, чтобы лишний раз себе голову не засорять.

Цитата:

ТАК каким образом дать знать программе, что этот танк должен управляться игроком?
Заводим переменную
Код AS3:

private var _playerTank:Tank = null;

И при выборе танка, допустим он выбирается щелчком мыши, записываем ссылку на него в эту переменную
Код AS3:

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;
        }
  }
}

Ну а дальше, в обработчике ENTER_FRAME проверяем (предположим, используются флаги upPresed, downPressed и т.д., для определения нажатия клавиш)
Код AS3:

private function onEnterFrame(e:Event):void {
  if (upPressed) {
        if (_playerTank) { // проверяем не null ли ссылка
            _playerTank.movie(); // movie - это не правильное название метода, так как movie переводится как фильм. Правильнее было бы назвать метод move()
        }
  }
}


Dmitriy154 28.05.2014 10:15

Спасибо вам!
Если можно в двух словах объясните про контроллеры и вьюшки, или ссылку дайте.
Вопрос - если исспользовать отдельный класс для событий Enter_FRAME, то какой класс он должен рассширять? Может EventDispatcher. И в блоке кода этого класса, как я понимаю, должны вызываться методы move() и другие, или генерироваться событие Event?
Прошу заранее прощение, если глупость написал.

LifeIsRhythm 28.05.2014 12:03

Цитата:

Вопрос - если исспользовать отдельный класс для событий Enter_FRAME, то какой класс он должен рассширять?
Класс может и ничего не расширять, но он должен получить ссылку на stage, которую уже и нужно подписывать под EF. В этом классе должен быть метод insert ( добавить ) с параметром, тип у которого будет интерфейс обязующий, что в добавляемом классе точно будет метод move.

Добавлено через 26 минут
Код AS3:

package 
{
        public interface IEnterFrame
        {
                function move():void;
        }
}

Код AS3:

package 
{
        public class SimpleClass implements IEnterFrame
        {
                public function SimpleClass() { }
                public function move():void { }
        }
}

Код AS3:

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();
                        }
                }
        }
}


caseyryan 28.05.2014 13:28

Цитата:

IEnterFrame
Какое-то не очень название для интерфейса.
Существует негласное (ну или даже не совсем не гласное) правило, что название интерфейса должно быть прилагательным, а название класса существительным в единственном числе
Я бы назвал интерфейс IUpdatable, а в нем бы создал один метод update()

LifeIsRhythm, ваш код не рабочий
Цитата:

Код AS3:

public function insert(object:IEnterFrame):void
                {
                        if (_objects.indexOf(object) == -1) return; // никогда не добавит новый объект, так как условие будет всегда выполняться, тут == надо заменить на >
 
                        _objects[_count++] = object; // вот тут тоже не понятно, лучше push() использовать. Все равно будет ячейка создаваться
                }
 
                public function remove(object:IEnterFrame):void
                {
                        _objects.splice(_objects.indexOf(object), 1); // если объект отсутствует, в массиве, то он снесет другой, и массив сместится. Нужна проверка, а есть ли такой в массиве, перед тем, как удалять
          // да и _count тогда надо обновить, чего тут не происходит
                }


Цитата:

Если можно в двух словах объясните про контроллеры и вьюшки, или ссылку дайте.
В двух словах это не объяснить. Читайте про шаблоны проектирования. Книг полно. Да и тем тоже

LifeIsRhythm 28.05.2014 14:18

Исправил :D

ChuwY 28.05.2014 14:24

Не обязательно иметь ссылку на stage, чтобы слушать enterframe.
Можно создать внутри любой DisplayObject и подписаться на него.

LifeIsRhythm 28.05.2014 14:30

Цитата:

Не обязательно иметь ссылку на stage, чтобы слушать enterframe.
В контексте отдельного класса enterframe, она, как мне кажется, необходима.

caseyryan 28.05.2014 14:46

Цитата:

В контексте отдельного класса enterframe, она, как мне кажется, необходима.
Совсем нет. Любой DO может слушать событие ENTER_FRAME
Цитата:

Сообщение от LifeIsRhythm (Сообщение 1166794)
Исправил :D

Этот код все равно будет кишеть ошибками, как говорят американцы the code is error prone.
Переменная _count там вообще нафиг не нужна. Наверняка попадется тот случай, когда она каким-то чудом не будет равна длине массива.
Вместо нее лучше использовать _object.length; (хотя здесь вообще не надо знать длину массива нигде)
А цикл с этого
Код AS3:

for (var i:int = 0; i < _count; i++) 
                        {
                                _objects[i].move();
                        }

заменить на этот
Код AS3:

for (var i:String in _objects) {
    _objects[i].move();
}



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

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