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

Dmitriy154 26.09.2015 19:29

организация кода для игры
 
Я пытаюсь сделать игрушку. Подскажите правильно ли делаю.
У меня есть допустим 4 класса:
1. Main - главный класс, в котором я делаю экземпляры фона , машины. Затем каждый кадр
вызываю статический метод класса Uprav.klava (fon,car, mouseX,mouseY) - ну и параметры ссылки на экземпляры и положение указателя мыши.
2. Car - класс автомобиля, в котором имеются только переменные (скорость ...)
3. Fon - класс фона с объектами
4. Uprav - класс управления авто.
Есть ли какие-либо стандарты для кода типовой игры?

caseyryan 26.09.2015 20:48

Гугл в помощ. Это уже миллиард раз обсуждалось. MVC и другие шаблоны проектирования

ZackMercury 26.09.2015 21:22

Да стандартов не посчитаешь, и все только помогают писать игру. Для этого они и существуют.
Начать можно с
http://www.ant-karlov.ru/pishem-igru-vstuplenie.html

Dmitriy154 26.09.2015 21:52

ZackMercury, спасибо за ссылку!

neonoviiwolf 26.09.2015 22:46

по своему опыту, пиши как можешь и параллельно читай шаблоны проектирование, потому как не написав *****код, не сможешь понять всю прелесть шаблонов.

ZackMercury 26.09.2015 23:34

neonoviiwolf, чтобы браться за шаблоны - нужно знать язык, свободно им владеть и выражать что вздумается.
Рановато. Чтобы понять, как решать проблемы - нужно понять, что мы именно хотим решать.

Добавлено через 3 минуты
Для клавиатуры я использую стырянную конструкцию у caseyryan, который в свою очередь скопировал конструкцию из AS2.
Код AS3:

package com.shooter 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.KeyboardEvent;
 
        /**
        * ...
        * @author ZackMercury
        */

        public class Key
        {
                private var keysDown:Object = { };
 
                public function Key()
                {
                        super();
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, kDown);
                        stage.addEventListener(KeyboardEvent.KEY_UP, kUp);
                }
 
                private function kDown(e:KeyboardEvent):void
                {
                        keysDown[e.keyCode] = true;
                }
 
                private function kUp(e:KeyboardEvent):void
                {
                        keysDown[e.keyCode] = null;
                }
 
                public function isDown(key:int):Boolean
                {
                        return keysDown[key];
                }
        }
 
}

Инициализирую, добавляю на сцену в главном классе, и в основном цикле
Код AS3:

if(k.isDown(Keyboard.SPACE))
  person.jump();


caseyryan 27.09.2015 08:05

Цитата:

который в свою очередь скопировал конструкцию из AS2.
мм.. Там только метод как в as2 вызывается, больше ничего общего. Но конструкцию придумал не я, а ты выложил не ту, что использовал я :D
У тебя не рабочая конструкция, там никогда не будет stage (к слову, она даже не скомпилируется), так как у тебя класс не расширяет ни DisplayObject ни EventDispatcher и в дисплей лист не может быть добавлен, и слушатели принимать
Да и лучше все методы этого класса сделать статиками

Dmitriy154 27.09.2015 09:24

А ведь я также использую код caseyryan, я думаю он не будет против, только одну переменную добавил
Код AS3:

package {
 
        import flash.display.Stage;
        import flash.events.Event;
        import flash.events.KeyboardEvent;
 
        public class Key {
 
                private static var initialized:Boolean = false;               
                private static var keysDown:Object = new Object();
                static var keysDownNow:Boolean; //моя переменная
 
                public static function initialize(stage:Stage):void {
                        if (!initialized) {
                                stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
                                stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
                                stage.addEventListener(Event.DEACTIVATE, clearKeys);
                                initialized = true;
                        }
                }
 
                public static function isDown(keyCode:uint):Boolean {
                        if (!initialized) {
                                throw new Error("Key class has not yet been initialized.");
                        }
                        return Boolean(keyCode in keysDown);
                }
 
                private static function keyPressed(event:KeyboardEvent):void {
                        keysDown[event.keyCode] = true;
                        keysDownNow = true;
                }
 
                private static function keyReleased(event:KeyboardEvent):void {
                        if (event.keyCode in keysDown) {
                                delete keysDown[event.keyCode];
                        }
                        keysDownNow = false;
                }
 
                private static function clearKeys(event:Event):void {
                        keysDown = new Object();
                }
        }
}

А шаблоны проектирования, наверное, пока не для моего ума, слишком громоздко

caseyryan 27.09.2015 10:39

Цитата:

только одну переменную добавил
Для чего? Она все равно не будет правильно работать. Потому что при зажатии двух клавиш одновременно и последующем отпускании одной из них, переменная станет false, а клавиша в этот момент будет нажата
Если уж надо проверить нажато ли что-то в данный момент, то нужно проверять всю коллекцию
как-то так:

Код AS3:

public static function isSomethingPressed():Boolean {
  for (var i:String in keysDown) return true;
  return false;
}


ZackMercury 27.09.2015 11:10

Цитата:

Да и лучше все методы этого класса сделать статиками
Статики медленнее, намного быстрее обращение к члену класса или локальной переменной.

Код AS3:

У тебя не рабочая конструкция, там никогда не будет stage (к слову, она даже не скомпилируется), так как у тебя класс не расширяет ни DisplayObject ни EventDispatcher и в дисплей лист не может быть добавлен, и слушатели принимать

Не дописал чуток

Dmitriy154 27.09.2015 11:12

Да, точно, а то у меня глюки начинались с моей переменной, когда я проверял эту переменную, а так все получается. Спасибо caseyryan, класс Key модернизирован!

caseyryan 27.09.2015 11:24

Цитата:

Сообщение от ZackMercury (Сообщение 1187352)
Статики медленнее, намного быстрее обращение к члену класса или локальной переменной.

Не тот случай. И не та реализация. В этом случае статик гораздо лучше.
Здесь сравнивать скорость статиков и полей экземпляра - просто маразм. Ты же не вызываешь их по миллиону раз за кадр. А 50 - 60 вызовов не сыграют абсолютно никакой роли.

djyamato 28.09.2015 01:14

Цитата:

Сообщение от Dmitriy154 (Сообщение 1187350)
Код AS3:

package {
        public class Key {
                public static function initialize(stage:Stage):void {
                        if (!initialized) {
                                stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
                                stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
                                stage.addEventListener(Event.DEACTIVATE, clearKeys);
                                initialized = true;
                        }
                }
        }
}


Коль скоро речь идет об организация кода для игры, я бы убрал подписку на события в отдельный приватный метод

caseyryan 28.09.2015 07:06

Цитата:

Коль скоро речь идет об организация кода для игры, я бы убрал подписку на события в отдельный приватный метод
Это и есть отдельный приватный метод)
Вообще это код из класса, который только и занимается проверкой того, не нажата ли какая-либо клавиша

djyamato 28.09.2015 12:35

Цитата:

Сообщение от caseyryan (Сообщение 1187394)
Это и есть отдельный приватный метод)
Вообще это код из класса, который только и занимается проверкой того, не нажата ли какая-либо клавиша

В нем происходит 2 действия, я бы развел эти 2 действия в разные методы. А для того чтобы отписаться от событий в Вашем случае нужно будет писать что-то типа
Код AS3:

stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
                                stage.removeEventListener(KeyboardEvent.KEY_UP, keyReleased);
                                stage.removeEventListener(Event.DEACTIVATE, clearKeys);

вместо
Код AS3:

removeStageListeners();


caseyryan 28.09.2015 13:55

Цитата:

В нем происходит 2 действия
В нем происходит только подписка сцены на нужные события и изменение значения флага initialized. Выносить изменение флага в отдельный метод - это маразм

Цитата:

А для того чтобы отписаться от событий в Вашем случае нужно будет писать что-то типа
Лишний код - это тоже плохо. В этом случае от событий отписываться не надо. Класс инициализируется один раз при запуске приложения, и больше никаких методов кроме isDown(keyCode:uint) в нем использовать не требуется

udaaff 28.09.2015 14:00

Бритва Оккама


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

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