TouchLocation объект не работает должным образом

Я пытаюсь реализовать функцию нажатия и отпускания кнопки и получаю нерабочий результат, который я не могу понять, почему.

public class Button
{
    public TouchLocation oldTouch, currentTouch;

    public virtual void Update(GameTime gameTime)
    {
        TouchCollection touchCollection = TouchPanel.GetState ();

        if (touchCollection.Count > 0) {
            currentTouch = touchCollection [0];

            if (currentTouch.Position.X > position.X && currentTouch.Position.X < position.X + width &&
               currentTouch.Position.Y > position.Y && currentTouch.Position.Y < position.Y + height) {

                if (currentTouch.State == TouchLocationState.Released && oldTouch.State == TouchLocationState.Pressed) {
                    buttonEvent.Invoke (this, new EventArgs ());
                }
            }
        }

        oldTouch = currentTouch;

    }
}

Прежде всего, когда я назначаю объект ниже:

currentTouch = touchCollection [0];

я получил

"Неверное количество типов или аргументов"

красным цветом в качестве значения в окне отладки locals (без ошибок, только красное текстовое значение).
Тем не менее, он по-прежнему корректно проходит через оператор проверки позиции, но не проходит Pressed/Release Если заявление. Если я заменю currentTouch с touchCollection[0] тогда все работает как положено.
Я использую / присваиваю TouchLocation объект неправильно?
Или я просто упускаю из виду легкую ошибку?

1 ответ

Я всегда использую что-то вроде touchCollection.Last() или же touchCollection.First() чтобы получить только один компонент TouchCollection, Во всяком случае, я не вижу никакой ошибки в том, что вы там делаете.

Для вашей проблемы, я думаю, вы не можете сделать только

oldTouch.State == TouchLocationState.Pressed

но вы должны проверить:

oldTouch.State == TouchLocationState.Pressed || oldTouch.State == TouchLocationState.Moved

потому что вы не знаете, как последнее касание было обнаружено XNA.

И как предложение, почему бы вам не использовать Rectangles для коллайдера вашей кнопки? Таким образом, вы можете просто позвонить:

Rectangle.Contains(new Point(int)currentTouch.Position.X, (int)currentTouch.Position.Y))

вместо этого if заявление.

Другие вопросы по тегам