Spelbeheerders
Druk die knoppies om die rooi vierkant te skuif:
Kry in beheer
Nou wil ons die rooi vierkant beheer.
Voeg vier knoppies by, op, af, links en regs.
Skryf 'n funksie vir elke knoppie om die komponent in die geselekteerde rigting te beweeg.
Maak twee nuwe eienskappe in die component
konstruktor, en noem hulle
speedX
en speedY
. Hierdie eienskappe word as spoedaanwysers gebruik.
Voeg 'n funksie in die component
konstruktor by, genaamd
newPos()
, wat die speedX
en speedY
eienskappe gebruik om die komponent se posisie te verander.
Die newpos-funksie word vanaf die updateGameArea-funksie geroep voordat die komponent geteken word:
Voorbeeld
<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>
Hou op Beweeg
As jy wil, kan jy die rooi vierkant laat stop wanneer jy 'n knoppie los.
Voeg 'n funksie by wat die spoedaanwysers op 0 sal stel.
Om beide normale skerms en raakskerms te hanteer, sal ons kode vir beide toestelle byvoeg:
Voorbeeld
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>
Sleutelbord as kontroleerder
Ons kan ook die rooi vierkant beheer deur die pyltjie sleutels op die sleutelbord te gebruik.
Skep 'n metode wat kontroleer of 'n sleutel gedruk word, en stel die key
eienskap van die myGameArea
voorwerp op die sleutelkode. Wanneer die sleutel vrygestel word, stel die key
eiendom op false
:
Voorbeeld
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);
}
}
Dan kan ons die rooi vierkant skuif as een van die pyltjie sleutels gedruk word:
Voorbeeld
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();
}
Veelvuldige sleutels gedruk
Wat as meer as een sleutel op dieselfde tyd gedruk word?
In die voorbeeld hierbo kan die komponent slegs horisontaal of vertikaal beweeg. Nou wil ons hê die komponent moet ook diagonaal beweeg.
Skep 'n
keys
skikking vir die myGameArea
voorwerp, en voeg een element in vir elke sleutel wat gedruk word, en gee dit die waarde true
, die waarde bly waar totdat die sleutel nie meer gedruk word nie, die waarde word
false
in die keyup gebeurtenis luisteraar funksie:
Voorbeeld
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();
}
Gebruik die muiswyser as 'n kontroleerder
As jy die rooi vierkant wil beheer deur die muiswyser te gebruik, voeg 'n metode in myGameArea
objek by wat die x- en y-koördinate van die muiswyser bywerk:.
Voorbeeld
var myGameArea = {
canvas : document.createElement("canvas"),
start : function() {
this.canvas.width = 480;
this.canvas.height = 270;
this.canvas.style.cursor = "none"; //hide the original cursor
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);
}
}
Dan kan ons die rooi vierkant beweeg deur die muiswyser te gebruik:
Voorbeeld
function updateGameArea() {
myGameArea.clear();
if (myGameArea.x && myGameArea.y) {
myGamePiece.x = myGameArea.x;
myGamePiece.y = myGameArea.y;
}
myGamePiece.update();
}
Raak die skerm om die spel te beheer
Ons kan ook die rooi vierkant op 'n raakskerm beheer.
Voeg 'n metode in die myGameArea
voorwerp by wat die x- en y-koördinate gebruik van waar die skerm aangeraak word:
Voorbeeld
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);
}
}
Dan kan ons die rooi vierkant skuif as die gebruiker die skerm raak, deur dieselfde kode te gebruik as wat ons vir die muiswyser gedoen het:
Voorbeeld
function updateGameArea() {
myGameArea.clear();
if (myGameArea.x && myGameArea.y) {
myGamePiece.x = myGameArea.x;
myGamePiece.y = myGameArea.y;
}
myGamePiece.update();
}
Beheerders op The Canvas
Ons kan ook ons eie knoppies op die doek teken en dit as beheerders gebruik:
Voorbeeld
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();
}
Voeg 'n nuwe funksie by wat uitvind of 'n komponent, in hierdie geval 'n knoppie, geklik word.
Begin deur gebeurtenisluisteraars by te voeg om te kyk of 'n muisknoppie geklik is ( mousedown
en mouseup
). Om raakskerms te hanteer, voeg ook gebeurtenisluisteraars by om te kyk of die skerm op ( touchstart
en touchend
) geklik is:
Voorbeeld
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);
}
}
Nou myGameArea
het die voorwerp eienskappe wat vir ons die x- en y-koördinate van 'n klik vertel. Ons gebruik hierdie eienskappe om te kyk of die klik op een van ons blou knoppies uitgevoer is.
Die nuwe metode word genoem clicked
, dit is 'n metode van die
component
konstruktor, en dit kyk of die komponent geklik word.
In die updateGameArea
funksie neem ons die nodige aksies as een van die blou knoppies geklik word:
Voorbeeld
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();
}