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.
И как предложение, почему бы вам не использовать Rectangle
s для коллайдера вашей кнопки? Таким образом, вы можете просто позвонить:
Rectangle.Contains(new Point(int)currentTouch.Position.X, (int)currentTouch.Position.Y))
вместо этого if
заявление.