一个大问题(至少在我看来)是这个游戏如何处理形状的锚点,就像玩家一样。
我们可以通过在其位置上绘制一个小红色矩形来突出显示锚点:
g.setColor(Color.RED);
g.drawRect((int)player.getX() -5, (int)player.getY() -5, 10, 10);
这进入方法,所以它看起来像:Draw#renderGame(Graphics2D)
private void renderGame(Graphics2D g) {
g.rotate(Math.toRadians(player.rot), player.getX()+64, player.getY()+64);
g.drawImage(player.getCurrentFrame(), (int)player.getX(), (int)player.getY(), player.getWidth(), player.getHeight(), null);
g.setColor(Color.RED);
g.drawRect((int)player.getX() -5, (int)player.getY() -5, 10, 10);
g.rotate(-Math.toRadians(player.rot), player.getX()+64, player.getY()+64);
//...
然后我们会看到锚点不在图像的中心:
如您所见,锚点(旋转前的原始(0,0)点)不在图像的中心,十字准线与它相关,而不是玩家的视图。
这是由于玩家旋转时的移位操作而发生的:
g.rotate(Math.toRadians(player.rot), player.getX()+64, player.getY()+64);
//...
g.rotate(-Math.toRadians(player.rot), player.getX()+64, player.getY()+64);
您正在用 .我建议删除它,并将移位添加到调用中,以便锚点正确位于中心(请注意,我避免了固定值64):+64
g.drawImage
g.rotate(Math.toRadians(player.rot), player.getX(), player.getY());
g.drawImage(player.getCurrentFrame(), (int)player.getX() - (player.getWidth() / 2), (int)player.getY() - (player.getHeight() / 2), player.getWidth(), player.getHeight(), null);
g.rotate(-Math.toRadians(player.rot), player.getX(), player.getY());
然后你现在开枪,你会看到子弹总是从玩家的某个位置“开始”。这里的问题是您使用的偏移不正确。正确的值为:
float gunOffsetX = 35, gunOffsetY = 29;
(我通过反复试验得到了它们,所以如果你愿意,你可以再调整一下)
现在它看起来像这样:
如您所见,射击仍然有点放错位置,但是由于子弹的旋转不正确(就像您对玩家形状所做的那样),因此会发生这种情况:
g.rotate(Math.toRadians(f.rot), f.getX()+f.getWidth()/2, f.getY()+f.getHeight()/2);
g.drawImage(f.img, (int)f.getX(), (int)f.getY(), f.getWidth(), f.getHeight(), null);
g.rotate(-Math.toRadians(f.rot), f.getX()+f.getWidth()/2, f.getY()+f.getHeight()/2);
它应该看起来像这样(没有任何X或Y调整):
g.rotate(Math.toRadians(f.rot), f.getX(), f.getY());
g.drawImage(f.img, (int)f.getX(), (int)f.getY(), f.getWidth(), f.getHeight(), null);
g.rotate(-Math.toRadians(f.rot), f.getX(), f.getY());
最终结果是:
玩家现在正确地看着十字准线,镜头被放置在枪前。
如果你喜欢直接通过十字准线的中心射击,你只需要稍微调整玩家的位置和子弹偏移。
播放器 (在 ):Draw#renderGame(Graphics2D)
g.drawImage(player.getCurrentFrame(), (int)player.getX() - (player.getWidth() / 2), (int)player.getY() - (player.getHeight() / 2) - 30, player.getWidth(), player.getHeight(), null);
(注意在-30
(int)player.getY() - (player.getHeight() / 2) - 30
)
子弹:
float gunOffsetX = 35, gunOffsetY = 0;
现在子弹穿过十字准线(请注意,红色矩形正好在武器上):
(我有点太愚蠢了,无法创建适当的GIF文件,所以我只能提供图片)
现在,您拥有了必要的偏移值来获得所需的结果,但是您绝对应该尝试了解为什么这些值现在如此。稍后需要用动态值替换它们,因为不同的武器需要不同的子弹偏移量,因为玩家图像不同。拥有某种带有每种武器类型实例的类应该会有所帮助,其中包含图像和武器桶在图像中的位置的坐标。然后,您可以使用这些坐标来正确设置项目符号图像的偏移量。