如何在单人游戏中检查水龙头?

时间:2019-03-09 19:30:50

标签: android 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;
}

我遇到的问题是,在点击矩形后,它会一直返回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;

1 个答案:

答案 0 :(得分:1)

这就是我最终要做的事情: 我有单身人士来保持自己的游戏状态(根据需要更新了许多不同的道具)。我加了:

public TouchCollection TouchCollection { get; set; }

支持保留TouchPanel.GetState结果。我按照@craftworkgames的建议每帧将其填充到Games Update方法中一次。

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;
    }

这似乎并不理想,但适用于我的情况。