首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >碰撞检测精度

碰撞检测精度
EN

Code Review用户
提问于 2013-05-20 20:06:01
回答 2查看 241关注 0票数 4

你们认为我如何改进我的网站asteroidfield.eu5.org上的碰撞检测代码?当前代码是

代码语言:javascript
复制
var dx = Math.abs(c1.getcx() - c2.getcx());
var dy = Math.abs(c1.getcy() - c2.getcy());
var dist = Math.sqrt((dx * dx) + (dy * dy));
if (dist - (c1.getR() + c2.getR()) <= 0) {
  if (done === false && invinc !== true) {
    game_over = true;
    done = true;
  }
}

C1指的是玩家的精灵,而C2是敌人的精灵。Getcx本质上是收集碰撞检测圈边缘的X位置,gety也是这样做的,但是收集Y位置。GetR返回碰撞检测圆的半径。

EN

回答 2

Code Review用户

发布于 2013-05-20 23:26:18

你可以改进的一件事是绝对值的获取。在一些浏览器中,按位绝对比Math.abs快。但这取决于浏览器的实现

代码语言:javascript
复制
//bitwise absolute
function abs(n){
  return (n^(n>>31))-(n>>31);
}

您还可以将此部分分解到一个可读性变量中。其结果是布尔值。解释将在下一部分:

代码语言:javascript
复制
//foo true if less than or equal to 0, false if greater
var foo = dist - (c1.getR() + c2.getR()) <= 0; 

而且,在这段代码中,由于doneinvinc是布尔型的,所以没有必要将它们与truefalse进行比较。你可以在这种情况下直接使用它们。

代码语言:javascript
复制
if (done === false && invinc !== true) //when false, and not true (false)

if (!done && !invinc)                  //when not true (false) and not true (false)

在JS中,任务操作“向左溢出”。您可以执行以下操作:将true分配给done,并将相同的值“溢出”给game_over

代码语言:javascript
复制
game_over = done = true;

此外,由于代码的结构,前一种情况只在分配给foo的条件小于或等于零或true时才会发生。因此,让我们将条件修改为:

代码语言:javascript
复制
if(foo && !done && !invinc) game_over = done = true;

最后,您的代码将如下所示:

代码语言:javascript
复制
var dx = Math.abs(c1.getcx() - c2.getcx());
var dy = Math.abs(c1.getcy() - c2.getcy());
var dist = Math.sqrt((dx * dx) + (dy * dy));
var foo = dist - (c1.getR() + c2.getR()) <= 0;

if (foo && !done && !invinc) game_over = done = true;
票数 3
EN

Code Review用户

发布于 2016-06-27 18:49:58

与其用坐标进行数学运算,不如尝试如下:

代码语言:javascript
复制
var board = ["0x0","0x1","0x2","0x3",
             "1x0","1x1","1x2","1x3",
             "2x0","2x1","2x2","2x3",
             "3x0","3x1","3x2","3x3",
             "4x0","4x1","4x2","4x3"]; //Grid-based game board

var player = {
    "x": 0,
    "y": 0,
    "location": "0x0"
};

var enemy = {
    "x": 0,
    "y": 0,
    "location": "0x0"
};

if (player.location == enemy.location){
    //Do things
}
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/26382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档