1

对于我的 android 游戏,我使用 Libgdx,并且我检测到 Bob (Omino) 和 Plant (Pianta) 之间的碰撞,这段代码运行良好: 图片1 Assets.class

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

钢琴类

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;
       }

}

世界级

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,你可以看到 Bob 击中但没有与石头碰撞(Pietra)! 图片2 这是代码:

资产类

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

彼得拉类

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);
   }

}

世界级

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);
        }
   }

重叠测试仪

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;
    }

有人可以告诉我为什么即使没有碰撞,与植物的碰撞也能正常工作并且用石头击中鲍勃?如您所见,代码是相同的,唯一的区别是植物是动画对象,而石头不是。

4

3 回答 3

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);
}
于 2012-11-24T01:49:46.293 回答
2

如果我理解正确的重叠矩形检查矩形是否完全在里面的情况。这可能不是你想要的。

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

于 2012-11-24T09:30:01.937 回答
0

您可能希望用 Rectangle 的辅助函数contains替换您的 OverlapTester 。例如:

世界级

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

可:

if (piante.get(i).bounds.contains(omino.bounds)) {
    omino.ominoMorto();
}
于 2014-12-20T18:25:23.717 回答