2012-02-10 18 views
1

我想检查用户点击是否在我定义的一组retangles中,但是我应该使用另一种方法来执行此检查吗?如何检查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返回具有“位置”成员的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 2012-02-10 12:54:26

+0

您需要某种场景管理。 Quadtree出现在我的脑海中,对于动画对象来说这很困难。但是你也只需要检查所有可见的物体,屏幕上没有的东西不能被触摸。现在,您只需遍历所有用户触摸,对Quadtree单元格中的可见对象进行测试,并将测试降至最低。当然,如果你确定这个特定的触摸是在精灵矩形内,你只测试每个像素。 – dowhilefor 2012-02-10 13:06:32

相关问题