1

私のAndroidゲームでは、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;
       }

}

ワールドクラス

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

}

ワールドクラス

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

植物との衝突がうまく機能し、衝突がなくてもボブが石にぶつかった理由を誰かに教えてもらえますか?コードが同じであることがわかるように、唯一の違いは、植物がアニメーション化されたオブジェクトであるのに対し、石はアニメーション化されていないことです。

4

3 に答える 3

2

私が正しいと理解した場合、overlapRectanglesは、長方形が完全に内側にあるかどうかをチェックします。それはおそらくあなたが望むものではありません。

LibGDX には、衝突チェックのための特別な機能があります。http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Intersector.htmlを確認してください。

于 2012-11-24T09:30:01.937 に答える
2

OverlapTester を確認してください。Rectangle.java クラスで Libgdx が行う方法は次のとおりです。

/** @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 に答える
0

OverlapTester を Rectangle のヘルパー関数containsに置き換えたいと思うかもしれません。例えば:

ワールドクラス

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 に答える