如何检查monogame中的tap?
How to check for tap in monogame?
我想检查 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;
}
我遇到的问题是,在我点击矩形之后,它会保持 returning true
直到我释放它(它可以注册 10-30 次一次点击)并且我希望它return 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;
}
但是什么也做不了。逻辑不一致或根本不起作用。
那么我该如何检查水龙头?
更新:这行得通,但它很老套,有延迟,给我随机的幻觉点击:
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 建议的那样,我每帧在 Games Update 方法中填写一次:
State.TouchCollection = TouchPanel.GetState();
我还把这个道具添加到我的游戏状态中:
public bool TouchActive { get; set; }
这是检查矩形水龙头的方法。它 returns 仅适用于 tap 中的第一个联系人:
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;
}
它看起来不太理想,但它适合我的情况。
我想检查 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;
}
我遇到的问题是,在我点击矩形之后,它会保持 returning true
直到我释放它(它可以注册 10-30 次一次点击)并且我希望它return 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;
}
但是什么也做不了。逻辑不一致或根本不起作用。
那么我该如何检查水龙头?
更新:这行得通,但它很老套,有延迟,给我随机的幻觉点击:
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 建议的那样,我每帧在 Games Update 方法中填写一次:
State.TouchCollection = TouchPanel.GetState();
我还把这个道具添加到我的游戏状态中:
public bool TouchActive { get; set; }
这是检查矩形水龙头的方法。它 returns 仅适用于 tap 中的第一个联系人:
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;
}
它看起来不太理想,但它适合我的情况。