Каков наилучший способ управления игровыми уровнями во флеш-играх? - PullRequest
1 голос
/ 20 октября 2011

Я все еще учусь и пытаюсь спроектировать игровые уровни для моей первой игры (для платформы).

У меня есть несколько простых вопросов, потому что я чувствую, что нахожусь на неправильном пути.

Должен ли каждый уровень иметь свой собственный класс?

То, что я пытаюсь сделать, это когда я заканчиваю первый уровень, который я установил, чтобы обнулить переменные, которые принадлежат этому классу,отмените регистрацию всех событий и удалите всех дочерних элементов со сцены, вызовите конструктор второго уровня, не объявляя никакой переменной, новый level2 ();и установите в true статическую переменную «для того, чтобы сохранить» этот прогресс в случае, если кто-то захочет снова воспроизвести этот уровень.

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

Я искал его по всему интернету, но не могу найти учебник, который бы объяснял его в деталях, поэтому я пробую много способов достичь того, чего хочу, носейчас мне действительно нужны советы, чтобы не потеряться.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Мне всегда нравилось использовать 2D-массивы и писать 2 функции:

  1. Функция для хранения массива в виде строки
  2. Функция для преобразования строки обратно в 2D массив

Эти функции будут частью класса LevelManager, который также будет иметь некоторые функции, подобные этой:

  • load(levelData:String):void - загружает уровень на основе строки данных уровня
  • unload():void - выгружает текущий уровень
  • swap(levelData:String):void - выгружает текущий уровень и затем загружает новый уровень - хорошая функция для вставки анимации прерывания.
  • save():String - сохраняет текущий уровень (перебирает текущих врагов и создает новые данные уровня, которые будут возвращены
  • objectFromSnip(snip:String):void - создать объект из фрагмента (т. Е. Один объект, представленный строкой - см. Ниже). Я обычно разбиваю нижнюю часть на $, а затем перебираю результирующие наборы свойств и вызываю для них эту функцию.

Данные уровня могут выглядеть так:

object#x#y$object2#x#y

Где $ представляет разделение объектов, а # представляет разделение свойств для этого объекта.

Массивное представление этого будет:

[
    [object, x, y],
    [object2, x, y]
]

Что касается создания объекта, то в основном вы хотите:

  • Используйте getDefinitionByName() для создания вашего объекта. В основном здесь происходит то, что вы замените object и object2 выше именами ваших классов. т.е.: game.terrain.Grass#20#450
  • Примените x, y и любые другие пользовательские свойства к вашему объекту, созданному выше.
  • Добавить объект в игру

Надеюсь, это поможет. Если нет, попробуйте использовать XML для создания объектов, аналогичных описанным выше.

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

Если вы используете редактор уровней, вы сможете увидеть данные вашего уровня на экране закрытия, который может выглядеть примерно так:

2#36#20#o$t#12#12#w$t#12#16#w$t#12#24#w$t#12#28#w$t#12#20#w$g#20#11#o$1#24#21#o#200#110

Примечание к первому свойству каждого объекта, оно на самом деле представляет собой большую строку для сохранения компактности данных уровня, например:

var shorthand:Object = {
    2: "game.objects.WoodenWall",
    g: "game.objects.Gate",
    t: "game.objects.Turret"
};

и т.д.

0 голосов
/ 20 октября 2011

Данные уровня обычно хранятся в 2d массивах, например что-то вроде:

level1=[[0,0,0,0,0],
        [0,0,1,0,0],
        [0,0,1,0,0],
        [1,1,1,1,1]]

, где 1 представляют землю, а 0 ничего не представляют, например, для платформера с холмом в середине экрана или изометриейРПГ со стеной на юг.Вы можете хранить отдельные массивы для каждого уровня, если когда-либо возможно перекрытие между экземплярами, например один для фоновой графики, один для сцены и один для врагов.

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