-
Notifications
You must be signed in to change notification settings - Fork 0
Справка по коду
Table of Contents generated with DocToc
- Про вики и Markdown
- Про код
- Про игру в целом:
- Про редактор:
- Про джойстик:
- Про сборку node-gyp на кириллической учётке Windows:
Синтаксис:
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 реализует взаимодействие с объектом Stage, на котором расположен главный контейнер (mainContainer), камера работает именно за счёт перемещения этого контейнера.
Все игровые объекты расположены в контейнерах, соответствующих их типу (например door, effect, wall). Именно контейнеры определяют z-порядок отрисовки. Внутри одного контейнера порядок можно менять через редактор кнопками F и B (bring to front/back).
Контейнеры можно создать вручную, вызвав createContainer(), либо он создастся сам из addToStage() по типу, указанному в первом аргументе.
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 описывает игровую механику и использует множество классов из папки entities (Door, Chest, etc).
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
- Создаём пазл, в нём указываем желаемое имя (по умолчанию name: puzzle1) и code - последовательность, в которой надо нажать кнопки на уровне. Объект пазла будет невидим в игре.
- Создаём кнопки, в каждой указываем puzzleName, совпадающее с именем пазла, и value, которое добавляется при нажатии на данную кнопку к уже введённой ранее последовательности.
- В дверях, которые должны открыться при успешном решении пазла, также указываем puzzleName.
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 в антивирусе/файрволе.