Kifungu cha Kikimbia cha Kigame

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






掌控一切

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

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

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

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

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

在绘制组件之前,从 updateGameArea 函数调用 newPos 函数:

mwigiza

<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>




Tafakari Kwenye Hapa

停止移动

如果需要,您可以在释放按钮时使红色方块停止。

添加一个将速度指示器设置为 0 的函数。

Kwa kumtaka kumtumika kwa mifungo wa kina na mifungo wa kichwa cha namba, tukifungua kwa mifungo wa kina na mifungo wa kichwa cha namba:

mwigiza

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>

Tafakari Kwenye Hapa

kiburi cha kichwa cha namba kama kikontrolla

tunaweza kumwambia kichwa cha kiburi cha mifungo wa kiburi cha juu kumwambia mifungo wa kichwa cha namba. Kama kichwa cha kiburi cha mifungo wa kiburi cha juu kinapendekeza kumwambia mifungo wa kichwa cha namba.

tengeneza mtuaguzi wa kufikiria kama kichwa cha namba kinapendekeza, na kumwambia myGameArea muundo wa key kinaadiliwa kwa kichwa cha namba. Kama kifungu kilitokana, tukifungua key kinaadiliwa kwa false

mwigiza

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

这样,如果按下方向键之一,我们就可以移动红色方块:

mwigiza

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

Tafakari Kwenye Hapa

按下多个键

如果同时按下多个键怎么办?

在上面的例子中,组件只能水平或垂直移动。现在我们希望组件也可以沿对角线移动。

myGameArea 对象创建一个 keys 数组,并为每个按下的键插入一个元素,并为其赋值 true,该值保持 true ,直到不再按下该键,该值在 keyup 事件监听函数中变为 false

mwigiza

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

Tafakari Kwenye Hapa

kutumia kina-mguu wa kina-marejeo kama kifaa cha kusimamia

kama unavyofikia kusimamia kwa kina-mguu kwenye msingi wa kichaka kichari, tunaweza kutumia: myGameArea kigeukia kikaa kwenye kipimo cha kina-mguu na kipimo cha kina-marejeo cha mawasiliano:

mwigiza

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

kisha tunaweza kutumia kina-mguu wa kina-marejeo kuongeza kwenye msingi wa kichaka kichari:

mwigiza

function updateGameArea() {
  myGameArea.clear();
  if (myGameArea.x && myGameArea.y) {
    myGamePiece.x = myGameArea.x;
    myGamePiece.y = myGameArea.y;
  }
  myGamePiece.update();
}

Tafakari Kwenye Hapa

sekana ekranini kuwa na uwanja wa kusimamia kwa kifunzi

wengeneza mabidii ya picha ya kina-mguu kwenye mabidii ya picha ya kina-marejeo

hapa hivi myGameArea kigeukia kikaa kwenye kipimo cha kina-mguu na kipimo cha kina-marejeo cha mawasiliano:

mwigiza

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

kisha, kama mtu anatoka kwa kumsekana ekranini, tunaweza kutumia kipindi cha kina-maagizo kama kina-mguu wa kina-marejeo kuongeza kwenye msingi wa kichaka kichari:

mwigiza

function updateGameArea() {
  myGameArea.clear();
  if (myGameArea.x && myGameArea.y) {
    myGamePiece.x = myGameArea.x;
    myGamePiece.y = myGameArea.y;
  }
  myGamePiece.update();
}

Tafakari Kwenye Hapa

mabidii ya kusimamia kwenye mabidii ya picha

wengeneza mabepu yani ya mawasiliano kwenye mabidii ya picha, ikilinganisha kama kifaa cha kusimamia:

mwigiza

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

Ongeza funguza mpya inayotakaiza kwa kumtaka inayofikiria kama komponi (kama kina hiki ina nafasi ya kibatili) inasemekana kwa kufikiria kiagizo。

Kwanza ingia kwa uwanja wa mawasiliano kwa kumtaka kufikiria kama mibatili inayotumika (mousedown na mouseup)。Kuwa na mawasiliano ya mifungo ya simu ya taa, inahitajika kuingia kwa uwanja wa mawasiliano kwa kumtaka kufikiria kama ekran inasemekana kwa kufikiria kiagizo (touchstart na touchend):

mwigiza

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

Sasa myGameArea kampuni ina vipimo inayotukia ukurasa wa x na y kwa kumtaarifu kuwa inasemekana kwa kufikiria kiagizo kwenye moja ya mibatili yake ya kijani.

Hii mtu wa kina mpya huitwa clicked, inayikuwa component Funguza yenye, inayotakaiza inayoshukusha komponi.

hapa hivi updateGameArea Katika mwigiza kama bili la mawili bila kina, tumezifanya hatua zilizohitaji:

mwigiza

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

Tafakari Kwenye Hapa