亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JS/HTML5游戲常用算法之追蹤算法實例詳解

2019-11-19 12:21:12
字體:
來源:轉載
供稿:網友

本文實例講述了JS/HTML5游戲常用算法之追蹤算法。分享給大家供大家參考,具體如下:

追蹤算法在動作游戲中非常常見,從很早的游戲《吃豆人》到大型的街機機戰類游戲,到處可見追蹤效果的身影。一個好的追蹤算法將會大大提高游戲的可玩性和玩家的興趣。

【簡單算法】

先來看一個簡單的跟蹤算法,如下圖所示,假設在canvas坐標系中存在物體A和B,物體A將把B作為追蹤目標,物體在二維空間中的運動可以分解為坐標系中X、Y軸的運動,其在X和Y方向的速度決定了物體運行的方向和速率。別忘了,速度是有方向和大小的,于是物體A的速度在X、Y軸方向分解成vx、vy,B物體也是一樣,這樣,如果物體A要追蹤到B,只需要比較兩個物體分別在 X、Y 方向的速度即可。設物體 A 坐標為(x1, y1),A 的速度分解為(vx, vy),物體B 坐標為(x2, y2),B 的速度分解為(vx1, vy1),假設A 要追到B,對于水平X 方向分量來說,如果x2>x1,表示B在A的右邊,這時候必須設置vx為某一個正值,反之,則需要將vx設置成一個負值,同樣的道理,對于垂直方向Y來說,需要進行同樣的處理即可。

基于以上這個簡單算法的原理,可以來嘗試一個簡單的例子。

<!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></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;    balls = [];    var ball = {      x: stage.width / 2 - 20,      y: stage.height / 2 - 20,      r: 20,      c: "red"    };    balls.push(ball);    for (var i = 0; i < 30; i++) {      var trace = {        x: Math.ceil(Math.random() * (stage.width - 20) + 10),        y: Math.ceil(Math.random() * (stage.height - 20) + 10),        r: 10,        c: "blue"      };      balls.push(trace);    }    function createBall(x, y, r, c) {      ctx.beginPath();      ctx.fillStyle = c;      ctx.arc(x, y, r, 0, Math.PI * 2);      ctx.fill();    }    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].y = y;    });    function update() {      ctx.clearRect(0, 0, 400, 400);      ctx.fillStyle = "black";      ctx.rect(0, 0, 400, 400);      ctx.fill();      createBall(balls[0].x, balls[0].y, balls[0].r, balls[0].c);      for (var i = 1, len = balls.length; i < len; i++) {        //簡單算法        balls[i].x -= ( balls[0].x>balls[i].x)?-1:1;        balls[i].y -= ( balls[0].y>balls[i].y)?-1:1;        createBall(balls[i].x, balls[i].y, balls[i].r, balls[i].c);      }      requestAnimationFrame(update);    }    update();  };</script></html>

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具http://tools.VeVB.COm/code/HtmlJsRun測試運行上述代碼,觀察運行效果。

采用這種算法的方塊的行動比較突兀,方塊的變向比較突然,效果看起來不是非常理想,于是,就產生了下面的視線追蹤算法。

【視線追蹤算法】

視線追蹤算法,采用這種算法,追蹤者將會始終保持著和目標對象的直線進行移動,如下圖所示,看起來就好像追蹤捕食的獵豹一樣,死死地盯著目標不放。

如果要達到這種效果,實際上就表示在任意時刻,A 的速度方向必須保持在 AB 之間連接的直線上面,那么這個時候如何獲取A的速度在x軸和y軸方向上的分量呢?

這里我們可以采用向量來解決問題,向量是一種只有方向和大小而沒有位置的概念,由向量的知識可知,假設任意時刻物體 A 向量表示為 v1(x1, y1),物體 B 向量表示為 v2(x2, y2),則由A 指向B 位置的向量v3=(x2−x1, y2−y1)。這3 個向量的關系可以由圖6-4 表示出來,設向量v3的長度為VLen = (x2−x1)²+(y2−y1)² ,則向量v3標準化后可以用v4=((x2−x1)/VLen,(y2−y1)/VLen)表示。最后得到的v4在x軸方向上的分量就可以作為物體A在該時刻X軸方向上的分量,v4在Y軸方向上的分量就可以作為物體A在該時刻Y軸方向上的分量。

將上面的簡單算法,按照視線追蹤算法進行改寫:

<!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></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;    balls = [];    var ball = {      x: stage.width / 2 - 20,      y: stage.height / 2 - 20,      r: 20,      c: "red"    };    balls.push(ball);    for (var i = 0; i < 30; i++) {      var trace = {        x: Math.ceil(Math.random() * (stage.width - 20) + 10),        y: Math.ceil(Math.random() * (stage.height - 20) + 10),        r: 10,        c: "blue"      };      balls.push(trace);    }    function createBall(x, y, r, c) {      ctx.beginPath();      ctx.fillStyle = c;      ctx.arc(x, y, r, 0, Math.PI * 2);      ctx.fill();    }    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].y = y;    });    function update() {      ctx.clearRect(0, 0, 400, 400);      ctx.fillStyle = "black";      ctx.rect(0, 0, 400, 400);      ctx.fill();      createBall(balls[0].x, balls[0].y, balls[0].r, balls[0].c);      for (var i = 1, len = balls.length; i < len; i++) {        //視線追蹤算法        var vx = balls[i].x - balls[0].x,          vy = balls[i].y - balls[0].y,          rlen = Math.sqrt(vx * vx + vy * vy),          dx = vx / rlen,          dy = vy / rlen;        balls[i].x -= dx;        balls[i].y -= dy;        createBall(balls[i].x, balls[i].y, balls[i].r, balls[i].c);      }      requestAnimationFrame(update);    }    update();  };</script></html>

使用在線HTML/CSS/JavaScript代碼運行工具http://tools.VeVB.COm/code/HtmlJsRun測試運行上述代碼,可得到如下運行結果:

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

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript數學運算用法總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript數組操作技巧總結》、《JavaScript排序算法總結》、《JavaScript遍歷算法與技巧總結》、《JavaScript查找算法技巧總結》及《JavaScript錯誤與調試技巧總結

希望本文所述對大家JavaScript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人在线精品视频| 欧美成人精品三级在线观看| 欧美另类第一页| 亚洲国产高清高潮精品美女| 国产视频欧美视频| 欧美电影在线观看高清| 欧美日韩午夜视频在线观看| 日韩高清a**址| 超碰精品一区二区三区乱码| 色诱女教师一区二区三区| 91在线播放国产| 最近2019中文字幕一页二页| 国产精品视频免费在线| 中文字幕精品在线视频| 国产精品视频区1| 在线观看久久av| 久久久成人精品| 国产一区视频在线| 久久久女女女女999久久| 亚洲欧美制服另类日韩| 国产剧情日韩欧美| 欧美片一区二区三区| 亚洲欧美在线播放| 久久久噜噜噜久噜久久| 日本精品中文字幕| 久久69精品久久久久久久电影好| 亚洲精品久久久久国产| 91欧美精品成人综合在线观看| 国产成人jvid在线播放| 日韩女优在线播放| 国产主播欧美精品| 国产va免费精品高清在线观看| 中文字幕免费精品一区高清| 茄子视频成人在线| 欧美日韩精品在线观看| 国产精品男人的天堂| 日本电影亚洲天堂| 永久免费看mv网站入口亚洲| 久国内精品在线| 成人久久久久久| 国产97在线播放| 亚洲第一福利视频| 国产精品 欧美在线| 亚洲高清一二三区| 狠狠色狠狠色综合日日小说| 国产免费一区视频观看免费| 超碰日本道色综合久久综合| 亚洲aⅴ男人的天堂在线观看| 亚洲精品福利视频| 中文字幕亚洲专区| 亚洲综合小说区| 国产精品18久久久久久麻辣| 久久久久久久电影一区| 国产精品ⅴa在线观看h| 欧美在线视频免费播放| 欧美亚洲成人xxx| 中文字幕无线精品亚洲乱码一区| 狠狠久久亚洲欧美专区| 欧美另类精品xxxx孕妇| 亚洲自拍偷拍区| 狠狠久久五月精品中文字幕| 成人福利视频网| 亚洲精品一区二区三区婷婷月| 国产精品久久久久免费a∨大胸| 92看片淫黄大片看国产片| 久久综合88中文色鬼| 欧美激情一级二级| 国产精品海角社区在线观看| 久热精品视频在线观看| 欧美日韩免费看| 亚洲色图色老头| 日韩国产欧美区| 精品丝袜一区二区三区| 国产精品日韩av| 久久av资源网站| 69久久夜色精品国产69| 国产精品一区av| 国产欧美一区二区三区在线| 久久亚洲综合国产精品99麻豆精品福利| 欧美精品aaa| 欧美韩国理论所午夜片917电影| 91亚洲国产成人精品性色| 欧美大尺度激情区在线播放| 欧美香蕉大胸在线视频观看| 6080yy精品一区二区三区| 国产在线精品成人一区二区三区| 国产欧美日韩专区发布| 国产精品亚发布| 欧美成人激情视频免费观看| 成人激情电影一区二区| 国产精品亚洲欧美导航| 亚洲成人黄色网址| 日本高清不卡在线| 国产精品美女www| 国产色婷婷国产综合在线理论片a| 日韩欧美亚洲一二三区| 91人人爽人人爽人人精88v| 亚洲一区二区免费在线| 国产精品嫩草影院一区二区| 欧美激情国产高清| 日韩一级黄色av| 91中文在线观看| 国产精品亚发布| 国模gogo一区二区大胆私拍| 亚洲国产精品va在线看黑人动漫| 夜夜嗨av色一区二区不卡| 在线播放日韩专区| 亚洲a成v人在线观看| 精品视频久久久| 国产精品美女www爽爽爽视频| 欧美精品18videos性欧| 久久婷婷国产麻豆91天堂| 久久久久999| 国产亚洲精品日韩| 日韩在线视频线视频免费网站| 亚洲国产另类久久精品| 亚洲黄色av网站| 亚洲成人久久久| 日本欧美爱爱爱| 综合激情国产一区| 97国产精品视频| 亚洲精品福利视频| 一区二区三区 在线观看视| 日本中文字幕不卡免费| 欧美在线视频网站| xxxx欧美18另类的高清| 日韩电影免费观看在线| 亚洲成人aaa| 久久久精品国产网站| 97精品国产97久久久久久免费| 欧美日韩国产一区二区| 国产精品香蕉av| 91超碰caoporn97人人| 国产精品第三页| 亚洲精品久久久久中文字幕欢迎你| 欧美中文在线观看| 欧美第一淫aaasss性| 欧美最猛黑人xxxx黑人猛叫黄| 欧美另类在线观看| 青青草99啪国产免费| 中文字幕亚洲一区| 国产精品久久久久福利| 精品久久久久久久久中文字幕| 日韩欧美在线视频观看| 亚洲人高潮女人毛茸茸| 欧美一区二区视频97| 97精品久久久中文字幕免费| 97视频免费在线观看| 欧美主播福利视频| 国产精品在线看| 国产精品视频白浆免费视频| 亚洲淫片在线视频| 精品亚洲一区二区三区在线播放| 夜夜躁日日躁狠狠久久88av| 欧美大片免费观看在线观看网站推荐| 91夜夜未满十八勿入爽爽影院| 18一19gay欧美视频网站| 亚洲国产精品99久久| 超碰97人人做人人爱少妇| 亚洲国产精彩中文乱码av| 91av国产在线| 欧美在线观看日本一区| 欧美日韩国产一区中文午夜| 久久五月天综合|