我想检查点击Rectangle
。这种方法可以完成这项工作,它几乎可以满足我的需求:
private bool CheckRectangleTouch(Rectangle target)
{
var touchCollection = TouchPanel.GetState();
if (touchCollection.Count > 0)
{
foreach (var touch in touchCollection)
{
if (target.Contains(touch.Position))
{
return true;
}
}
}
return false;
}
我遇到的问题是,在我点击矩形后,它一直返回true
,直到我释放它(它可以注册10-30次一次点击)我希望它只返回一次true
- 第一次触摸。
我试过这个(替换foreach
中的代码):
var isFirstTouch = !touch.TryGetPreviousLocation(out _);
if (target.Contains(touch.Position) && isFirstTouch)
{
return true;
}
这个(糟糕的一个,我不想在发布后注册):
if (target.Contains(touch.Position) && touch.State == TouchLocationState.Released)
{
return true;
}
但没有什么是它。逻辑不一致或根本不起作用。
那么如何检查水龙头?
更新:这有效,但它非常hacky,有延迟,并给我随机幻像水龙头:
try
{
var tap = TouchPanel.ReadGesture(); // falls each time when no input
return tap.GestureType == GestureType.Tap && target.Contains(tap.Position);
}
catch { }
return false;
这就是我最终做的事情:我有单身来保持我的游戏状态(根据需要更新许多不同的道具)。我加入了它:
public TouchCollection TouchCollection { get; set; }
支持保持TouchPanel.GetState结果。我每帧填写一次游戏更新方法,因为@craftworkgames建议:
State.TouchCollection = TouchPanel.GetState();
我还把这个道具添加到我的游戏状态:
public bool TouchActive { get; set; }
这是检查矩形水龙头的方法。它仅对第一个联系人返回true:
private bool CheckRectangleTap(Rectangle target)
{
if (State.TouchCollection.Count == 0)
{ // if no input
return State.TouchActive = false;
}
var targetTouched = false;
foreach (var touch in State.TouchCollection)
{
if (target.Contains(touch.Position))
{
targetTouched = true;
}
}
if (targetTouched && !State.TouchActive)
{ // if target is touched and it's first contact
return State.TouchActive = true;
}
return false;
}
它似乎不太理想,但它适用于我的情况。