
- •1 Лабораторная работа №1. Создание html5 игр
- •1.2 Методические рекомендации к самостоятельной работе студентов
- •1.3 Порядок выполнения работы
- •1.3.1Работа с медиа-элементами
- •1.3.2 Работа с графическими элементами
- •1.3.3 Пример создания html5-игры «Змейка»
- •1.4 Варианты заданий для выполнения лабораторной работы
- •1.5 Выводы
- •1.6 Контрольные вопросы и задания
1.3.3 Пример создания html5-игры «Змейка»
В качестве задания создадим простейшую игру змейка, для этого необходимо сделать следующие шаги:
– создать форму, для отображения игры;
– создать переменные для определения состояния змейки и основных констант;
– создать функции для отображения змейки;
– создать функции для основной логики игры;
– создать основной игровой цикл;
– обеспечить взаимодействие с пользователем;
– добавить медиа-контент;
– проинициализировать игру.
Для начала создадим форму, на которой будет отображаться игра:
<!doctype html>
<head>
<title>Snake</title>
</head>
<body onload="init()">
<input type="button" value="Play/Pause"
onclick="play()"><br />
<canvas id="canvas" style="border: solid 1px red;"
width="600" height="600">
</canvas>
</body>
Создадим основные внешние переменные, используемые для написания скрипта (создаются в теге <script>…</script>):
var bckColor = "rgb(0, 255, 255)";
var snakeColor = "rgb(0, 0, 0)"; //Цвет змейки
var foodColor = "rgb(0, 255, 0)"; //Цвет еды змейки
var ctx; //Объект context
var gridSize = 20; //Размер клетки
var snake; //Очередь элементов змейки
var food = []; //Координаты еды змейки
var direction; //Направление змейки
var changex = [-1, 0, 1, 0]; //Изменение координаты x в
//зависимости от направления
var changey = [0, -1, 0, 1]; //Изменение координаты y в
//зависимости от направления
var paused; //Состояние игры
var speed = 100; //Скорость перемещения змейки
var clock; //Объект таймера
Создадим функции отрисовки элементов:
function drawSnake(){
ctx.fillStyle = snakeColor;
ctx.fillRect(snake[snake.length - 1][0] * gridSize, snake[snake.length - 1][1] * gridSize, gridSize, gridSize);
}
function drawFood(){
ctx.fillStyle = foodColor;
ctx.fillRect(food[0] * gridSize, food[1] * gridSize, gridSize, gridSize);
}
function delPart(x, y){
ctx.fillStyle = bckColor;
ctx.clearRect(x * gridSize, y * gridSize, gridSize,
gridSize);
}
Создадим функцию принадлежности точки телу змейки.
function dotBelongSnake(x, y){
res = false;
for(i = 0; i < snake.length && !res; ++i)
res = x == snake[i][0] && y == snake[i][1];
return res;
}
Создадим функции добавления элементов, на поле.
function setX(x)
{
return x >= 0 ? x % (ctx.canvas.width / gridSize) : x +
(ctx.canvas.width / gridSize);
}
function setY(y)
{
return y >= 0 ? y % (ctx.canvas.height / gridSize) : y + (ctx.canvas.height / gridSize);
}
function addFood(){
do
{
food[0] = Math.floor(Math.random() *
(ctx.canvas.height / gridSize));
food[1] = Math.floor(Math.random() *
(ctx.canvas.height / gridSize));
}while(dotBelongSnake(food[0], food[1]));
drawFood();
}
Создадим функцию проверки змейки на столкновение.
function crash(){
res = false;
for(i = 0; i < snake.length - 1 && !res; ++i)
{
res = snake[i][0] == snake[snake.length - 1][0] &&
snake[i][1] == snake[snake.length - 1][1];
}
return res;
}
Создадим функцию управления состоянием игры.
function play(){
if(paused) clock = setInterval(movement, speed);
else clearInterval(clock);
paused = !paused;
}
Создадим основной игровой цикл.
function movement(){
snake.push([setX(snake[snake.length - 1][0] + changex[direction]), setY(snake[snake.length - 1][1] + changey[direction])])
if(!dotBelongSnake(food[0], food[1]))
{
delPart(snake[0][0], snake[0][1]);
snake.shift();
}
else
addFood();
if(crash())
{
play();
alert("Game Over;");
clear();
init();
}
drawSnake();
}
Создадим функцию управления игрой.
function changeDirection(event)
{
if(!paused)
{
code = 0
if(event == null) code = window.event.keyCode;
else code = event.keyCode;
switch(code)
{
case 37: if(direction != 2) direction = 0;
break;
case 38: if(direction != 3) direction = 1;
break;
case 39: if(direction != 0) direction = 2;
break;
case 40: if(direction != 1) direction = 3;
break;
}
}
}
Создадим функцию инициализации игры.
function init()
{
canvas = document.getElementById('canvas');
if (canvas.getContext)
{
snake = [[0, 0]];
direction = 2;
paused = true;
ctx = canvas.getContext('2d');
document.onkeydown =
function (event){changeDirection(event);};
addFood();
return true;
}
else
{
alert("Canvas isn’t supported!");
return false;
}
}