Выразительный JavaScript.

Упражнения.

Конец игры.

По традиции, платформеры дают игроку ограниченное количество жизней, и вычитают по одной каждый раз при гибели игрока. Когда жизни кончаются, игра начинается заново.

Подредактируйте runGame, чтобы она поддерживала жизни. Пусть игрок начинает с трёх.

<link rel="stylesheet" href="css/game.css">

<body>

<script>

// Старая функция runGame – поменяйте её...

Function runGame(plans, Display) {

Function startLevel(n) {

RunLevel(new Level(plans[n]), Display, function(status) {

If (status == "lost").

StartLevel(n);

Else if (n < plans.length - 1).

StartLevel(n + 1);

Else.

Console.log("You win!");

});

}

StartLevel(0);

}

RunGame(GAME_LEVELS, DOMDisplay);

</script>

</body>

Пауза.

Сделайте возможным ставить и снимать игру с паузы по нажатию клавиши Esc.

Этого можно достичь, поменяв функцию runLevel, чтобы она использовала другой обработчик событий клавиатуры, и прерывала и возобновляла анимацию по нажатию Esc.

На первый взгляд может показаться, что интерфейс runAnimation не предназначен для этого – но если вы поменяете его вызов из runLevel, всё получится.

Когда получится, можете попробовать ещё кое-что. Мы регистрируем события с клавиатуры не самым лучшим способом. Объект arrows – глобальная переменная, и его обработчики событий находятся в памяти, даже если игра не запущена. Можно сказать, они утекают из системы. Расширьте trackKeys, чтоб можно было разрегистрировать обработчики и затем поменяйте runLevel, чтоб она регистрировала их на старте, и разрегистрировала на финише.

<link rel="stylesheet" href="css/game.css">

<body>

<script>

// Старая функция runLevel – поменяйте её...

Function runLevel(level, Display, andThen) {

Var display = new Display(document.body, level);

RunAnimation(function(step) {

Level.animate(step, arrows);

Display.drawFrame(step);

If (level.isFinished()) {

Display.clear();

If (andThen).

AndThen(level.status);

Return false;

}

});

}

RunGame(GAME_LEVELS, DOMDisplay);

</script>

</body>