Android Libgdx和碰撞检测

时间:2012-11-24 00:48:59

标签: android collision-detection libgdx

对于我的安卓游戏,我使用Libgdx,我检测到Bob(Omino)和Plant(Pianta)之间的碰撞,这个代码运行正常: Image1 Assets.class

pianta = new Animation(0.5f,new TextureRegion(items, 160, 384, 64, 96),
                              new TextureRegion(items, 224, 384, 64, 96));

Pianta.class

public class Pianta extends GameObject {
   public static final float PIANTA_WIDTH = 2;
   public static final float PIANTA_HEIGHT = 3;
   public static float stateTime;
   public Pianta(float x, float y) {
      super(x, y, PIANTA_WIDTH, PIANTA_HEIGHT);   
      stateTime = 0;
   }

    public void update(float deltaTime) {
           stateTime += deltaTime;
       }

}

World.class

Pianta pianta1_0 = new Pianta(x+10,2.2f);
piante.add(pianta1_0);

private void collisionPiante(){
      int len = piante.size();
      for(int i=0;i<len;i++){
         if(OverlapTester.overlapRectangles(piante.get(i).bounds,omino.bounds)){
            omino.ominoMorto();
         }
      }
   }

WorldRender.class

private void renderPiante() {
      TextureRegion keyFrame;
      int len = world.piante.size();
        for(int i = 0; i < len; i++) {
            Pianta pianta = world.piante.get(i);            
            keyFrame = Assets.pianta.getKeyFrame(Pianta.stateTime, Animation.ANIMATION_LOOPING);
            batcher.draw(keyFrame,pianta.position.x, pianta.position.y, 2, 3);
        }


   }

但是如果你看下面的图像2,你可以看到鲍勃击中但没有与石头碰撞(彼得拉)! Image2 这是代码:

Assets.class

pietra1 = new TextureRegion(items,288,416,128,64);

Pietra.class

public class Pietra extends GameObject {
   public static float PIETRA_WIDTH = 4;
   public static float PIETRA_HEIGHT = 2;
   public Pietra(float x, float y) {
      super(x, y, PIETRA_WIDTH, PIETRA_HEIGHT);
   }

}

World.class

Pietra pietra1_0 = new Pietra(x+25,2.2f);
pietre.add(pietra1_0);
private void collisionPietre(){
      int len2 = pietre.size();
      for(int l=0;l<len2;l++){
         if(OverlapTester.overlapRectangles(pietre.get(l).bounds,omino.bounds)){
            omino.ominoMorto();
         }
      }   
   }

WorldRender.class

private void renderPietre() {
      int len = world.pietre.size();
        for(int i = 0; i < len; i++) {
            Pietra pietra = world.pietre.get(i);            
           batcher.draw(Assets.pietra1,pietra.position.x, pietra.position.y, 4, 2);
        }
   }

OverlapTester

public class OverlapTester {
    public static boolean overlapRectangles (Rectangle r1, Rectangle r2) {
        if (r1.x < r2.x + r2.width && r1.x + r1.width > r2.x && r1.y < r2.y + r2.height && r1.y + r1.height > r2.y)
            return true;
        else
            return false;
    }

有人可以告诉我为什么与植物的碰撞工作正常,即使没有碰撞,石头鲍勃也能击中?你可以看到代码是一样的,唯一的区别是植物是一个动画对象而石头不是。

3 个答案:

答案 0 :(得分:2)

检查OverlapTester。这就是Libgdx在Rectangle.java类中的作用:

/** @param rectangle the other {@link Rectangle}
 * @return whether this rectangle overlaps the other rectangle. */
public boolean overlaps (Rectangle rectangle) {
    return !(x > rectangle.x + rectangle.width || x + width < rectangle.x || y > rectangle.y + rectangle.height || y + height < rectangle.y);
}

答案 1 :(得分:2)

如果我理解正确 overlapRectangles 检查矩形是否完全在内的情况。这可能不是你想要的东西。

LibGDX具有冲突检查的特殊功能。请检查http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Intersector.html

答案 2 :(得分:0)

您可能希望使用矩形帮助函数包含替换OverlapTester。例如:

世界级

if(OverlapTester.overlapRectangles(piante.get(i).bounds,omino.bounds)){
    omino.ominoMorto();
}

可以:

if (piante.get(i).bounds.contains(omino.bounds)) {
    omino.ominoMorto();
}