Premere i pulsanti per spostare il quadrato rosso:
Entra in controllo
Ora vogliamo controllare il quadrato rosso.
Aggiungere quattro pulsanti, su, giù, sinistra e destra.
Scrivere una funzione per ciascun pulsante per spostare il componente nella direzione selezionata.
Fare due nuove proprietà nel component
costruttore, e li chiamano speedX
e speedY
. Queste proprietà vengono usati come indicatori di velocità.
Aggiungere una funzione nel component
costruttore, chiamato newPos()
, che utilizza il speedX
e speedY
proprietà per cambiare la posizione del componente.
La funzione newPos viene chiamata dalla funzione updateGameArea prima di disegnare il componente:
Esempio
<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>
Prova tu stesso " Fermati
Se si desidera, è possibile effettuare la fermata del quadrato rosso quando si rilascia il pulsante.
Aggiungere una funzione che impostare gli indicatori di velocità a 0.
Per far fronte a entrambi gli schermi normali e touch screen, aggiungeremo il codice per entrambi i dispositivi:
Esempio
function
stopMove() {
myGamePiece.speedX = 0;
myGamePiece.speedY = 0;
}
</script>
<button
omousedown="moveup()" onmouseup="stopMove()"
ontouchstart="moveup() ">UP</button>
<button
omousedown="movedown()" onmouseup="stopMove()"
ontouchstart="movedown()" >DOWN</button>
<button
omousedown="moveleft()" onmouseup="stopMove()"
ontouchstart="moveleft()" >LEFT</button>
<button
omousedown="moveright()" onmouseup="stopMove()"
ontouchstart="moveright()" >RIGHT</button>
Prova tu stesso " Tastiera come controller
Possiamo anche controllare il quadrato rosso usando i tasti freccia sulla tastiera.
Creare un metodo che controlla se viene premuto un tasto, e impostare la key
proprietà del myGameArea
oggetto per il codice della chiave. Quando il tasto viene rilasciato, impostare la key
di proprietà a false
:
Esempio
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);
}
}
Allora possiamo spostare il quadrato rosso se uno dei tasti freccia si preme:
Esempio
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();
}
Prova tu stesso " Tasti multipli Pressed
Che cosa succede se più di un tasto viene premuto allo stesso tempo?
Nell'esempio precedente, il componente può muoversi solo orizzontalmente o verticalmente. Ora vogliamo la componente di muoversi anche in diagonale.
Creare un keys
array per la myGameArea
oggetto, e inserire un elemento per ogni tasto che viene premuto, e dargli il valore true
, il valore rimane vero fino a quando il tasto non è premuto, il valore diventa false
nella funzione keyup listener di eventi:
Esempio
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();
}
Prova tu stesso " Utilizzando il cursore del mouse come controller
Se si desidera controllare il quadrato rosso utilizzando il cursore del mouse, aggiungere un metodo in myGameArea
oggetto che aggiorna le coordinate x e y del cursore del mouse :.
Esempio
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);
}
}
Allora possiamo spostare il quadrato rosso con il cursore del mouse:
Esempio
function updateGameArea() {
myGameArea.clear();
if (myGameArea.x && myGameArea.y) {
myGamePiece.x = myGameArea.x;
myGamePiece.y = myGameArea.y;
}
myGamePiece.update();
}
Prova tu stesso " Toccare lo schermo per controllare il gioco
Possiamo anche controllare il quadrato rosso su un touch screen.
Aggiungere un metodo nella myGameArea
oggetto che utilizza le coordinate x e y del luogo in cui si tocca lo schermo:
Esempio
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);
}
}
Allora possiamo spostare il quadrato rosso se l'utente tocca lo schermo, utilizzando lo stesso codice come abbiamo fatto per il cursore del mouse:
Esempio
function updateGameArea() {
myGameArea.clear();
if (myGameArea.touchX && myGameArea.touchY) {
myGamePiece.x = myGameArea.x;
myGamePiece.y =
myGameArea.y;
}
myGamePiece.update();
}
Prova tu stesso " Controllori sulla tela di canapa
Possiamo anche trarre le nostre pulsanti sulla tela, e li usa come controller:
Esempio
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();
}
Aggiungere una nuova funzione che calcola fuori se un componente, in questo caso un pulsante, viene cliccato.
Inizia con l'aggiunta di listener di eventi per verificare se un pulsante del mouse viene cliccato ( mousedown
and mouseup
) . Per far fronte a touch screen, anche aggiungere listener di eventi per verificare se lo schermo viene cliccato ( touchstart
and touchend
) :
Esempio
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);
}
}
Ora il myGameArea
oggetto ha proprietà che ci dice il x e y le coordinate di un clic. Usiamo theese proprietà per verificare se il clic è stato eseguito su uno dei nostri pulsanti blu.
Il nuovo metodo è chiamato clicked
, è un metodo del component
costruttore e controlla se il componente viene cliccato.
Nel updateGameArea
funzione, prendiamo le azioni neccessarry se uno dei pulsanti blu è cliccato:
Esempio
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();
}
Prova tu stesso "