我正在尝试实现按下和释放按钮的功能,并且得到了无法解决的无法正常工作的结果。

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语句。

09-26 23:59