java - 当 Sprite 旋转时,边界框不旋转

标签 java rotation sprite bounding-box

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

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

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

xcoo[]ycoo[] 都是 double 类型,并且各自保存四个值。这些值是边界框(矩形 Path2D)的四个顶点的坐标。

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

坦克的 move() 方法在游戏循环的每个周期都会被调用。

move() 方法更新 Sprite 的位置以及边界框的位置。这很好用。但正如我所说,尝试在该方法中旋转边界框(又名使用旋转矩阵操纵它的顶点),使其继续

这是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;

    }

}

我的旋转有什么问题吗?我怀疑这就是代码中出现问题的部分,但如果您有不同的想法,请告诉我发布更多代码。

非常感谢

最佳答案

回答问题的标题 - 当 Sprite 旋转时,边界框不会旋转

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

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

也许边界框的渲染在某种程度上假设它是轴对齐的,因此当您使用非轴对齐的框来呈现它时无法渲染。

关于java - 当 Sprite 旋转时,边界框不旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20960331/

相关文章:

java - 违反完整性约束 (...) - 找到子记录、Java、Oracle、Hibernate

java - 如何使用 Java 8 Lambdas 执行以下操作

matrix - 在 3D 中组合多个旋转矩阵

css - 如何将背景图像设置为右居中并仍然使用 Sprite ?

python - Pygame - Sprite 与 Sprite 组的碰撞

追加到 stringBuilder 时发生 java 堆错误

java - 从 ArrayList 类继承出现问题, 'receiving non-static method can not be referenced in static context' 错误

javascript - 如何在 JavaScript 中确定图像旋转后是否位于可见 Canvas 之外?

python - 为什么我的循环只旋转一次?

iphone - Cocos2D 在 iPhone 上立即崩溃,但在模拟器中没有