如何检查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;
    }

它看起来不太理想,但它适合我的情况。