【问题标题】:Rotating image so that it faces another image [duplicate]旋转图像以使其面对另一个图像[重复]
【发布时间】:2013-04-22 12:31:38
【问题描述】:

我正在创建一个游戏,并希望敌人在跟随玩家时面对玩家。我曾尝试以这种方式使用 AffineTransform:

at = new AffineTransform();
angle = Math.atan2(player.getY() - y,player.getX() - x) + (Math.PI / 2);
at.setToTranslation(x, y);
at.rotate(angle, width / 2, height / 2);

然后使用g2D.drawImage(image,at,this); 在屏幕上绘制敌人。问题是敌人只是面对屏幕上的一个随机位置,它确实会旋转以面对那个点,但它并没有像我想要的那样面对玩家。我在播放器类中使用完全相同的代码让播放器面对鼠标光标,然后它工作得很好,那为什么它不能面对播放器呢?

【问题讨论】:

  • @AndrewThompson 是正确的。虽然您的问题略有不同(谈论面向玩家的敌人),但与让图像 X 面向位置 Y 的潜在问题相同。
  • @DuncanJones 我专门写了面向鼠标光标的代码不适用于获取玩家 x 和 y 并使敌人图像面向玩家位置。因为这个问题回答了如何让图像面对鼠标光标,所以它不能让敌人面对玩家。

标签: java rotation affinetransform


【解决方案1】:

您的方法的一个问题是您没有考虑敌人已经面对的角度(他的图像),他可以在相同的 (x,y) 处但具有任何角度 [0,360] .因此,您的轮换似乎是随机的,因为当您轮换他时会考虑到球员,而轮换他时不会考虑到他自己的面貌。你必须弄清楚他的图像面对的角度,找出玩家面对的角度,然后根据这个旋转他。

我建议为每个敌人/玩家添加一个字段Enum facing(如果角度很少且角度有限)或int facing,以保持其图像所面对的角度。

【讨论】:

  • 现在我的代码如下所示:
  • Vector2d position = new Vector2d(playerX, playerY); Vector2d zombie = new Vector2d(100,100); Vector2d facing = new Vector2d(0, -1); position.sub(zombie); position.normalize(); facing.normalize(); at = new AffineTransform(); angle = position.angle(facing); angle = Math.atan2(playerY - y, playerX - x) + (Math.PI / 2); at.setToTranslation(x, y); at.rotate(angle, width / 2, height / 2);
  • 我觉得僵尸现在一直面向玩家的生成位置,而不是真正的玩家。我在线程中有该代码,因此它应该一直更新。
  • 那么问题是playerX,playerY。它们没有改变(尝试将它们打印到控制台)。你应该在 player-class 中为它们设置 getter,getPlayerX(),getPlayerY(),这样你就可以将 Player 对象传递给僵尸,它们将始终知道玩家在哪里。
  • 我尝试在线程中添加player = new Player(); playerX = player.getX(); playerY = player.getY();,但它仍然面对玩家生成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2016-10-19
  • 2013-10-19
  • 2014-05-12
相关资源
最近更新 更多