我正在尝试实现按下和释放按钮的功能,并且得到了无法解决的无法正常工作的结果。
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];
我懂了
“类型或参数的数量不正确”
以红色作为本地调试窗口中的值(没有错误,只是红色文本值)。
但是,它仍然正确通过了位置检查IF语句,但没有通过
Pressed
/ Release
IF语句。如果我将currentTouch
替换为touchCollection[0]
,那么一切都会按预期进行。我使用/分配的
TouchLocation
对象不正确吗?还是我可能只是忽略了一个简单的错误?
最佳答案
我总是使用touchCollection.Last()
或touchCollection.First()
之类的东西来仅获得TouchCollection
的一个组件。无论如何,我在这里所做的工作都看不到任何错误。
对于你的问题,我认为你不能只做
oldTouch.State == TouchLocationState.Pressed
但您必须检查:
oldTouch.State == TouchLocationState.Pressed || oldTouch.State == TouchLocationState.Moved
因为您不知道XNA如何检测到最后一次触摸。
并建议您为什么不将
Rectangle
用作按钮的对撞机?这样,您可以简单地调用:Rectangle.Contains(new Point(int)currentTouch.Position.X, (int)currentTouch.Position.Y))
而不是执行
if
语句。