有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

旋转Java碰撞检测旋转矩形?

我正在编写我的第一个java游戏,到目前为止:

我制作了一个矩形,可以让WSAD四处走动,他总是面对鼠标指向的地方。此外,如果你点击,他会在你鼠标指向的地方射出子弹(子弹会朝这个方向旋转)。我也制造了敌人,他们会跟着你转,面对你的角色。我遇到的问题是,我编写的碰撞检测只是在对象(角色、敌人和子弹)旋转之前检测它们的碰撞(使用.intersects())。这意味着在绘制时,它们身体的某些部分会重叠

我一直在四处寻找,没有找到任何我理解或适用于我的情况的解决方案。到目前为止,我一直在为每个对象旋转我的Graphics2D网格,所以它们实际上没有被旋转,只是被画出来。有没有一种方法我可以旋转它们的形状,然后使用类似的东西。相交()

任何帮助或建议都将不胜感激

下面是我用来观察它是否会在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;
}

共 (1) 个答案

  1. # 1 楼答案

    如果对象类型为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
      }
    

    你有原始的物品,以防万一这就是你想要的。使用仿射变换可以很容易地组合变换、求逆等