如何用原生JS實現小恐龍遊戲

一、遊戲的基本框架

小恐龍遊戲基於HTML5的canvas標籤來實現。以下代碼展示了基本框架的實現:

<canvas id="canvas" width="600" height="150"></canvas>

<script>
  let canvas = document.getElementById("canvas");
  let ctx = canvas.getContext("2d");

  // 遊戲邏輯代碼
</script>

將canvas標籤插入HTML頁面中,並使用JS獲取該標籤的上下文。我們的遊戲邏輯將在這個上下文環境中完成。

二、小恐龍的基本動作效果

小恐龍的動作效果包括:站立、跳動和俯衝。以下代碼展示了如何實現這些動作效果:

// 小恐龍的狀態
let dino = {
  state: "idle",
  y: 0,
  jumpSpeed: 10,
  jumpHeight: 100,
  fallSpeed: 20,
}

// 小恐龍的每個動作效果
function drawIdle() {
  // 繪製小恐龍的站立效果
}
function drawJump() {
  // 繪製小恐龍的跳動效果
}
function drawDuck() {
  // 繪製小恐龍的俯衝效果
}

// 判斷小恐龍的狀態並執行對應的函數
function drawDino() {
  if (dino.state === "idle") {
    drawIdle();
  } else if (dino.state === "jump") {
    drawJump();
  } else if (dino.state === "duck") {
    drawDuck();
  }
}

通過設定小恐龍的狀態,我們可以繪製出小恐龍在不同情況下的不同動畫效果。

三、遊戲障礙物的生成和移動

小恐龍遊戲中的障礙物是隨機生成的,包括仙人掌、飛鳥等。以下代碼展示了如何實現障礙物的生成和移動:

// 障礙物的狀態
let obstacle = {
  x: 600,
  y: 0,
  width: 50,
  height: 50,
  speed: 10
}

// 障礙物的種類
const obstacles = [
  {
    type: "cactus",
    width: 50,
    height: 100,
  },
  {
    type: "bird",
    width: 50,
    height: 50,
  },
]

// 隨機生成障礙物
function generateObstacle() {
  let obstacleType = obstacles[Math.floor(Math.random() * obstacles.length)];
  obstacle.type = obstacleType.type;
  obstacle.width = obstacleType.width;
  obstacle.height = obstacleType.height;
}

// 移動障礙物
function moveObstacle() {
  obstacle.x -= obstacle.speed;
}

// 繪製障礙物
function drawObstacle() {
  ctx.beginPath();
  ctx.rect(obstacle.x, obstacle.y, obstacle.width, obstacle.height);
  ctx.stroke();
}

通過在canvas上繪製一個矩形來實現障礙物的移動和顯示,同時設定障礙物的速度和種類,實現隨機的障礙物生成。

四、遊戲邏輯

小恐龍遊戲的邏輯包括:小恐龍跳躍、小恐龍碰撞障礙物、得分等。以下代碼展示了如何實現這些邏輯:

let score = 0;

// 小恐龍跳躍
function jump() {
  if (dino.y == 0) {
    dino.state = "jump";
    dino.y += dino.jumpSpeed;
  }
  if (dino.y > dino.jumpHeight) {
    dino.state = "fall";
  }
}

// 檢測小恐龍是否碰到障礙物
function detectObstacle() {
  if (obstacle.x = 0) {
    // 計算小恐龍和障礙物在X軸和Y軸上的距離
    let xDistance = (dino.x + 50) - obstacle.x;
    let yDistance = (dino.y + 50) - obstacle.y;
    if (xDistance < 0 && yDistance < 0) {
      dino.state = "dead";
      // 遊戲結束,彈出得分框
      alert("得分:" + score);
    }
  }
}

// 得分
function addScore() {
  score++;
}

// 遊戲循環
function gameLoop() {
  // 遊戲邏輯代碼
  detectObstacle();
  addScore();
  // 渲染畫面
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  drawDino();
  drawObstacle();
}

通過設定小恐龍的狀態和判斷小恐龍和障礙物在X軸和Y軸上的距離,實現小恐龍跳躍和碰撞檢測。同時計算得分和遊戲結束的提示。

五、遊戲的完整代碼示例

以下是小恐龍遊戲完整的原生JS實現代碼示例:

<canvas id="canvas" width="600" height="150"></canvas>

<script>
  let canvas = document.getElementById("canvas");
  let ctx = canvas.getContext("2d");

  let dino = {
    state: "idle",
    x: 50,
    y: 0,
    jumpSpeed: 10,
    jumpHeight: 100,
    fallSpeed: 20,
  }

  let obstacle = {
    x: 600,
    y: 0,
    width: 50,
    height: 50,
    speed: 10,
    type: "",
  }

  let score = 0;

  const obstacles = [
    {
      type: "cactus",
      width: 50,
      height: 100,
    },
    {
      type: "bird",
      width: 50,
      height: 50,
    },
  ]

  function drawIdle() {
    // 繪製小恐龍的站立效果
  }

  function drawJump() {
    // 繪製小恐龍的跳動效果
  }

  function drawDuck() {
    // 繪製小恐龍的俯衝效果
  }

  function drawDino() {
    if (dino.state === "idle") {
      drawIdle();
    } else if (dino.state === "jump") {
      drawJump();
    } else if (dino.state === "duck") {
      drawDuck();
    }
  }

  function generateObstacle() {
    let obstacleType = obstacles[Math.floor(Math.random() * obstacles.length)];
    obstacle.type = obstacleType.type;
    obstacle.width = obstacleType.width;
    obstacle.height = obstacleType.height;
  }

  function moveObstacle() {
    obstacle.x -= obstacle.speed;
  }

  function drawObstacle() {
    ctx.beginPath();
    ctx.rect(obstacle.x, obstacle.y, obstacle.width, obstacle.height);
    ctx.stroke();
  }

  function jump() {
    if (dino.y == 0) {
      dino.state = "jump";
      dino.y += dino.jumpSpeed;
    }
    if (dino.y > dino.jumpHeight) {
      dino.state = "fall";
    }
  }

  function detectObstacle() {
    if (obstacle.x = 0) {
      let xDistance = (dino.x + 50) - obstacle.x;
      let yDistance = (dino.y + 50) - obstacle.y;
      if (xDistance < 0 && yDistance  {
    if (event.code === "Space") {
      jump();
    } else if (event.code === "ArrowDown") {
      dino.state = "duck";
    }
  });

  document.addEventListener("keyup", event => {
    if (event.code === "ArrowDown") {
      dino.state = "idle";
    }
  });
</script>

以上為完整的小恐龍遊戲的實現代碼,該遊戲簡單易懂,通過以上代碼能夠使初學者更好地了解遊戲開發的基本原理和思路。

原創文章,作者:LPYCI,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/362000.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LPYCI的頭像LPYCI
上一篇 2025-02-25 18:17
下一篇 2025-02-25 18:17

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • 為什麼不用Python開發遊戲

    Python是一種高級編程語言,擁有簡單易學、代碼簡潔等優點。同時,Python也是一種多用途的語言,可以用於Web開發、數據分析以及機器學習等領域。然而,對於遊戲開發領域,Pyt…

    編程 2025-04-29
  • 如何用Python寫愛心

    本文將會從多個方面闡述如何用Python語言來畫一個美麗的愛心圖案。 一、準備工作 在開始編寫程序之前,需要先理解一些編程基礎知識。首先是繪圖庫。Python有很多繪圖庫,常見的有…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • 使用Python製作遊戲代碼

    Python是一種高級編程語言,因其簡潔明了的代碼風格、易於學習和使用而備受青睞。Python已經成為遊戲製作的熱門選擇之一,可以通過Pygame、Panda3D等工具來實現遊戲制…

    編程 2025-04-29
  • 解析js base64並轉成unit

    本文將從多個方面詳細介紹js中如何解析base64編碼並轉成unit格式。 一、base64編碼解析 在JavaScript中解析base64編碼可以使用atob()函數,它會將b…

    編程 2025-04-29
  • Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的解決方法

    本文將解決Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的問題。同時,給出一些相關示例代碼,以幫助讀者更好的理解並處理這個問題。 一、問題解…

    編程 2025-04-29
  • 如何用Python打印溫度轉換速查表

    本文將從多個方面闡述如何用Python打印溫度轉換速查表,以便於快速進行溫度轉換計算。 一、Python打印溫度轉換速查表的基本知識 在計算機編程領域中,溫度轉換是一個重要的計算。…

    編程 2025-04-29
  • 如何用Python對數據進行離散化操作

    數據離散化是指將連續的數據轉化為離散的數據,一般是用於數據挖掘和數據分析中,可以幫助我們更好的理解數據,從而更好地進行決策和分析。Python作為一種高效的編程語言,在數據處理和分…

    編程 2025-04-29
  • 如何用Python訪問網站

    本文將從以下幾個方面介紹如何使用Python訪問網站:網絡請求、POST請求、用戶代理、Cookie、代理IP、API請求。 一、網絡請求 Python有三種主流的網絡請求庫:ur…

    編程 2025-04-29

發表回復

登錄後才能評論