Menu
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

游戏组件


在游戏区域添加一个红色方块


添加组件

创建一个组件构造函数,它允许您将组件添加到游戏区域。

对象构造函数称为 component,我们创建第一个组件,名为 myGamePiece

例子

var myGamePiece;

function startGame() {
  myGameArea.start();
  myGamePiece = new component(30, 30, "red", 10, 120);
}

function component(width, height, color, x, y) {
  this.width = width;
  this.height = height;
  this.x = x;
  this.y = y;
  ctx = myGameArea.context;
  ctx.fillStyle = color;
  ctx.fillRect(this.x, this.y, this.width, this.height);
}

自己尝试一下 »

组件具有控制其外观和运动的属性和方法。



为了使游戏准备好行动,我们将每秒更新显示 50 次,这很像电影中的帧。

首先,创建一个名为 updateGameArea() 的新函数。

myGameArea 对象中,添加一个间隔,它将每 20 毫秒(每秒 50 次)运行 updateGameArea() 函数。 还要添加一个名为 clear() 的函数,它会清除整个画布。

component 构造函数中,添加一个名为 update() 的函数,以处理组件的绘制。

The updateGameArea() function calls the clear() and the update() method.

结果是组件每秒绘制和清除 50 次

例子

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

function component(width, height, color, x, y) {
  this.width = width;
  this.height = height;
  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);
  }
}

function updateGameArea() {
  myGameArea.clear();
  myGamePiece.update();
}
自己尝试一下 »

让它动起来

为了证明红色方块每秒绘制 50 次,我们将在每次更新游戏区域时将 x 位置(水平)改变一个像素

例子

function updateGameArea() {
  myGameArea.clear();
  myGamePiece.x += 1;
 
myGamePiece.update();
}
自己尝试一下 »

为什么要清除游戏区域?

在每次更新时清除游戏区域似乎没有必要。 但是,如果我们省略 clear() 方法,组件的所有移动都将留下它在上一帧中的位置的痕迹

例子

function updateGameArea() {
  // myGameArea.clear();
  myGamePiece.x += 1;
 
myGamePiece.update();
}
自己尝试一下 »

更改大小

您可以控制组件的宽度和高度

例子

创建一个 10x140 像素的矩形

function startGame() {
  myGameArea.start();
  myGamePiece = new component(140, 10, "red", 10, 120);
}
自己尝试一下 »

更改颜色

您可以控制组件的颜色

例子

function startGame() {
  myGameArea.start();
  myGamePiece = new component(30, 30, "blue", 10, 120);
}
自己尝试一下 »

您也可以使用其他颜色值,如十六进制、rgb 或 rgba

例子

function startGame() {
  myGameArea.start();
  myGamePiece = new component(30, 30, "rgba(0, 0, 255, 0.5)", 10, 120);
}
自己尝试一下 »

更改位置

我们使用 x 和 y 坐标将组件定位到游戏区域。

画布的左上角的坐标是 (0,0)

将鼠标悬停在下面的游戏区域上以查看其 x 和 y 坐标

X
Y

您可以将组件放置在游戏区域中的任何位置

例子

function startGame() {
  myGameArea.start();
  myGamePiece = new component(30, 30, "red", 2, 2);
}
自己尝试一下 »

多个组件

您可以在游戏区域中放置任意数量的组件

例子

var redGamePiece, blueGamePiece, yellowGamePiece;

function startGame() {
  redGamePiece = new component(75, 75, "red", 10, 10);
  yellowGamePiece = new component(75, 75, "yellow", 50, 60);
  blueGamePiece = new component(75, 75, "blue", 10, 110);
 
myGameArea.start();
}

function updateGameArea() {
  myGameArea.clear();
  redGamePiece.update();
  yellowGamePiece.update();
  blueGamePiece.update();
}
自己尝试一下 »

移动组件

让所有三个组件都朝不同的方向移动

例子

function updateGameArea() {
  myGameArea.clear();
  redGamePiece.x += 1;
  yellowGamePiece.x += 1;
  yellowGamePiece.y += 1;
  blueGamePiece.x += 1;
  blueGamePiece.y -= 1;
  redGamePiece.update();
  yellowGamePiece.update();
  blueGamePiece.update();
}
自己尝试一下 »

×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.