js实现保护蛋糕canvas小游戏代码

代码语言:html

所属分类:游戏

代码描述:js实现保护蛋糕canvas小游戏代码,鼠标键盘左右键控制蛋糕,防止被叉子挡住。

代码标签: js 保护 蛋糕 canvas 游戏 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  

  
  
<style>
body {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 95vh;
}

canvas {
  border: 4px solid black;
  border-radius: 1rem;
}
</style>


  
  
</head>

<body translate="no">

      <script  >
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
canvas.width = 400;
canvas.height = 700;

document.body.append(canvas);

const GAME_STATE = {
  START: "start",
  PLAYING: "playing",
  GAME_OVER: "gameOver" };


const gameState = {
  currentState: GAME_STATE.START,
  score: 0,
  cakeHealth: 3 };


const player = {
  x: canvas.width / 2 - 30,
  y: canvas.height - 200,
  width: 80,
  height: 80,
  speed: 5 };


let forks = [];

const forkProperties = {
  width: 250,
  height: 30,
  speed: 4,
  spawnRate: 60,
  maxForks: 4 };


const background = {
  rayCount: 12,
  raySpeed: 0.005,
  rayAngle: 0,
  innerRadius: 1, // Size of triangle base near center
  outerRadius: 500 // How far the triangles stretch
};

const keys = {
  ArrowUp: false,
  ArrowDown: false,
  ArrowLeft: false,
  ArrowRight: false };


// Event listeners for keyboard
document.addEventListener("keydown", e => {
  if (keys.hasOwnProperty(e.key)) {
    keys[e.key] = true;
  }
});

document.addEventListener("keyup", e => {
  if (keys.hasOwnProperty(e.key)) {
    keys[e.key] = false;
  }
});

class Button {
  constructor(text, x, y, width, height) {
    this.x = x || canvas.width / 2 - 60;
    this.y = y || canvas.height / 2 + 50;
    this.width = width || 120;
    this.height = height || 50;
    this.text = text;
  }

  draw(ctx) {
    ctx.save();
    ctx.fillStyle = "#04678e";
    ctx.beginPath();
    ctx.roundRect(this.x, this.y, this.width, this.height, 10);
    ctx.fill();

    ctx.fillStyle = "white";
    ctx.font = "bold 18px Arial";
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";
    ctx.fillText(this.text, this.x + this.width / 2, this.y + this.height / 2);

    ctx.restore();
  }

  isClicked(mouseX, mouseY) {
    return (
      mouseX >= this.x &&
      mouseX <= this.x + this.width &&
      mouseY >= this.y &&
      mouseY <= this.y + this.height);

  }}


const startButton = new Button("START");
const restartButton = new Button("RESTART");

canvas.addEventListener("click", e => {
  const rect = canvas.getBoundingClientRect();
  const mouseX = e.clientX - rect.left;
  const mouseY = e.clientY - rect.top;

  if (
  gameState.currentState === GAME_STATE.START &&
  startButton.isClicked(mouseX, mouseY))
  {
    startGame();
  } else if (
  gameState.currentState === GAME_STATE.GAME_OVER &&
  restartButton.isClicked(mouseX, mouseY))
  {
    startGame();
  }
});

canvas.addEventListener("mousemove", e => {
  const rect = canvas.getBoundingClientRect();
  const mouseX = e.clientX - rect.left;
  const mouseY = e.clientY - rect.top;

  if (
  startButton.isClicked(mouseX, mouseY) ||
  restartButton.isClicked(mouseX, mouseY))
  {
    canvas.style.cursor = "pointer";
  } else {
    canvas.style.cursor = "default";
  }
});

function createFork() {
  let width = forkProperties.width * Math.random();
  if (width < 100) {
    width = 100;
  }

  const random = Math.random();

  return {
    x: random > 0.5 ? canvas.width - width : 0,
    y: -forkProperties.height,
    width,
    height: forkProperties.height,
    fromLeft: random < 0.5 };

}

function checkCollision(rect1, rect2) {
  return (
    rect1.x < rect2.x + rect2.width &&
    rect1.x + rect1.width > rect2.x &&
    rect1.y < rect2.y + rect2.height &&
    rect1.y + rect1.height > rect2.y);

}

function updatePlayer() {
  if (keys.ArrowLeft && player.x > 0) {
    player.x -= player.speed;
  }
  if (keys.ArrowRight && player.x < canvas.width - player.width) {
    player.x += player.speed;
  }
  if (keys.ArrowUp && player.y > 0) {
    player.y -= player.speed;
  }
  if (keys..........完整代码请登录后点击上方下载按钮下载查看

网友评论0