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

LifeIsRhythm 28.05.2014 14:53

Цитата:

Совсем нет. Любой DO может слушать событие ENTER_FRAME
Да, я это знаю и остается только добавить, что он должен быть добавлен в дисплей лист..

ZackMercury 28.05.2014 15:00

Если вы делаете игру без MVC, то слушать ENTER_FRAME должен класс игры(который содержит игровую область).
Вешается обычно слушатель как и все другие действия - при init().
Он вызывает у всех своих внутренних элементов, которые движутся метод update(), в котором изменяется анимация и позиция персонажа.

caseyryan 28.05.2014 15:11

Цитата:

Сообщение от LifeIsRhythm (Сообщение 1166805)
Да, я это знаю и остается только добавить, что он должен быть добавлен в дисплей лист..

Нет.
Код AS3:

package  {
 
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class TestClass extends Sprite {
 
                public function TestClass() {
                        var s:Sprite = new Sprite();
                        s.addEventListener(Event.ENTER_FRAME, onEnterFrame)
                }
 
                private function onEnterFrame(e:Event):void {
                        trace("enter frame"); // трейс срабатывает
                }
 
        }
}


LifeIsRhythm 28.05.2014 15:30

Сорри! Прежде чем ответить, я тоже сделал тест, но по какой-то мистической причине событие не вызывалось.

Нашел причину -
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        public class Juggler extends Sprite
        {
 
                public function Juggler()
                {
                        super.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                }
 
                private function enterFrameHandler(event:Event):void
                {
                        trace(event.type);
                }
        }
}

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class TestClass extends Sprite
        {
                public function TestClass()
                {
                        //var juggler:Juggler =  new Juggler();// так диспатчит
                        // но в спешки я сделал так -
                        new Juggler()
                        // неужели GC так быстро срабатывает?
                        // И какая разница между первым вариантом и вторым ???
                        //ведь в обоих случаях объект локальный...
                }
 
        }
}


FlasherEgor 28.05.2014 16:57

Мистика в том, что вы не добавили Juggler в список отображения методом addChild().
Если я не ошибаюсь...

А нет, ошибаюсь:
Цитата:

отправляется непосредственно целевому элементу независимо от того, находится он в списке отображения или нет.

Rzer 28.05.2014 17:56

А вдруг твой танк завтра будет из сети управляться? Или игрок из танка пересядет в подводную лодку. Всё как в жизни: Танк - он и в Африке танк, класс один. А какой водитель им управляет это уже другое дело. Получается три класса: Tank - с методами управления, AIDriver, PlayerDriver (который слушает клавиатуру и рулит танком, вызывая у него функции turnLeft(), gear(), break(), shoot()). А дальше вызывать player.setVehicle(tank). Причём игрока в академии научили рулить всеми устройствами которые могут ездить взад вперёд и поворачивать, поэтому у танка должен быть интерфейс IVehicle и Классы водителей работают именно с IVehicle, а не с конкретным танком.

ZackMercury 28.05.2014 18:59

Подпишусь под словами Rzer, всё правильно сказал.
И ещё добавлю, что вместо turnLeft можно сделать функцию, которая будет медленно поворачивать дупло танка влево-вправо, через ENTER_FRAME, и вторую функцию, которая будет давать целевой угол поворота. Функция по ENTER_FRAME будет плавно поворачивать тыкву танка в нужную сторону в зависимости от целевого угла.

caseyryan 28.05.2014 21:36

Цитата:

поэтому у танка должен быть интерфейс IVehicle и Классы водителей работают именно с IVehicle, а не с конкретным танком.
Это геморрой. Сам на эти грабли наступал. Лучше сделать базовый класс общий, Vehicle extends Sprite и от него наследовать все остальное. Не нужен там интерфейс. Так как при необходимости подписать его на события или добавить в дисплей лист надо будет приводить к соответствующему типу, потому что нужных методов у IVehicle нет. Вопрос: зачем тут нужен интерфейс тогда?
Я говорю это не по наслышке. Я просто делал игру Война Икс в вк (пришлось сейчас отключить из-за нерентабильности), и там сделал именно с интерфейсами (в точности как у вас описано). Ох и натерпелся я в ней проблем из-за этого

in4core 29.05.2014 04:11

Цитата:

Я говорю это не по наслышке. Я просто делал игру Война Икс в вк (пришлось сейчас отключить из-за нерентабильности), и там сделал именно с интерфейсами (в точности как у вас описано). Ох и натерпелся я в ней проблем из-за этого
Да не нужны в ас3 интерфейсы , не партесь, это все для максимальной чистоты кода, не больше, а вот проблем типа addChild - навалом.

ZackMercury 29.05.2014 04:31

Ну, я люблю мечтать, что когда-нибудь напишу игру, построенную на интерфейсах, как идеал. Кажется, это так здорово. До сих пор ни разу их не использовал.
А насчёт приведения типов... Разве не по иерархической структуре всё это собирается?
Например, класс, реализующий методы интерфейса IPickable, называется Thing. Thing наследуется от Sprite. Яблоко наследуется от класса Thing. Неужели для добавления в DisplayList нужно приводить тип as DisplayObject? Я прост не пользовался интерфейсами никогда)
Код AS3:

addChild(new Apple());



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

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