在Java 2D游戏中,我有一个坦克的矩形精灵。精灵可以任意角度旋转,并沿该角度方向行进。
这个精灵需要有一个边界框,所以我可以检测到它的碰撞。
此边界框需要:
显然它应该是隐形的,但是现在我正在屏幕上绘制框以查看它是否有效。它没有。
我的问题是:
当精灵平行于x轴或y轴时,该框紧跟正确并精确地“包裹”精灵。
但是当精灵徘徊 diagonaly 时,该框不会正确跟随精灵。
有时它沿x轴移动太多而沿y轴移动太少。有时相反。也许有时两者都太多或太少。不确定。
你能查看我的代码并告诉我你是否看错了什么?
(请注意:边界框大部分时间实际上只是两个坐标数组,每个坐标包含4个值。坐标用于在检查碰撞时或在绘制框时形成多边形到屏幕)。
来自Entity
类的相关代码,Tank
的超类:
int[] xcoo = new int[4]; // coordinates of 4 vertices of the bounding box.
int[] ycoo = new int[4];
double x,y; // current position of the sprite.
double dx,dy; // how much to move the sprite, and the vertices of the bounding box.
double angle; // current angle of movement and rotation of sprite and bounding-box.
// Returns a Polygon object, that's the bounding box.
public Polygon getPolyBounds(){ return new Polygon(xcoo,ycoo,xcoo.length) ; }
public void move(){
// Move sprite
x += dx;
y += dy;
// Move vertices of bounding box.
for(int i=0;i<4;i++){
xcoo[i] += dx;
ycoo[i] += dy;
}
// Code to rotate the bounding box according to the angle, will be added later.
// ....
}
来自Board
课程的相关代码,该课程运行大部分游戏。
这是来自游戏循环。
// keysPressed1 is an array of flags to tell which key is currently pressed.
// if left arrow is pressed
if(keysPressed1[0]==true)
tank1.setAngle(tank1.getAngle()-3);
// if right arrow is pressed
if(keysPressed1[1]==true)
tank1.setAngle(tank1.getAngle()+3);
// if up arrow is pressed (sets the direction to move, based on angle).
if(keysPressed1[2]==true){
tank1.setDX(2 * Math.cos(Math.toRadians(tank1.getAngle())));
tank1.setDY(2 * Math.sin(Math.toRadians(tank1.getAngle())));
tank1.move(); // should move both the sprite, and it's bounding box.
}
非常感谢你的帮助。如果您需要我解释有关代码的内容,以便您可以帮助我,请说明。
答案 0 :(得分:2)
您的精灵正在使用double
并且您的边界框正在使用int
,请参阅以下声明:
int[] xcoo = new int[4];
double x, y
以下更新:
(double dx, dy
,显示为double
)
x += dx
xcoo[i] += dx
在后者(边界框)中,您将int
添加到double
,这会导致它在投射到整数时丢弃它的小数位。
因此,为什么他们不会完全遵循精灵,因为int
永远不会跟随double
。
要解决此问题,您需要使用xcoo, ycoo
和相应的方法来处理double
而不是int
。
更新:因此Polygon
只需要Integer
,所以要解决这个问题,请查看以下问题:Polygons with Double Coordinates
您应该使用Path2D.Double