我正在编写我的第一个java游戏,到目前为止:
我制作了一个可以随WSAD走动的矩形,他总是面向鼠标指向的位置。此外,如果你点击,他会射击你的鼠标指向的子弹(并且子弹旋转以面向那个方向)。我也制造了跟随你的敌人,他们旋转面对你的角色。我遇到的问题是我写的碰撞检测只是在旋转之前检测物体(角色,敌人和子弹)的碰撞(使用.intersects())。这意味着它们的某些部分在绘制时会重叠。
我一直在四处寻找,而且我没有找到任何我理解或可以适用于我的情况的解决方案。到目前为止,我一直在为每个对象旋转我的Graphics2D网格,所以它们实际上并没有被旋转,只是被抽出来了。有没有办法可以实际旋转它们的形状,然后使用像.intersects()这样的东西?
感谢任何帮助或建议。
以下是我用来查看它是否会因在x轴上移动而发生碰撞:
public boolean detectCollisionX(int id, double xMove, double rectXco, double rectYco, int width, int height)
{
boolean valid=true;
//create the shape of the object that is moving.
Rectangle enemyRectangleX=new Rectangle((int)(rectXco+xMove)-enemySpacing,(int)rectYco-enemySpacing,width+enemySpacing*2,height+enemySpacing*2);
if (rectXco+xMove<0 || rectXco+xMove>(areaWidth-width))
{
valid=false;
}
if(enemyNumber>0)
{
for (int x=0; x<=enemyNumber; x++)
{
if (x!=id)
{
//enemies and other collidable objects will be stored in collisionObjects[x] as rectangles.
if (enemyRectangleX.intersects(collisionObjects[x])==true)
{
valid=false;
}
}
}
}
return valid;
}
答案 0 :(得分:5)
如果对象属于Area类型,您可以使用AffineTransform类来旋转各种对象。
假设您有两个对象a和b,您可以像这样旋转它们:
AffineTransform af = new AffineTransform();
af.rotate(Math.PI/4, ax, ay);//rotate 45 degrees around ax, ay
AffineTransform bf = new AffineTransform();
bf.rotate(Math.PI/4, bx, by);//rotate 45 degrees around bx, by
ra = a.createTransformedArea(af);//ra is the rotated a, a is unchanged
rb = b.createTransformedArea(bf);//rb is the rotated b, b is unchanged
if(ra.intersects(rb)){
//true if intersected after rotation
}
并且您拥有原始对象以防万一您想要的。使用AffineTransform可以很容易地组合转换,反转它们等。