2012-02-10 8 views
1

ユーザーのクリックが私が定義した再編成の範囲内にあるかどうかをチェックしたいが、このチェックを行うには別の方法で行うべきだろうか?wp7 XNAタッチイベントが定義された矩形内にあるかどうかを確認する方法

これは私が今持っているものですが、ユーザーは、いくつかの中に画面をタッチすることができるように私は

private bool CheckEnemyClicked(Vector2 vector2, out Enemy enemyOut) 
{ 
    TouchCollection touches = TouchPanel.GetState(); 

    foreach (Enemy enemy in enemies) 
    { 
     //Find the rectangle of the sprite 
     Rectangle rectangle = new Rectangle(
            (int)enemy.Position.X, 
            (int)enemy.Position.Y, 
            enemy.Width, 
            enemy.Height); 

     //Check if click is hitting enemy 
     if(touchinput is within rectangle) 
     { 
      enemyOut = enemy; 
      return true; 
     } 
    } 
    enemyOut = null; 
    return false; 
} 

答えて

4

TouchCollectionは、「Position」メンバを持つTouchLocationオブジェクトのコレクションを返します。 Rectangleには、特定のポイントが含まれているかどうかを確認できるオーバーロードのContainsメソッドがあります。だから、XNAフレームワークはあなたのためにすべてのハードワークを行います。

あなたのコードは、Touchの衝突チェック部分では、このようになります。

//Check if click is hitting enemy 
foreach (TouchLocation location in collection) 
{ 
    if (rectangle.Contains((int)location.Position.X, (int)location.Position.Y)) 
    { 
      enemyOut = enemy; 
      return true; 
    } 
} 
2

TouchCollectionオブジェクトどのようにタッチで四角形のオブジェクトを比較するために、疑問に思いますがタッチポイント(の集まりです場所)。 TouchCollection内の個々のタッチポイントを確認して、敵の長方形に対する相対位置を確認する必要があります。

+0

したがって、forループを作成し、すべての点をチェックしますか?それはスプライトごとに10000(100x100ピクセル)の操作になります。スクリーンに10-20スプライトがあり、毎秒30回スプライン表示しても問題ありませんか? – Mech0z

+0

何らかのシーン管理が必要です。 Quadtreeが私の頭に浮かびます。アニメーションオブジェクトでは難しいかもしれません。しかし、あなたはまた、表示されているすべてのオブジェクトをチェックする必要があります。スクリーン上にないオブジェクトには触れません。今度は、すべてのユーザータッチを反復し、Quadtreeセルの可視オブジェクトに対してテストを行い、テストを最小限に抑えました。もちろん、この特定のタッチがスプライトの四角形内にあることを確認した場合は、ピクセル単位でのみテストします。 – dowhilefor

関連する問題