【问题标题】:Java GetBound Gives Original Polygon Position not CurrentJava GetBound 给出的原始多边形位置不是当前的
【发布时间】:2016-07-31 01:18:32
【问题描述】:

我正在使用 GetBounds 方法作为游戏碰撞检测的一部分,它正在做一些相当奇怪的事情。 GetBounds 为我的多边形的原始位置返回一个边界框,但不是我将它移动到的当前位置。这非常令人困惑,因为当我绘制多边形时,它出现在正确的位置。我觉得移动我的多边形很可能是我犯了一个错误,所以我已经包含了我如何移动它的详细描述。

我更改多边形位置的方法是修改从类多边形继承的数组“xpoints”和“ypoints”。通过将多边形的所需位置添加到包含位置 0,0 的多边形的不同数组并替换数组来修改 xpoints 和 ypoints 数组。

代码如下:

Public Class Sword extends Polygon{

int[] SwordXPoints, SwordYPoints

public void main(int DesiredLocation){
for(int i = 0; i < super.ypoints.length; i++){
super.ypoints[i] = SwordXPoints + DesiredLocation;
}
for(int i = 0; i < super.xpoints.length; i++){
super.xpoints[i] = SwordYPoints + DesiredLocation;
}
}
}

我希望这个解释更容易理解和更简单。

谢谢,山姆。

【问题讨论】:

  • 这还不完整,你正在使用你自己的剑等课程,所以我们怎么知道你在里面做什么??
  • 对不起 gpasch,这对我来说似乎很有意义。我会重写它,并尽量避免使用从我的游戏中抽取的任何特定代码,而只是重写它以便于阅读。

标签: java collision-detection polygons


【解决方案1】:

getBounds() 的调用会运行这段代码:

if (bounds == null) {
    calculateBounds(xpoints, ypoints, npoints);
}
return bounds.getBounds();

第一次通过时,bounds 为 null,并调用了 calculateBounds。这将遍历您的点,计算最小和最大 X 和 Y,并创建 bounds。在后续调用中,bounds 不为空,并返回缓存值。

您需要做的是在完成所有点的更新后添加对invalidate() 的调用。

或者,您可以使用AffineTransform 更改Graphics2D 的原点和比例,按原样绘制多边形,并恢复原始原点和比例。粗略的调用顺序是:

AffineTransform origAT = g2.getTransform(); // Save original
AffineTransform newAT = new AffineTransform();
newAT.concatenate(origAT);
newAt.translate(newX, newY);
g2.setTransform(newAt);
g2.draw(polygon);
g2.setTransform(origAt); // restore original

【讨论】:

  • 感谢 Devon_C_Miller。这是为什么它不起作用的完美解释。我想知道你实际上是在哪里找到该代码的,我花了很长时间浏览 oracle 的网站,但找不到任何有关 get bounds 工作原理的代码。
  • @SamChapman 安装 JDK 时,安装中的某处是 src.zip,其中包含 Java 源代码。在紧要关头,您可以打开包装并查看一下。但是,IDE 应该让您控制单击符号并查看源代码。我没有尝试过 Eclipse,但我知道它在 NetBeans 和 IntelliJ IDEA 中都可以工作。
猜你喜欢
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 2019-04-11
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多