2012-02-13 11 views
2

私はC++/C#の経験豊富なプログラマーで、アンドロイドのゲームデザインの世界に取り組んでいます。 EclipseでのJavaの使用Android Java - 複数のタッチオブジェクト/イベントを追跡していますか?

画面全体のタッチを追跡して1つのオブジェクトを移動する方法については、数多くのチュートリアルがありますが、多くの個々のオブジェクトのタッチイベントを画面上でランダムにトラッキングするにはどうすればよいですか?

私は、複数回インスタンス化され、arraylistで保持されるクラスを書きたいと思っていました。それぞれは、フルスクリーンのSurfaceView上でランダムな位置に描画されます。これまでの簡単なもの... 私の人生のために、私はこれらのオブジェクトのどれかをどれくらいドラッグするかを見つけることができません!!

カスタムビュー(SurfaceViewを拡張)を使用するアクティビティがあります。ゲームボードの画面描画を処理するGameBoardクラスをインスタンス化します。 GameBoardクラスでは、スクリーン上に描画するが、タッチコントロールが必要なgameCharactersのArrayListも保持/描画されます。

私の知恵の終わりには、そこに助けがありますか?

答えて

0

私はオブジェクトをドラッグしないで衝突検出のためにその場所を使用するトップダウンシューティングゲーム(Akari)を書いた。

私のSurfaceViewでは、theThread.touchEventType(x、y)を呼び出します。スレッドはオブジェクト(あなたの場合は配列)を通り、一致するかどうかを調べます。一致した場合、オブジェクトに関連付けられた値が返され、そのオブジェクトに対してMotionEvent.ACTION_UPが実行される前のすべてのMotionEvent.ACTION_MOVEMENTアクションが実行されます。

これが役に立ちます。サンプルコードが必要な場合はお知らせください。

+0

Hrmm、すべての「タッチ可能な」オブジェクトを繰り返して衝突(または何らかのイベント)をチェックするのは非効率的だと思われますが、それはアンドロイドの世界で行われる方法のようです。 – Overunity

+0

これを見て回った後、これを行う方法です。正確な精度が必要ない場合は、AndroidのRectクラスを検出に使用することを強くお勧めします。 – YumeApps

0

私は全く同じ問題を抱えていました。 私のソリューションは少し異なりました。私はバックマモンゲームを書こうとしています。私は30のオブジェクトを画面に配置し、それらを移動します。もちろんそれらの一部は重なっています。だから私の問題は、オブジェクトに触れ、別のものを動かしてしまったことです(私が触ったものがタッチされた後、画面の上に置かれたオブジェクトであると判断したからです)。

とにかく、私は、ビューを拡張してGestureOverlayViewに配置するカスタムオブジェクトを作成しました。私はonTouchEventを(上書き)と、それは次のようになります。私はfalseを返したときに私が読んだものから、

public boolean onTouchEvent(MotionEvent event) { 
    int x = (int) event.getRawX(); 
    int y = (int) event.getRawY(); 

    int action = event.getAction(); 
    switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      if (Math.abs(x - this.getX()) < BackgroundView.slotSize && Math.abs(y - this.getY()) < BackgroundView.slotSize) { 
       //do whatever I want 
       return true; 
      } else { 
       return false; 
      } 
      //break; 
     case MotionEvent.ACTION_MOVE: 
      //this is the dragging part 
      this.setX(x - size/2); 
      this.setY(y - size/2); 
      break; 
     case MotionEvent.ACTION_ 
      break; 
     case MotionEvent.ACTION_CANCEL: 
      break; 
     case MotionEvent.ACTION_OUTSIDE: 
      break; 
     default: 
    } 
    return true; 
} 

は、アクションが消費されないので、他の目的は、それを行うことができます。だから基本的に、誰も真を返すことによってそれを消費するまで、それを消費しません。

私はまだ自分自身を初心者と考えており、これを行うにはより良い方法があると思いますが、それは私のためにはうまくいきます。それが役に立てば幸い。あなたまたは他の誰か。 私は新しい提案のために開いています。

関連する問題