Контроллеры для игр
- Предыдущая страница Компоненты для игр
- Следующая страница Препятствия для игр
Нажатие на кнопку может переместить красный блок:
Власть над всем
Теперь мы будем управлять красным блоком.
Добавить четыре кнопки: вверх, вниз, влево, вправо.
Написать функцию для каждого кнопки, чтобы компонент мог двигаться в选定ном направлении.
в component
в конструкторе создать два новых свойства и命名 их speedX
и speedY
Эти свойства используются в качестве индикаторов скорости.
в component
добавить в конструктор функцию с именем newPos()
функции, которая использует speedX
и speedY
свойства.
До того как нарисовать компонент, изменить положение компонента с помощью updateGameArea
Вызов функции newPos
Функция:
instance
<script> function component(width, height, color, x, y) { this.width = width; this.height = height; this.speedX = 0; this.speedY = 0; this.x = x; this.y = y; this.update = function() { ctx = myGameArea.context; ctx.fillStyle = color; ctx.fillRect(this.x, this.y, this.width, this.height); } this.newPos = function() { this.x += this.speedX; this.y += this.speedY; } } function updateGameArea() { myGameArea.clear(); myGamePiece.newPos(); myGamePiece.update(); } function moveup() {}} myGamePiece.speedY -= 1; } function movedown() { myGamePiece.speedY += 1; } function moveleft() { myGamePiece.speedX -= 1; } function moveright() { myGamePiece.speedX += 1; } </script> <button onclick="moveup()">UP</button> <button onclick="movedown()">DOWN</button> <button onclick="moveleft()">LEFT</button> <button onclick="moveright()">RIGHT</button>
Остановить движение
Если необходимо, вы можете остановить красный блок при отпускании кнопки.
Добавить функцию для установки индикатора скорости в 0.
Чтобы справиться с обычными экранами и экранами с сенсорным управлением, мы добавим код для обоих типов устройств:
instance
function stopMove() { myGamePiece.speedX = 0; myGamePiece.speedY = 0; } </script> <button onmousedown="moveup()" onmouseup="stopMove()" ontouchstart="moveup()">UP</button> <button onmousedown="movedown()" onmouseup="stopMove()" ontouchstart="movedown()">DOWN</button> <button onmousedown="moveleft()" onmouseup="stopMove()" ontouchstart="moveleft()">LEFT</button> <button onmousedown="moveright()" onmouseup="stopMove()" ontouchstart="moveright()">RIGHT</button>
Клавиатура в качестве контроллера
Мы также можем управлять красным блоком с помощью клавиш навигации на клавиатуре.
создать метод для проверки нажатия какой-либо клавиши и установления myGameArea
объекта key
Свойства установлены кодом клавиши. При отпускании клавиши, будет key
Свойства установлены false
:
instance
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); window.addEventListener('keydown', function (e) { myGameArea.key = e.keyCode; }) window.addEventListener('keyup', function (e) { myGameArea.key = false; }) }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } }
Таким образом, если нажать одну из клавиш направления, мы можем переместить красный блок:
instance
function updateGameArea() { myGameArea.clear(); myGamePiece.speedX = 0; myGamePiece.speedY = 0; if (myGameArea.key && myGameArea.key == 37) {myGamePiece.speedX = -1; } if (myGameArea.key && myGameArea.key == 39) {myGamePiece.speedX = 1; } if (myGameArea.key && myGameArea.key == 38) {myGamePiece.speedY = -1; } if (myGameArea.key && myGameArea.key == 40) {myGamePiece.speedY = 1; } myGamePiece.newPos(); myGamePiece.update(); }
Нажать несколько клавиш
Что если одновременно нажать несколько клавиш?
в примере выше, компонент может двигаться только горизонтально или вертикально. Теперь мы хотим, чтобы компонент мог двигаться и по диагонали.
для myGameArea
объект создания ключи
массив, и для каждого нажатого клавиши вставить элемент и установить значение true
,значение сохраняется в true , пока не отпустят клавишу, значение в keyup
событие监听 функции становится false
:
instance
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); window.addEventListener('keydown', function (e) { myGameArea.keys = (myGameArea.keys || []); myGameArea.keys[e.keyCode] = true; }) window.addEventListener('keyup', function (e) { myGameArea.keys[e.keyCode] = false; }) }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } } function updateGameArea() { myGameArea.clear(); myGamePiece.speedX = 0; myGamePiece.speedY = 0; if (myGameArea.keys && myGameArea.keys[37]) {myGamePiece.speedX = -1; } if (myGameArea.keys && myGameArea.keys[39]) {myGamePiece.speedX = 1; } if (myGameArea.keys && myGameArea.keys[38]) {myGamePiece.speedY = -1; } if (myGameArea.keys && myGameArea.keys[40]) {myGamePiece.speedY = 1; } myGamePiece.newPos(); myGamePiece.update(); }
Использование курсора мыши в качестве контроллера
Если вы хотите использовать курсор мыши для управления красным квадратом, пожалуйста, в myGameArea
Добавить метод в объект для обновления координат x и y курсора мыши:
instance
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.canvas.style.cursor = "none"; //скрыть оригинальный курсор this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); window.addEventListener('mousemove', function (e) { myGameArea.x = e.pageX; myGameArea.y = e.pageY; }) }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } }
Затем мы можем использовать курсор мыши для перемещения красного квадрата:
instance
function updateGameArea() { myGameArea.clear(); if (myGameArea.x && myGameArea.y) { myGamePiece.x = myGameArea.x; myGamePiece.y = myGameArea.y; } myGamePiece.update(); }
Коснитесь экрана, чтобы управлять игрой
Мы можем управлять красным квадратом на сенсорном экране.
в myGameArea
Добавить метод в объект, который использует координаты x и y экранного касания:
instance
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); window.addEventListener('touchmove', function (e) { myGameArea.x = e.touches[0].screenX; myGameArea.y = e.touches[0].screenY; }) }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } }
Затем, когда пользователь касается экрана, мы можем использовать код, аналогичный курсору мыши, чтобы переместить красный квадрат:
instance
function updateGameArea() { myGameArea.clear(); if (myGameArea.x && myGameArea.y) { myGamePiece.x = myGameArea.x; myGamePiece.y = myGameArea.y; } myGamePiece.update(); }
Контроллеры на холсте
Мы можем нарисовать свои кнопки на холсте и использовать их в качестве контроллеров:
instance
function startGame() { myGamePiece = new component(30, 30, "red", 10, 120); myUpBtn = new component(30, 30, "blue", 50, 10); myDownBtn = new component(30, 30, "blue", 50, 70); myLeftBtn = new component(30, 30, "blue", 20, 40); myRightBtn = new component(30, 30, "blue", 80, 40); myGameArea.start(); }
Добавьте новую функцию для определения того, был ли клик на определенном компоненте (в данном примере это кнопка).
Сначала добавьте слушатели событий для проверки клика по кнопке мыши (mousedown
и mouseup
)。Чтобы поддерживать работу с сенсорными экранами, необходимо добавить слушатели событий для проверки того, был ли экран кликнут (touchstart
и touchend
):
instance
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); window.addEventListener('mousedown', function (e) { myGameArea.x = e.pageX; myGameArea.y = e.pageY; }) window.addEventListener('mouseup', function (e) { myGameArea.x = false; myGameArea.y = false; }) window.addEventListener('touchstart', function (e) { myGameArea.x = e.pageX; myGameArea.y = e.pageY; }) window.addEventListener('touchend', function (e) { myGameArea.x = false; myGameArea.y = false; }) }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } }
Теперь myGameArea
Объект имеет атрибуты, которые могут告诉我们 координаты x и y клика. Мы используем эти атрибуты, чтобы проверить, был ли клик на одном из наших синих кнопок.
Этот новый метод называется clicked
является component
Метод конструктора, который проверяет, был ли компонент кликнут.
в updateGameArea
В функции, если нажать на один из синих кнопок, мы выполним необходимые действия:
instance
function component(width, height, color, x, y) { this.width = width; this.height = height; this.speedX = 0; this.speedY = 0; this.x = x; this.y = y; this.update = function() { ctx = myGameArea.context; ctx.fillStyle = color; ctx.fillRect(this.x, this.y, this.width, this.height); } this.clicked = function() { var myleft = this.x; var myright = this.x + (this.width); var mytop = this.y; var mybottom = this.y + (this.height); var clicked = true; if ((mybottom < myGameArea.y) || (mytop > myGameArea.y) || (myright < myGameArea.x) || (myleft > myGameArea.x)) { clicked = false; } return clicked; } } function updateGameArea() { myGameArea.clear(); if (myGameArea.x && myGameArea.y) { if (myUpBtn.clicked()) { myGamePiece.y -= 1; } if (myDownBtn.clicked()) { myGamePiece.y += 1; } if (myLeftBtn.clicked()) { myGamePiece.x += -1; } if (myRightBtn.clicked()) { myGamePiece.x += 1; } } myUpBtn.update(); myDownBtn.update(); myLeftBtn.update(); myRightBtn.update(); myGamePiece.update(); }
- Предыдущая страница Компоненты для игр
- Следующая страница Препятствия для игр