Spel kontroller

按下按钮可移动红色方块:






掌控一切

现在我们要控制红色方块。

添加四个按钮:上、下、左、右。

为每个按钮编写一个函数,以沿选定方向移动组件。

i component 构造函数中创建两个新属性,并将它们命名为 speedX och speedY。这些属性被用作速度指示器。

i component 构造函数中添加一个名为 newPos() 的函数,该函数使用 speedX och speedY 属性来更改组件的位置。

在绘制组件之前,从 uppdateraSpelområde 函数调用 newPos 函数:

exempel

<script>
function komponent(bredd, höjd, färg, x, y) {
  this.bredd = bredd;
  this.höjd = höjd;
  this.speedX = 0;
  this.speedY = 0;
  this.x = x;
  this.y = y;
  this.uppdatera = function() {
    ctx = myGameArea.context;
    ctx.fyllFärg = färg;
    ctx.fyllRektangel(this.x, this.y, this.bredd, this.höjd);
  }
  this.newPos = function() {
    this.x += this.speedX;
    this.y += this.speedY;
  }
}
function uppdateraSpelområde() {
  myGameArea.töm();
  minSpelbit.newPos();
  myGamePiece.update();
}
function moveup() {}}
  minSpelbit hastighetY -= 1;
}
function movedown() {
  minSpelbit hastighetY += 1;
}
function moveleft() {
  minSpelbit hastighetX -= 1;
}
function moveright() {
  minSpelbit hastighetX += 1;
}
</script>
<button onclick="moveup()">UPP</button>
<button onclick="movedown()">NER</button>
<button onclick="moveleft()">VÄNSTER</button>
<button onclick="moveright()">VÄNSTER</button>

Prova själv

Stoppa rörelse

Om nödvändigt kan du stoppa den röda kuben när du släpper knappen.

Lägg till en funktion som sätter hastighetsindikatorn till 0.

För att hantera både vanliga skärmar och pekskärmar, kommer vi att lägga till kod för båda typerna av enheter:

exempel

function stopMove() {
  myGamePiece.speedX = 0;
  myGamePiece.speedY = 0;
}
</script>
<button onmousedown="moveup()" onmouseup="stopMove()" ontouchstart="moveup()">UPP</button>
<button onmousedown="movedown()" onmouseup="stopMove()" ontouchstart="movedown()">NER</button>
<button onmousedown="moveleft()" onmouseup="stopMove()" ontouchstart="moveleft()">VÄNSTER</button>
<button onmousedown="moveright()" onmouseup="stopMove()" ontouchstart="moveright()">VÄNSTER</button>

Prova själv

tangentbordet som kontroll

vi kan också använda piltangenterna på tangentbordet för att styra den röda kuben.

att skapa en metod för att kontrollera om en tangent trycks ner och att myGameArea objektets knapp egenskapen sätts till nyckelkoden. När en tangent släpps, kommer knapp egenskapen sätts till false

exempel

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) {
      min spelområde.knapp = e.knappscod;
    })
    window.addEventListener('keyup', function (e) {
      myGameArea.key = false;
    })
  },
  clear : function(){
    this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  }
}

Så, om en av piltangenterna trycks, kan vi flytta den röda blocket:

exempel

function uppdateraSpelområde() {
  myGameArea.töm();
  myGamePiece.speedX = 0;
  myGamePiece.speedY = 0;
  om (myGameArea.key && myGameArea.key == 37) {myGamePiece.speedX = -1; }
  om (myGameArea.key && myGameArea.key == 39) {myGamePiece.speedX = 1; }
  om (myGameArea.key && myGameArea.key == 38) {myGamePiece.speedY = -1; }
  om (myGameArea.key && myGameArea.key == 40) {myGamePiece.speedY = 1; }
  minSpelbit.newPos();
  myGamePiece.update();
}

Prova själv

När flera tangenter trycks

Vad händer om flera tangenter trycks samtidigt?

I det aktuella exemplet kan komponenten bara röra sig horisontellt eller vertikalt. Nu vill vi att komponenten också kan röra sig diagonalt.

för myGameArea objekt skapar en keys arrayt, och lägger till en element för varje tryckt knapp och sätter värdet till true,värdet hålls true tills knappen inte längre trycks, värdet i keyup Evenemangslistningsfunktionen blir false

exempel

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 uppdateraSpelområde() {
  myGameArea.töm();
  myGamePiece.speedX = 0;
  myGamePiece.speedY = 0;
  om (myGameArea.keys && myGameArea.keys[37]) {myGamePiece.speedX = -1; }
  om (myGameArea.keys && myGameArea.keys[39]) {myGamePiece.speedX = 1; }
  om (myGameArea.keys && myGameArea.keys[38]) {myGamePiece.speedY = -1; }
  if (minSpeletområde.keys && minSpeletområde.keys[40]) {minSpelbit.speedY = 1; }
  minSpelbit.newPos();
  myGamePiece.update();
}

Prova själv

Använd muspekaren som kontroll

Om du vill använda muspekaren för att styra den röda rutan, i myGameArea Lägg till en metod i objektet för att uppdatera muspekarens x- och y-koordinater:

exempel

var myGameArea = {
  canvas : document.createElement("canvas"),
  start : function() {
    this.canvas.width = 480;
    this.canvas.height = 270;
    this.canvas.style.cursor = "none"; //göm den ursprungliga pekaren
    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);
  }
}

Då kan vi använda muspekaren för att flytta den röda rutan:

exempel

function uppdateraSpelområde() {
  myGameArea.töm();
  om (myGameArea.x && myGameArea.y) {
    minSpelbit.x = minSpeletområde.x;
    minSpelbit.y = minSpeletområde.y;
  }
  myGamePiece.update();
}

Prova själv

Berör skärmen för att styra spelet

Vi kan också styra den röda rutan på en pekskärm.

i myGameArea Lägg till en metod i objektet som använder skärmens berörningspositionens x- och y-koordinater:

exempel

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) {
      minSpeletområde.x = e.touches[0].screenX;
      minSpeletområde.y = e.touches[0].screenY;
    })
  },
  clear : function(){
    this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  }
}

Då kan vi använda samma kod som för muspekaren för att flytta den röda rutan när användaren berör skärmen:

exempel

function uppdateraSpelområde() {
  myGameArea.töm();
  om (myGameArea.x && myGameArea.y) {
    minSpelbit.x = minSpeletområde.x;
    minSpelbit.y = minSpeletområde.y;
  }
  myGamePiece.update();
}

Prova själv

Kontroller på canvas

Vi kan också rita egna knappar på canvas och använda dem som kontroller:

exempel

function startGame() {
  minSpelbit = new komponent(30, 30, "röd", 10, 120);
  minUppKnapp = new komponent(30, 30, "blå", 50, 10);
  minNedKnapp = new komponent(30, 30, "blå", 50, 70);
  minVänsterKnapp = new komponent(30, 30, "blå", 20, 40);
  minVänsterKnapp = new komponent(30, 30, "blå", 80, 40);
  minSpeletområde.start();
}

Lägg till en ny funktion för att avgöra om en komponent (i detta fall en knapp) har klickats.

Först lägg till eventlyssnare för att kontrollera om en musknapp har klickats(mousedown och mouseup)。För att hantera pekskärmar behöver du lägga till eventlyssnare för att kontrollera om skärmen har klickats(touchstart och touchend):

exempel

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);
  }
}

Nu myGameArea Objektet har egenskaper som kan informera oss om klickade x och y-koordinater. Vi använder dessa egenskaper för att kontrollera om ett klick har utförts på en av våra blå knappar.

Denna nya metod kallas clickeddet är component En metod för konstruktorn som kontrollerar om komponenten har klickats.

i uppdateraSpelområde i funktionen, om en av de blå knapparna klickas, kommer vi att utföra nödvändiga åtgärder:

exempel

function komponent(bredd, höjd, färg, x, y) {
  this.bredd = bredd;
  this.höjd = höjd;
  this.speedX = 0;
  this.speedY = 0;
  this.x = x;
  this.y = y;
  this.uppdatera = function() {
    ctx = myGameArea.context;
    ctx.fyllFärg = färg;
    ctx.fyllRektangel(this.x, this.y, this.bredd, this.höjd);
  }
  this.klickad = function() {
    var vänster = this.x;
    var höger = this.x + (this.bredd);
    var topp = this.y;
    var botten = this.y + (this.höjd);
    var klickad = true;
    om ((botten < myGameArea.y) || (topp > myGameArea.y) || (höger < myGameArea.x) || (vänster > myGameArea.x)) {
      klickad = false;
    }
    return klickad;
  }
}
function uppdateraSpelområde() {
  myGameArea.töm();
  om (myGameArea.x && myGameArea.y) {
    om (myUpBtn.klickad()) {
      myGamePiece.y -= 1;
    }
    om (myDownBtn.klickad()) {
      myGamePiece.y += 1;
    }
    om (myLeftBtn.klickad()) {
      myGamePiece.x += -1;
    }
    om (myRightBtn.klickad()) {
      myGamePiece.x += 1;
    }
  }
  myUpBtn.update();
  myDownBtn.update();
  myLeftBtn.update();
  myRightBtn.update();
  myGamePiece.update();
}

Prova själv