边界框不能正确跟随精灵。 (JAVA)

时间:2014-01-06 21:18:55

标签: java sprite polygon bounding-box

在Java 2D游戏中,我有一个坦克的矩形精灵。精灵可以任意角度旋转,并沿该角度方向行进。

这个精灵需要有一个边界框,所以我可以检测到它的碰撞。

此边界框需要:

  1. 关注屏幕周围的精灵。
  2. 精灵旋转时旋转。
  3. 显然它应该是隐形的,但是现在我正在屏幕上绘制框以查看它是否有效。它没有。

    我的问题是:

    当精灵平行于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.
    
    }
    

    非常感谢你的帮助。如果您需要我解释有关代码的内容,以便您可以帮助我,请说明。

1 个答案:

答案 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