Skip to content

Справка по коду

alekseyl1992 edited this page Jul 5, 2014 · 16 revisions

Table of Contents generated with DocToc

Про вики и Markdown

Синтаксис:
https://help.github.com/articles/github-flavored-markdown
Генерация содержания:
http://doctoc.herokuapp.com

Кстати про heroku не первый раз слышу, как про годный хостинг, но он по идее весьма и весьма платный.

Про код

В коде используется документация в стиле JSDoc.
PhpStorm/WebStorm и другие IDE будут подсказывать сигнатуры функций, как например в C++.
Чтобы увидеть всё описание функции при вызове надо нажать Ctrl+Q (для PhpStorm).
То есть JSDoc - это эдакая типизация на уровне документации и IDE.

Однако всё, что касается архитектуры проекта: межмодульное взаимодействие, иерархия классов и вызовов - это всё лучше описывать здесь, в вики.

Про игру в целом:

От класса StageManager унаследованы GameLevel и Editor.

StageManager

StageManager реализует взаимодействие с объектом Stage, на котором расположен главный контейнер (mainContainer), камера работает именно за счёт перемещения этого контейнера.

Все игровые объекты расположены в контейнерах, соответствующих их типу (например door, effect, wall). Именно контейнеры определяют z-порядок отрисовки. Внутри одного контейнера порядок можно менять через редактор кнопками F и B (bring to front/back).

Контейнеры можно создать вручную, вызвав createContainer(), либо он создастся сам из addToStage() по типу, указанному в первом аргументе.

Про addToStage() и addPoint():

addToStage: function(objData, doNotCenter, id):

Добавляет на сцену указанный объект.

  • objData: Содержит информацию о добавляемом объекте. Ниже перечислены его необходимые поля:

    • type - тип объекта, определяет контейнер
    • tex - текстура, точнее строка, соответствующая ресурсу в ResourceManager
    • x, y - координаты, относительно контейнера типа type, однако эти контейнеры никогда не двигаются, а потому можно считать, что это координаты относительно mainContainer
  • doNotCenter

    Не устанавливать опорную точку объекта в его середину (оставить в (0,0)). Эта точка используется для перемещения и поворота объекта.

  • id

    id элемента в контейнере, раньше использовался для создания объектов под верхним слоем оных, теперь эта проблема решается разделением объектов по разным контейнерам и созданием контейнеров в нужный момент времени в GameLevel.load()

addPoint: function(objData):

Добавляет на сцену объект, у которого есть координаты, но нет текстуры.

objData

  • x, y, type - необходимы и аналогичны оным в addToStage().

Примечание: всё, что добавляется через эти функции будет двигаться по экрану вместе с камерой, чтобы это избежать нужно либо добавлять напрямую на сцену: this.stage.addChild(sprite), в таком случае придётся самому получить ресурс из ResourceManager'а, либо создать контейнер через createContainer(name, true) и добавить объект уже в него.

createContainer: function(name, toStage)

Создаёт контейнер с указанным именем и добавляет его либо в главный контейнер, который играет роль камеры, следящей за игроком, либо непосредственно на сцену, при toStage == true.

GameLevel

GameLevel описывает игровую механику и использует множество классов из папки entities (Door, Chest, etc).

Editor

Editor реализует редактирование уровней.

Про редактор:

Управление:

Use mouse to select and move objects
Ctrl+click to select multiple objects
WASD to move
QE to rotate
Shift to speedup
FB to bring to front or back
Double click or Ctrl+V to clone
DEL to delete selected objects
Shift + mouse to drag whole level

Про пазлы

  1. Создаём пазл, в нём указываем желаемое имя (по умолчанию name: puzzle1) и code - последовательность, в которой надо нажать кнопки на уровне. Объект пазла будет невидим в игре.
  2. Создаём кнопки, в каждой указываем puzzleName, совпадающее с именем пазла, и value, которое добавляется при нажатии на данную кнопку к уже введённой ранее последовательности.
  3. В дверях, которые должны открыться при успешном решении пазла, также указываем puzzleName.

Про джойстик:

Про сборку node-gyp на кириллической учётке Windows:

https://github.com/TooTallNate/node-gyp/pull/366

А там написано:

Search for the peace of code:

   # It has changed, write it
   if existing != xml_string:
     f = open(path, 'w')
     f.write(xml_string)
     f.close()

and change to

   # It has changed, write it
   if existing != xml_string:
     f = open(path, 'w')
     try:
       xml_string = xml_string.encode(encoding)
     except Exception:
       xml_string = unicode(xml_string, 'latin-1').encode(encoding)
     f.write(xml_string)
     f.close()

Только вместо latin-1 надо указать cp1251.

И ещё: чтобы socket.io работало, надо добавить в игнор порт 8000 в антивирусе/файрволе.