1

我正在尝试实现按下和释放按钮功能,并且得到一个我无法弄清楚原因的非工作结果。

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/ ReleaseIF 语句。如果我替换currentTouch为,touchCollection[0]那么一切都会按预期进行。
我是否TouchLocation错误地使用/分配了对象?
或者我可能只是忽略了一个简单的错误?

4

1 回答 1

2

我总是使用类似touchCollection.Last()or的东西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声明。

于 2013-10-27T19:19:41.400 回答