【问题标题】:Bounding box doesn't rotate when the sprite rotates精灵旋转时边界框不旋转
【发布时间】:2014-01-24 11:14:56
【问题描述】:

正在开发一个简单的 Java 2D 游戏。坦克由用户控制。它可以任意角度旋转,并沿该角度的方向移动。

我正在为坦克制作一个边界框,以便稍后我可以添加碰撞检测。目前,无论它走到哪里,我都有一个跟随精灵的盒子,但是当精灵旋转时它不会旋转。我尝试添加代码以使框与精灵一起旋转,但添加此代码只会使边界框变得疯狂。它不再以盒子的形式出现,更像一条线,只是在闪烁和移动。

(显然边界框应该是不可见的,但现在我在屏幕上绘制它以检查是否有问题)。

xcoo[]ycoo[] 都是 double 类型,每个都包含四个值。这些值是边界框的四个顶点的坐标(一个矩形的Path2D)。

(请注意,实际的边界框仅在需要在屏幕上绘制时创建,或者在我尚未编写的碰撞检测中创建。大多数情况下,它只是坐标。)

在游戏循环的每个循环中都会调用 Tank 的 move() 方法。

move() 方法更新精灵的位置,以及边界框的位置。这工作正常。但正如我所说,尝试在该方法中旋转边界框(也就是使用旋转矩阵操作它的顶点),让它去

这是Tankmove()方法:

public void move(){

    // Updates the location of the sprite. (works)
    x += dx;
    y += dy;

    bbCenterX += dx;
    bbCenterY += dy;

    // Updates the location of the bounding box. (works)    
     for(int i=0;i<4;i++){
        xcoo[i] += dx;
        ycoo[i] += dy;
    } 

    // Should rotate the bounding box (aka, manipulate it's coordinates
    // so when it is created with these coordinates, it's rotated).
    // (Doesn't work).
    for(int z=0;z<4;z++){

        xcoo[z] = xcoo[z] - bbCenterX;
        ycoo[z] = ycoo[z] - bbCenterY;

        xcoo[z] = ((xcoo[z] * Math.cos(angle)) - (ycoo[z] * Math.sin(angle)));
        ycoo[z] = ((xcoo[z] * Math.sin(angle)) + (ycoo[z] * Math.cos(angle)));

        xcoo[z] = xcoo[z] + bbCenterX;
        ycoo[z] = ycoo[z] + bbCenterY;

    }

}

我的轮换出了什么问题?我怀疑这就是问题所在的代码部分,但如果您有不同的想法,请告诉我发布更多代码。

非常感谢

【问题讨论】:

  • 让我想起了我的商业艺术家叔叔在 1970 年告诉我的一个故事。他正在制作一个电视广告(用于卡车),其中包含一些最早的计算机图形。极客们首先让卡车车轮滚到屏幕上,然后卡车车身下降到车轮上。然后车轮滚开,留下(哎呀!)卡车车身站在那里。他们在第二次拍摄时就做对了。

标签: java rotation sprite bounding-box


【解决方案1】:

回答您的问题的标题 - 当精灵旋转时边界框不旋转

在计算机图形学中,边界框最常见的实现是Axis-aligned minimum bounding box,当您旋转精灵时,它显然不会旋转,因为它是轴对齐的

我不知道您正在使用的 Java 2D 包实现了什么实现,但它听起来确实像这样,而不是您希望的 Arbitrarily oriented minimum bounding box

也许您的边界框的渲染以某种方式假定它是axis-aligned,因此当您使用不是axis-aligned 的框呈现它时无法渲染。

【讨论】:

  • 不,遗憾的是我需要旋转边界框,因为精灵必须旋转,而边界框必须包含所有精灵并且只有精灵。我希望我能把它做成一个轴对齐的矩形,它会让我的事情变得更容易。当您查看我的轮换代码时,您发现有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2013-03-13
  • 1970-01-01
相关资源
最近更新 更多