【发布时间】:2014-01-24 11:14:56
【问题描述】:
正在开发一个简单的 Java 2D 游戏。坦克由用户控制。它可以任意角度旋转,并沿该角度的方向移动。
我正在为坦克制作一个边界框,以便稍后我可以添加碰撞检测。目前,无论它走到哪里,我都有一个跟随精灵的盒子,但是当精灵旋转时它不会旋转。我尝试添加代码以使框与精灵一起旋转,但添加此代码只会使边界框变得疯狂。它不再以盒子的形式出现,更像一条线,只是在闪烁和移动。
(显然边界框应该是不可见的,但现在我在屏幕上绘制它以检查是否有问题)。
xcoo[] 和 ycoo[] 都是 double 类型,每个都包含四个值。这些值是边界框的四个顶点的坐标(一个矩形的Path2D)。
(请注意,实际的边界框仅在需要在屏幕上绘制时创建,或者在我尚未编写的碰撞检测中创建。大多数情况下,它只是坐标。)
在游戏循环的每个循环中都会调用 Tank 的 move() 方法。
move() 方法更新精灵的位置,以及边界框的位置。这工作正常。但正如我所说,尝试在该方法中旋转边界框(也就是使用旋转矩阵操作它的顶点),让它去
这是Tank的move()方法:
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