Как проверить наличие крана в моногаме? - PullRequest
0 голосов
/ 09 марта 2019

Я хочу проверить, что 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;
            }

Но ничего не делает.Либо логика не согласована, либо не работает вообще.

Итак, как я могу проверить на наличие крана?

Обновление: это работает, но это очень странно, имеет задержку и дает мне случайные фантомные нажатия:

    try
    {
        var tap = TouchPanel.ReadGesture(); // falls each time when no input
        return tap.GestureType == GestureType.Tap && target.Contains(tap.Position);
    }
    catch { }

    return false;

1 Ответ

1 голос
/ 11 марта 2019

Вот что я в итоге сделал: У меня есть синглтон для хранения моего игрового состояния (много разных реквизитов обновляется по мере необходимости). Я добавил к этому:

public TouchCollection TouchCollection { get; set; }

Опора для удержания результата TouchPanel.GetState. Я заполняю его в методе обновления игр один раз за кадр, как предложила @craftworkgames:

State.TouchCollection = TouchPanel.GetState();

Также я добавил эту опору в состояние моей игры:

public bool TouchActive { get; set; }

И это метод проверки прямоугольника. Он возвращает истину только для первого контакта в кране:

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

Это не кажется идеальным, но оно работает для моего случая.

...