2012-02-17 12 views
1

ゲームの作業。私は可動式のバスケットを持っています。ゲームの更新ステップでは、2つの間の衝突をチェックします。将来、私は複数のリンゴを追加したいので、私はバスケットとリンゴの間の衝突を検出する最善の方法を探しています。2ビットマップ間の衝突

ガットコード:

public void update() { 
int basketcenterX = basket.getX() + (basket.getWidth()/2); 
int basketcenterY = basket.getY() + (basket.getHeight()/2); 

if (basketcenterX < apple.getX() + apple.getWidth() && basketcenterX > apple.getX()) 
    if (basketcenterY < apple.getY() + apple.getHeight() && basketcenterY > apple.getY()) 

{ 

    Log.d(TAG, "Collision detected!!"); 

} 

Log.d(TAG, "Apple Safe!");} 

それはエミュレータでかなりラグようだ、私はより多くのりんごのインスタンスを追加するとき、それはあまりにも遅くなることを心配しています。これを改善する方法や複数のリンゴをチェックするためにこれを改良する方法に関する提案はありますか?

答えて

4

コードには2つの主な改善点があります。

アクセス方法

はあまりにも過度にゲッターとセッターを使用しないでください。これらは、通常のJavaアプリケーションとは異なり、Androidで最適化することはできません。

public float positionX; 

のようなパブリックプロパティを作成し、直接アクセスしてください。

事前計算

あなたは、左上のビットマップを移動し、持っている必要はありません。あなたはそのポジションを持ちたいと思っており、ポジションはその中心です。したがって、ビットマップをカスタムクラスGameObjectなどにラップし、中心をあらかじめ計算します。あなたは中心を変更するだけです。

gameObjectPosition = basket.getX() + (basket.getWidth()/2) 

ストア幅とあなたのGameObjectクラスの公共分野でのあなたのビットマップの高さと直接それらにアクセスします。

/** 
A possible GameObject class. 

**/ 
public class GameObject{ 
    private Bitmap bitmap; 

    public float width, height; 
    public float positionX; 
    public float positionY; 

    public GameObject(Bitmap bitmap){ 
      this.bitmap = bitmap; 

      width = bitmap.getWidth(); 
      height = btimap.getHeight(); 
    } 

    public void draw(...){ 
      bitmap.draw(positionX-width/2, positionY-height/2); 
    } 

}

あなたはまだパフォーマンスを懸念している場合は、width/2height/2を事前計算します。

+0

ありがとうございます!私はそれを変更しました。新しいコリジョンコード: '\t if(basket.X apple.X - apple。(basket.Y apple.Y - apple.height/2) ' –

+0

apple.width/2とapple.height/2は変更されない可能性があります - それを事前に計算し、apple.halfwidthおよびapple.halfheightとして保存します。エミュレータは私が知っているどんなデバイスよりも低速です。実際のデバイスでゲームをテストするようにしてください。 –

+0

マイケル、あなたの答えのおかげで、私はhttps://play.google.com/store/apps/details?id=happyworx.nl.Applezと書くことができました。ありがとうございました! –

1

マイケルが言ったことに同意します。また、ゲーム開発者にとっては遅すぎるので、エミュレータでテストしないで、代わりにデバイスをつかんでください。

は、ベクトルを計算する:あなたはこのようなベクトルの概念を使用することができ

if (basketcenterX < apple.getX() + apple.getWidth() && basketcenterX > apple.getX()) 
    if (basketcenterY < apple.getY() + apple.getHeight() && basketcenterY > apple.getY()) 

+0

チップをありがとう!しましょう! –

0

これは速いが、代わりにこれを行うのであれば、私は知りません(マイケルの答えを考慮して) 2点間の距離

distanceVectorX = GameObjectBasket.positionX - GameObjectApple.positionX; 
distanceVectorY = GameObjectBasket.positionY - GameObjectApple.positionY; 

そして

点間の距離であり、このベクトルの大きさを計算します
distance = Math.sqrt(Math.pow(distanceVectorX, 2) + Math.pow(distanceVectorY, 2)) 

これで、この操作が高速かどうかを確認することができます。

+0

これらの数学関数は非常に複雑です。たとえば、Math.pow関数ではなく、単純な乗算x * xを使用する必要があります。この場合でも、私が理解している境界ボックスは衝突を検出するために使用され、距離/長さの値は境界円で作業するときにはより好ましい – cplusogl