Форум 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 и в дисплей лист не может быть добавлен, и слушатели принимать

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


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

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