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

JS/HTML5游戲常用算法之碰撞檢測(cè) 包圍盒檢測(cè)算法詳解【圓形情況】

 更新時(shí)間:2018年12月13日 08:40:29   作者:krapnik  
這篇文章主要介紹了JS/HTML5游戲常用算法之碰撞檢測(cè) 包圍盒檢測(cè)算法,結(jié)合實(shí)例形式詳細(xì)分析了圓形包盒情況下的碰撞檢測(cè)算法相關(guān)原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下

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

檢測(cè)物體碰撞實(shí)際上是需要檢測(cè)物體是否相交,而實(shí)際應(yīng)用中物體的形狀大小各異,如果直接對(duì)物體的邊緣進(jìn)行碰撞檢測(cè),實(shí)際計(jì)算過(guò)程的代價(jià)非常高昂。如果物體的數(shù)量太多,比如像網(wǎng)絡(luò)游戲中,通常少則幾千用戶,多則上萬(wàn)、幾十萬(wàn)用戶同時(shí)在線,而這些碰撞都要通過(guò)服務(wù)器檢測(cè),這樣計(jì)算的消耗,即使是大型服務(wù)器也會(huì)崩潰,所以通常不需要十分精確的碰撞檢測(cè)情況下,使用包圍盒算法,即把物體放在一個(gè)多邊形中,這個(gè)多邊形就是包圍盒。

基于這樣一個(gè)概念,通常情況下我們就使用了最簡(jiǎn)單的幾種多邊形,比如圓形、矩形等。

先來(lái)看看如何使用圓形包圍盒算法,圓形包圍盒算法就是使用圓形作為包圍盒將物體包圍起來(lái),檢測(cè)的時(shí)候只需要檢測(cè)兩個(gè)圓形是否碰撞即可。檢測(cè)圓形的碰撞比較容易,假設(shè)圓 A 的坐標(biāo)(x1, y1),半徑是 r1,圓 B 的坐標(biāo)(x2, y2),半徑是 r2,則如果滿足不等式(y2−y1)2+(x2−x1)2≤(r1+r2)2則表示兩個(gè)圓發(fā)生了碰撞,其實(shí)就是圓心之間的距離小于兩個(gè)圓的半徑之和即可,由于計(jì)算距離需要用到開(kāi)方運(yùn)算,效率較低,所以直接比較距離的平方。

關(guān)鍵代碼:

  function hitTest( source, target ) {
   /* 源物體和目標(biāo)物體都包含 x, y 以及 width, height */
   return !(
    Math.pow((source.x - target.x),2) + Math.pow((source.y - target.y),2) > Math.pow((source.r + target.r),2)
   );
  }

完整示例代碼:

<!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>
<h1>是否碰撞:<span class="hitTest">否</span></h1>
<canvas id="stage"></canvas>
</body>
<script>
 window.onload = function () {
  var stage = document.querySelector('#stage'),
   ctx = stage.getContext('2d');
  stage.width = 400;
  stage.height = 400;
  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 (balls[0].x > 0) {
      balls[0].x -= 2;
     }
     break;
    case 38:
     console.log("Top");
     if (balls[0].y > 0) {
      balls[0].y -= 2;
     }
     break;
    case 39:
     console.log("Right");
     if (balls[0].x < stage.width) {
      balls[0].x += 2;
     }
     break;
    case 40:
     console.log("Bottom");
     if (balls[0].y < stage.height) {
      balls[0].y += 2;
     }
     break;
    default:
     return false;
   }
  };
  stage.addEventListener('click', function (event) {
   var x = event.clientX - stage.getBoundingClientRect().left;
   var y = event.clientY - stage.getBoundingClientRect().top;
   balls[0].x = x - balls[0].r/2;
   balls[0].y = y - balls[0].r/2;
  });
  var player = {
   x: stage.width / 2 - 20,
   y: stage.height / 2 - 20,
   r: 40,
   c: "red"
  },balls = [];
  balls.push(player);
  for (var i = 0; i < 10; i++) {
   var ball = {
    x: 60 * i,
    y: 60 * i,
    r: 40,
    c: "blue"
   };
   balls.push(ball);
  }
  function createBall(x, y, r, c) {
   ctx.beginPath();
   ctx.fillStyle = c;
   ctx.arc(x, y, r, 0, Math.PI*2);
   ctx.fill();
  }
  function hitTest( source, target ) {
   /* 源物體和目標(biāo)物體都包含 x, y 以及 width, height */
   return !(
    Math.pow((source.x - target.x),2) + Math.pow((source.y - target.y),2) > Math.pow((source.r + target.r),2)
   );
  }
  function update() {
   ctx.globalAlpha=1;
   ctx.clearRect(0, 0, 400, 400);
   document.querySelector('.hitTest').innerHTML = "否";
   for (var i = 1, len = balls.length; i < len; i++) {
    createBall(balls[i].x, balls[i].y, balls[i].r, balls[i].c);
    var flag = hitTest(balls[0],balls[i]);
    if(flag){
     document.querySelector('.hitTest').innerHTML = "是";
     ctx.globalAlpha=0.5;
    }
   }
   createBall(balls[0].x, balls[0].y, balls[0].r, balls[0].c);
   requestAnimationFrame(update);
  }
  update();
 };
</script>
</html>

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

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

更多關(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)文章

  • 小程序自定義組件實(shí)現(xiàn)城市選擇功能

    小程序自定義組件實(shí)現(xiàn)城市選擇功能

    這篇文章主要介紹了小程序自定義組件實(shí)現(xiàn)城市選擇功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • JS控制對(duì)象移動(dòng)效果

    JS控制對(duì)象移動(dòng)效果

    用js實(shí)現(xiàn)對(duì)象的移動(dòng),不錯(cuò)的應(yīng)用
    2008-09-09
  • JavaScript實(shí)現(xiàn)添加、查找、刪除元素

    JavaScript實(shí)現(xiàn)添加、查找、刪除元素

    這篇文章主要匯總介紹了JavaScript實(shí)現(xiàn)添加、查找、刪除元素的方法,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-07-07
  • Layui數(shù)據(jù)表格之單元格編輯方式

    Layui數(shù)據(jù)表格之單元格編輯方式

    今天小編就為大家分享一篇Layui數(shù)據(jù)表格之單元格編輯方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • Bootstrap模態(tài)框使用詳解

    Bootstrap模態(tài)框使用詳解

    這篇文章主要為大家詳細(xì)介紹了Bootstrap模態(tài)框的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • JavaScript代碼里的判斷小結(jié)

    JavaScript代碼里的判斷小結(jié)

    在JavaScript代碼中,多多少少會(huì)有判斷語(yǔ)句。業(yè)務(wù)越復(fù)雜,邏輯就越復(fù)雜,判斷就越多。今天給大家整理下JavaScript中代碼里常會(huì)用到的那些判斷,有需要的可以參考借鑒。
    2016-08-08
  • 小程序中手機(jī)號(hào)識(shí)別的示例

    小程序中手機(jī)號(hào)識(shí)別的示例

    這篇文章主要介紹了小程序中手機(jī)號(hào)識(shí)別的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JavaScript表格隔行變色和Tab標(biāo)簽頁(yè)特效示例【附j(luò)Query版】

    JavaScript表格隔行變色和Tab標(biāo)簽頁(yè)特效示例【附j(luò)Query版】

    這篇文章主要介紹了JavaScript表格隔行變色和Tab標(biāo)簽頁(yè)特效,結(jié)合實(shí)例形式分析了javascript元素遍歷、事件響應(yīng)相關(guān)操作技巧,并附帶jQuery對(duì)應(yīng)實(shí)現(xiàn)代碼供大家參考,需要的朋友可以參考下
    2019-07-07
  • js不完美解決click和dblclick事件沖突問(wèn)題

    js不完美解決click和dblclick事件沖突問(wèn)題

    當(dāng)某個(gè)元素,如:div,同時(shí)綁定了click事件和dblclick事件,而這兩個(gè)事件又要處理相對(duì)獨(dú)立的業(yè)務(wù),也就是click的時(shí)候不能觸發(fā)dblclick,dblclick的時(shí)候不能觸發(fā)click
    2012-07-07
  • 前端使用crypto.js進(jìn)行加密的函數(shù)代碼

    前端使用crypto.js進(jìn)行加密的函數(shù)代碼

    最近在使用Cookies加密保存數(shù)據(jù)的時(shí)候,接觸到crypto,使用還算簡(jiǎn)單,在這里記錄一下
    2020-08-08

最新評(píng)論

海丰县| 五大连池市| 天峻县| 南通市| 民丰县| 盘山县| 襄汾县| 德令哈市| 中西区| 金沙县| 大石桥市| 花莲县| 新闻| 明星| 桃江县| 仁布县| 洛宁县| 菏泽市| 微山县| 寿光市| 沾化县| 惠州市| 新兴县| 余干县| 嘉荫县| 施甸县| 牙克石市| 芮城县| 南宁市| 车险| 元朗区| 吉林市| 高要市| 乌鲁木齐县| 柞水县| 罗田县| 闵行区| 益阳市| 资阳市| 普陀区| 淄博市|