Kháng cự game

Nhấn nút để di chuyển khối đỏ:






Thêm một số vật cản

Hiện tại chúng ta muốn thêm một số vật cản vào trò chơi.

Thêm thành phần mới vào khu vực trò chơi. Đặt màu xanh lá cây, rộng 10 pixel, cao 200 pixel, sau đó đặt nó ở vị trí bên phải 300 pixel, xuống 120 pixel.

Cần cập nhật thành phần vật cản trong mỗi khung hình:

thực thể

var myGamePiece;
var myObstacle;
function startGame() {
  myGamePiece = new component(30, 30, "red", 10, 120);
  myObstacle = new component(10, 200, "green", 300, 120);
  myGameArea.start();
}
function updateGameArea() {
  myGameArea.clear();
  myObstacle.update();
  myGamePiece.newPos();
  myGamePiece.update();
}

Thử ngay

Va chạm vật cản = Kết thúc trò chơi

Trong ví dụ trên, khi bạn chạm vào vật cản, sẽ không có gì xảy ra. Trong trò chơi, điều này không đáng chấp nhận.

Làm thế nào để chúng ta biết rằng khối đỏ của chúng ta có va chạm với vật cản hay không?

Trong hàm khởi tạo của thành phần, tạo một phương thức mới để kiểm tra thành phần này có va chạm với thành phần khác hay không. Phương thức này nên được gọi mỗi khi cập nhật khung hình, 50 lần mỗi giây.

cần thêm vào myGameArea thêm đối tượng dừng lại() phương thức này sẽ xóa bỏ khoảng cách 20 mili giây.

thực thể

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);
  },
  clear : function() {
    this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  },
  stop : function() {
    clearInterval(this.interval);
  }
}
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;
  }
  this.crashWith = function(otherobj) {
    var myleft = this.x;
    var myright = this.x + (this.width);
    var mytop = this.y;
    var mybottom = this.y + (this.height);
    var otherleft = otherobj.x;
    var otherright = otherobj.x + (otherobj.width);
    var othertop = otherobj.y;
    var otherbottom = otherobj.y + (otherobj.height);
    var crash = true;
    if ((mybottom < othertop) ||
    (mytop > otherbottom) ||
    (myright < otherleft) ||
    (myleft > otherright)) {
      crash = false;
    }
    return crash;
  }
}
function updateGameArea() {
  if (myGamePiece.crashWith(myObstacle)) {
    myGameArea.stop();
  } else {
    myGameArea.clear();
    myObstacle.update();
    myGamePiece.newPos();
    myGamePiece.update();
  }
}

Thử ngay

Di chuyển vật cản

Vật cản đứng yên không nguy hiểm, vì vậy chúng ta muốn nó di chuyển.

Thay đổi mỗi lần cập nhật myObstacle.x Giá trị thuộc tính:

thực thể

function updateGameArea() {
  if (myGamePiece.crashWith(myObstacle)) {
    myGameArea.stop();
  }
    myGameArea.clear();
    myObstacle.x += -1;
    myObstacle.update();
    myGamePiece.newPos();
    myGamePiece.update();
  }
}

Thử ngay

Vật cản đa phần

Thêm nhiều vật cản thế nào?

Để làm điều này, chúng ta cần một thuộc tính để tính toán số khung và một phương pháp thực hiện một số hành động với tần số khung đã cho.

thực thể

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.frameNo = 0;
    this.interval = setInterval(updateGameArea, 20);
  },
  clear : function() {
    this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  },
  stop : function() {
    clearInterval(this.interval);
  }
}
function everyinterval(n) {
  if ((myGameArea.frameNo / n) % 1 == 0) {return true;}
  return false;
}

Nếu số thứ tự khung hiện tại tương ứng với khoảng cách đã cho, hàm everyinterval sẽ trả về true.

Trước tiên, nếu cần định nghĩa nhiều vật cản, hãy khai báo biến vật cản là một mảng.

Thứ hai, chúng ta cần thực hiện một số thay đổi cho hàm updateGameArea.

thực thể

var myGamePiece;
var myObstacles = [];
function updateGameArea() {
  var x, y;
  for (i = 0; i < myObstacles.length; i += 1) {
    if (myGamePiece.crashWith(myObstacles[i])) {
      myGameArea.stop();
      return;
    }
  }
  myGameArea.clear();
  myGameArea.frameNo += 1;
  if (myGameArea.frameNo == 1 || everyinterval(150)) {
    x = myGameArea.canvas.width;
    y = myGameArea.canvas.height - 200
    myObstacles.push(new component(10, 200, "green", x, y));
  }
  for (i = 0; i < myObstacles.length; i += 1) {
    myObstacles[i].x += -1;
    myObstacles[i].update();
  }
  myGamePiece.newPos();
  myGamePiece.update();
}

Thử ngay

trong updateGameArea trong hàm, chúng ta phải lặp qua mỗi vật cản để kiểm tra có va chạm hay không. Nếu có va chạm, hàm updateGameArea sẽ dừng lại và không vẽ thêm.

updateGameArea hàm đếm khung hình và thêm một vật cản mới mỗi 150 khung hình.

vật cản kích thước ngẫu nhiên

Để tăng độ khó và thú vị của trò chơi, chúng tôi sẽ gửi các vật cản kích thước ngẫu nhiên, để khối đỏ phải di chuyển lên xuống để tránh va chạm.

thực thể

function updateGameArea() {
  var x, height, gap, minHeight, maxHeight, minGap, maxGap;
  for (i = 0; i < myObstacles.length; i += 1) {
    if (myGamePiece.crashWith(myObstacles[i])) {
      myGameArea.stop();
      return;
    }
  }
  myGameArea.clear();
  myGameArea.frameNo += 1;
  if (myGameArea.frameNo == 1 || everyinterval(150)) {
    x = myGameArea.canvas.width;
    minHeight = 20;
    maxHeight = 200;
    height = Math.floor(Math.random()*(maxHeight-minHeight+1)+minHeight);
    minGap = 50;
    maxGap = 200;
    gap = Math.floor(Math.random()*(maxGap-minGap+1)+minGap);
    myObstacles.push(new component(10, height, "green", x, 0));
    myObstacles.push(new component(10, x - height - gap, "green", x, height + gap));
  }
  for (i = 0; i < myObstacles.length; i += 1) {
    myObstacles[i].x += -1;
    myObstacles[i].update();
  }
  myGamePiece.newPos();
  myGamePiece.update();
}

Thử ngay