Сброс игры с помощью клавиши «R» - PullRequest
1 голос
/ 23 мая 2011

Я пытаюсь сделать игру во Flash, используя Action Script 3,

У меня есть все в игре, и игра работает, но я пытаюсь добавить функцию перезапуска, чтобы игра вернулась к началу уровня, когда вы нажмете клавишу «R».

Моя игра начинается с экрана заголовка в кадре 1, и есть 2 уровня, 1 в кадре 2, а другой в кадре 3.

Когда вы щелкаете нужный уровень на титульном экране, вы переходите к кадру с нужным уровнем с помощью gotoAndStop

function click_handler(event:MouseEvent) :void
{
    gotoAndStop(2);
}

Но то, что я хочу сделать, это когда я нажимаю 'R', я хочу, чтобы он перезагрузил все в кадре 2, то, что я пробовал, это

stage.addEventListener(KeyboardEvent.KEY_DOWN, resetGame);

function resetGame(e:KeyboardEvent):void
{
        if (e.keyCode == 82)
    {
        gotoAndStop(2);
    }
}

Но, похоже, это не работает.

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

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

Трудно сказать, что вам действительно нужно делать, ничего не зная о вашей игре; но сброс игры может быть одной из самых сложных частей.

Как только вы начинаете добавлять объекты и тому подобное, они не все удаляются и очищаются после смены фрейма . Вы должны удалить все созданные вами объекты, все ссылки на эти объекты и все остальное, связывающее их с памятью, например eventListeners.

Это то, что вам действительно нужно иметь в виду с самого начала вашего проекта и тестировать на стадии его разработки.

Хорошая стратегия:

  1. Иметь базовый класс для всех ваших игровых объектов, который будет обрабатывать удаление с помощью метода remove().
  2. Иметь базовый класс, в котором хранится список всех ваших игровых объектов, чтобы вы могли проходить и remove() все в конце.

Итак, фрагмент вашего базового класса будет выглядеть так:

package
{
    import flash.display.DisplayObject;

    public class GameObject extends Object
    {
        // vars
        public var skin:DisplayObject;

        /**
         * Constructor
         */
        public function GameObject()
        {
            Manager.entire.push(this);
        }

        /**
         * Removes this
         */
        public function remove():void
        {
            if(skin.parent) skin.parent.removeChild(skin);

            var ix:uint = Manager.entire.indexOf(this);
            Manager.entire.splice(ix, 1);
        }
    }
}

И базовый менеджер:

package
{
    public class Manager
    {
        public static var entire:Array = [];

        /**
         * Removes all instances of GameObject
         */
        public static function removeAll():void
        {
            var i:GameObject;
            for each(i in entire)
            {
                i.remove();
            }
        }
    }
}

Затем в ваших классах, расширяющих GameObject, вам просто нужно добавить логику в метод remove() для удаления eventListener и т. Д.

0 голосов
/ 23 мая 2011

Я пробовал клавиатуру обрабатывать часть вашего кода, и она отлично работает.Попробуйте отследить что-нибудь, чтобы увидеть, работает эта часть или нет в вашем коде.Если с этой частью все в порядке, возможно, вы не можете достичь правильного графика времени или чего-то подобного.Этой части кодов недостаточно, чтобы сказать.

Во всяком случае, более ясно, используя Keyboard.R вместо 82.

R,

Tamas Gronas

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...