Все статьи Добавим движение
Цикл игры
Для реализации цикла игры существует два способа: 1) SetTimeout/SetInterval
var NEW_FRAME_DELAY = 16;
var gameInterval = setInterval(function()
{
packman.move();
gameStateDrawer.drawState({ packman: packman });
}, NEW_FRAME_DELAY);
2) requestAnimationFrame
gameTick();
function gameTick()
{
packman.move();
gameStateDrawer.drawState({ packman: packman });
window.requestAnimationFrame(gameTick);
}
В этой статье рассмотрена причина использования второго способа.
Чуть-чуть событий
Для инициализации обработчиков событий браузера разработана функция:
function setHandlers(packmen)
{
document.onkeydown = function(event)
{
downButtonsHandler(event.keyCode, packmen);
};
document.onkeyup = function(event)
{
upButtonsHandler(event.keyCode, packmen);
};
}
Подробнее про события можно прочесть здесь
Js и OOP
Соглашение о кодировании для объектов в js
Нижнее подчёркивание перед свойством или методом означает приватность. Эта условность связанна с тем, что в js нет приватности. Так что изменение свойства или вызов метода с нижними подчёркиваниями считается ошибочным, и не должно допускаться разработчиком
Создание объекта героя
В js нет как такого oop с полиморфизмом и наследованием, можно, конечно, постараться реализовать, но из коробки это не поддерживается, да и при проектировнии пакмена можно обойтись композицией. Как говориться: “Разделяй и властвуй”. Надо разделить отрисовку и логику. Логика пока связана только с главным героем. Так что получлось два класса: Packmen(главный герой) и GameStateDrawSystem(отрисовка состояния игры) Вот такой получился класс для главного героя:
function Packman(x, y, constants)
{
this._x = x;
this._y = y;
this._directionX = NONE_DIRECT;
this._directionY = NONE_DIRECT;
this._speed = constants.speed;
this.move = function()
{
this._x += this._speed * this._directionX;
this._y += this._speed * this._directionY;
};
this.getX = function()
{
return this._x;
};
this.getY = function()
{
return this._y;
};
this.setDirectionX = function(direction)
{
this._directionX = direction;
};
this.setDirectionY = function(direction)
{
this._directionY = direction;
};
this.getDirectionX = function()
{
return this._directionX;
};
this.getDirectionY = function()
{
return this._directionY;
};
}
Это не совсем класс, а только его конструктор. При его вызове с оператором new он конструирует новый объект. Подробнее про объекты можно узнать здесь.
Итого получился вот такой шарик: