最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS/HTML5游戲常用算法之碰撞檢測(cè) 地圖格子算法實(shí)例詳解

 更新時(shí)間:2018年12月12日 11:54:55   作者:krapnik  
這篇文章主要介紹了JS/HTML5游戲常用算法之碰撞檢測(cè) 地圖格子算法,結(jié)合實(shí)例形式詳細(xì)分析了javascript碰撞檢測(cè)算法的相關(guān)原理、實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了JS/HTML5游戲常用算法之碰撞檢測(cè) 地圖格子算法。分享給大家供大家參考,具體如下:

這種算法經(jīng)常用于RPG(早期的《最終幻想》、《DQ》、《仙劍奇?zhèn)b傳》)、SLG(《炎龍騎士團(tuán)》、《超級(jí)機(jī)器人大戰(zhàn)》)、PUZ(《俄羅斯方塊》、《寶石謎陣》)類型的游戲。這類游戲中,通常情況下整個(gè)地圖都是由一些地圖塊元素組成,在制作的時(shí)候首先給制作出地圖所需要的最基本的元素進(jìn)行編號(hào),然后把這些編號(hào)的地圖塊組合起來(lái)就可以根據(jù)需要形成任意大小的地圖。

早期的RPG類型或者SLG類型的游戲可以明顯地看出游戲中的地圖是由一些小的地圖塊格子而成,采用這種方式組成地圖的好處是節(jié)約內(nèi)存的使用,并且不需要太多的地圖元素就可以任意組合成足夠大的地圖,簡(jiǎn)單靈活,缺陷就是最后制作出的地圖不太美觀。但實(shí)際上為了便于游戲中的碰撞檢測(cè),比如人物碰到NPC或者是碰到不可跨越的障礙等情況,在游戲中實(shí)際上還是保存了一張看不見的邏輯層。這個(gè)層的大小和地圖等大,并且也進(jìn)行了格子劃分,主要目的就是為了碰撞檢測(cè),通常我們?cè)谟螒蛑袑?duì)這個(gè)碰撞邏輯層使用一個(gè)數(shù)組描述信息,使用 1 表示不可以通過,0表示可以通過,假設(shè)人物和NPC在游戲中行走,這種情況下我們就很容易檢測(cè)地圖中人物是否碰到了NPC或者障礙物。

var mapArr = [
      1, 0, 0, 1,
      0, 0, 0, 1,
      0, 1, 0, 0,
      1, 0, 0, 1
    ];

代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
  <meta charset="UTF-8">
  <title>地圖格子算法</title>
  <style>
    #stage {
      border: 1px solid lightgray;
    }
  </style>
</head>
<body>
<canvas id="stage"></canvas>
</body>
<script>
  window.onload = function () {
    var stage = document.querySelector('#stage'),
      ctx = stage.getContext('2d');
    stage.width = 400;
    stage.height = 400;
    var mapArr = [
      1, 0, 0, 1,
      0, 0, 0, 1,
      0, 1, 0, 0,
      1, 0, 0, 1
    ],rectIdx = 5;
    //柵格線條
    function drawGrid(context, color, stepx, stepy) {
      context.strokeStyle = color;
      context.lineWidth = 0.5;
      for (var i = stepx + 0.5; i < context.canvas.width; i += stepx) {
        context.beginPath();
        context.moveTo(i, 0);
        context.lineTo(i, context.canvas.height);
        context.stroke();
      }
      for (var i = stepy + 0.5; i < context.canvas.height; i += stepy) {
        context.beginPath();
        context.moveTo(0, i);
        context.lineTo(context.canvas.width, i);
        context.stroke();
      }
    }
    function createRect(x, y, r, c) {
      ctx.beginPath();
      ctx.fillStyle = c;
      ctx.rect(x, y, r, r);
      ctx.fill();
    }
    document.onkeydown = function (event) {
      var e = event || window.event || arguments.callee.caller.arguments[0];
      //根據(jù)地圖數(shù)組碰撞將測(cè)
      switch (e.keyCode){
        case 37:
          console.log("Left");
          if (rectIdx - 1 >= 0 && (rectIdx - 1) % 4 !== 3 && !mapArr[rectIdx - 1]) {
            rectIdx -= 1;
          }
          break;
        case 38:
          console.log("Top");
          if (rectIdx - 4 >= 0 && !mapArr[rectIdx - 4]) {
            rectIdx -= 4;
          }
          break;
        case 39:
          console.log("Right");
          if ((rectIdx + 1) % 4 !== 0 && !mapArr[rectIdx + 1]) {
            rectIdx += 1;
          }
          break;
        case 40:
          console.log("Bottom");
          if (rectIdx + 4 < mapArr.length && !mapArr[rectIdx + 4]) {
            rectIdx += 4;
          }
          break;
        default:
          return false;
       }
    };
    function update() {
      ctx.clearRect(0, 0, 400, 400);
      drawGrid(ctx, 'lightgray', 100, 100);
      var rect = {
        x: rectIdx % 4 * 100,
        y: rectIdx % 4 === 0 ? rectIdx / 4 * 100 : Math.floor(rectIdx / 4) * 100,
        r: 100,
        c: "blue"
      };
      createRect(rect.x, rect.y, rect.r, rect.c);
      //根據(jù)地圖數(shù)組創(chuàng)建色塊
      for (var i = 0, len = mapArr.length; i < len; i++) {
        if (mapArr[i]) {
          createRect(i % 4 * 100, i % 4 === 0 ? i / 4 * 100 : Math.floor(i / 4) * 100, 100, "red");
        }
      }
      requestAnimationFrame(update);
    }
    update();
  };
</script>
</html>

使用在線HTML/CSS/JavaScript代碼運(yùn)行工具http://tools.jb51.net/code/HtmlJsRun測(cè)試運(yùn)行上述代碼,可得到如下運(yùn)行結(jié)果:

github地址:https://github.com/krapnikkk/JS-gameMathematics

采用這種方式判斷邏輯極其簡(jiǎn)單,效率也比較高,但不太精確,如果A物體的大小比格子小很多,則物體行動(dòng)的時(shí)候可能看起來(lái)離B物體有些距離就無(wú)法行走了,所以做這種類型游戲最好保證格子足夠小或者保證人物大小和格子相差不大

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • JavaScript入門教程之引用類型

    JavaScript入門教程之引用類型

    引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起。這篇文章主要介紹了JavaScript入門教程之引用類型的相關(guān)資料,需要的朋友一起學(xué)習(xí)吧
    2016-05-05
  • JS實(shí)現(xiàn)骰子3D旋轉(zhuǎn)效果

    JS實(shí)現(xiàn)骰子3D旋轉(zhuǎn)效果

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)骰子3D旋轉(zhuǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • div模擬滾動(dòng)條效果示例代碼

    div模擬滾動(dòng)條效果示例代碼

    滾動(dòng)條想必大家都見過吧,在本文將使用div來(lái)模擬滾動(dòng)條的效果,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下
    2013-10-10
  • 如何解決hover在ie6中的兼容性問題

    如何解決hover在ie6中的兼容性問題

    本篇主要分享了如何解決hover在ie6中的兼容性問題的方法,希望會(huì)對(duì)大家學(xué)習(xí)javascript有所幫助
    2016-12-12
  • js實(shí)現(xiàn)輪播圖特效

    js實(shí)現(xiàn)輪播圖特效

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)輪播圖特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • ECharts餅圖顏色設(shè)置的4種方式總結(jié)

    ECharts餅圖顏色設(shè)置的4種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于ECharts餅圖顏色設(shè)置的4種方式,ECharts餅圖的顏色可以通過多種方式進(jìn)行設(shè)置,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 簡(jiǎn)單使用webpack打包文件的實(shí)現(xiàn)

    簡(jiǎn)單使用webpack打包文件的實(shí)現(xiàn)

    這篇文章主要介紹了簡(jiǎn)單使用webpack打包文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • ES6學(xué)習(xí)教程之對(duì)象字面量詳解

    ES6學(xué)習(xí)教程之對(duì)象字面量詳解

    相對(duì)于ES5,ES6的對(duì)象字面量得到了很大程度的增強(qiáng),下面這篇文章主要給大家介紹了關(guān)于ES6學(xué)習(xí)教程之對(duì)象字面量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • javascript中eval和with用法實(shí)例總結(jié)

    javascript中eval和with用法實(shí)例總結(jié)

    這篇文章主要介紹了javascript中eval和with用法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript中eval和with的功能、用法與相關(guān)注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • JS對(duì)字符串編碼的幾種方式使用指南

    JS對(duì)字符串編碼的幾種方式使用指南

    在客戶端中,要對(duì)字符串編碼,可以采用:escape();encodeurl();encodeURIComponent();下面我們就來(lái)具體講解下這幾個(gè)方法。
    2015-05-05

最新評(píng)論

泊头市| 漯河市| 宁陵县| 南充市| 六安市| 马尔康县| 乌兰察布市| 延吉市| 通海县| 太白县| 富川| 伽师县| 香格里拉县| 枣强县| 太仓市| 迁西县| 青神县| 西畴县| 元阳县| 南靖县| 淮安市| 浪卡子县| 抚州市| 永修县| 石屏县| 桦甸市| 岳普湖县| 偃师市| 永年县| 大安市| 江都市| 扎囊县| 贵阳市| 离岛区| 崇义县| 永嘉县| 昭苏县| 无为县| 新平| 资兴市| 东乌|