【问题标题】:Problems making enemy follow moving player使敌人跟随移动玩家的问题
【发布时间】:2015-02-16 10:59:56
【问题描述】:

好的,所以我想制作一个 javascript/html 画布游戏,其中玩家被一些敌人跟踪,经过一点点“研究”后,她是我的怪物(敌人)类中最重要的部分:

  this.UpdateAngle = function() {
    this.dx = this.x - player.x;
    this.dy = this.y - player.y;
    this.angle = Math.atan2(this.dy, this.dx) * 180 / Math.PI;
    if (this.angle < 0) {
      this.angle += 2 * Math.PI;
    }
  }
  this.UpdateSpeed = function() {
    this.speedX = this.speed * Math.cos(this.angle);
    this.speedY = this.speed * Math.sin(this.angle);
  }
  this.Move = function() {
    this.UpdateAngle();
    this.UpdateSpeed();
    this.x += this.speedX;
    this.y += this.speedY;
  }

所以我在这里的意思是用atan2()计算从敌人到玩家的角度,然后用cos()和sin()计算我应该在x和y轴上移动多少,我计算的速度和角度,然后只是移动计算的像素。

这一切似乎都很好,直到我移动玩家,然后敌人开始向奇怪的方向移动。我不知道出了什么问题,如果有人能告诉我这是怎么做的,那就太棒了。 :D

您可以在here 中看到它。 *我已根据 PremierBromanov 的建议更新了代码。

【问题讨论】:

  • 我不知道解决方案(我早就忘记了我曾经知道的三角函数),但作为一种调试方法,我建议在每个实体的当前方向上画一条线运动,以及显示其当前速度的文本。
  • 我帮不了你...但是我发现了另一个故障。对不起! :D 如果你水平移动(强制重新计算角度)当你恰好与敌人处于同一高度时,它会开始从你而不是向你运行:)
  • 至于找出为什么他们在玩家按下按键时表现怪异的原因......我会添加很多 console.log() 调用,每个函数至少一次,可能还有一个每次重新计算 speedX、speedY 或角度时。分析跟踪日志并比较移动时发生的情况。

标签: javascript canvas game-ai


【解决方案1】:

好的,实际上是布罗马诺夫总理回答了这个问题,谢谢,但我不能接受评论,如果有人过来想要也回答。 我做的数学有点错误,这就是我的代码最终的样子:

this.UpdateAngle = function() {
  this.dx = player.x - this.x;
  this.dy = player.y - this.y;
  this.distance = Math.sqrt((this.dx*this.dx) + (this.dy*this.dy));
  this.angle = Math.atan2(this.dy,this.dx) * 180 / Math.PI;
}
  this.UpdateSpeed = function() {
  this.speedX = this.speed * (this.dx/this.distance);
  this.speedY = this.speed * (this.dy/this.distance);
}
this.Move = function() {
  this.UpdateAngle();
  this.UpdateSpeed();
  this.x += this.speedX;
  this.y += this.speedY;
}

再次感谢布罗马诺夫总理,这是他的回答,也感谢其他所有人,这是我的第一篇文章,我很高兴我得到了这么快的回复! (我是这里最慢的):D

【讨论】:

    【解决方案2】:

    可能和这个块有关

    this.angle = Math.atan2(this.dy,this.dx) * 180 / Math.PI;
        if (this.angle < 0) {
          this.angle += 2 * Math.PI;
    

    您正在使用 Math.atan2 以弧度为单位输出角度,然后您将使用 * 180 / Math.PI; 转换为度数之后,您将检查它是否小于零并将 2Pi 添加到角度以确保它是正确计算它是一个完整的圆的实际角度减去该角度。但是,您在这里使用的是弧度而不是度数。因此,当您的代码为负数时,您将 2Pi 添加到度数上,这不是很多,但有时会导致它变为正数。这就是为什么当你移动时你的点在旋转。如果你注意到,当你离得更远时,圆点旋转得更慢,这意味着负角大于 2Pi,因此不会立即转圈。

    简而言之,试试改成这个

    if (this.angle < 0) {
          this.angle += 360;
        }
    

    【讨论】:

    • 顺序与乘除无关吗? num1*(num2/num3) = (num1*num2)/num3
    • 不,你是对的,这无关紧要。我想这只是一种习惯,把分数放在一起。当你添加分数和类似的东西时它更有用,虽然大多数编译器都足够聪明,可以在添加东西之前进行乘法和除法,但我喜欢排除我的代码中操作顺序错误的任何可能性,所以如果它打破了我确切地知道为什么
    • 谢谢,这有帮助,但有时它们似乎仍会绕圈子和奇怪的方向。 (我已经更新了网站上的代码)
    • 看看当玩家不动时它是如何工作的,我认为我们需要从您的代码中获得更多信息。另外,如果我正确读取 Atan2,它已经检查了负角,所以你可能有一些我之前没有意识到的冗余代码
    • 另外,看看这个question。虽然你的数学在我看来没问题,但它可能不正确
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    相关资源
    最近更新 更多