使用MonoGame时,我的WP8游戏没有接收拖动手势

时间:2013-07-20 18:23:16

标签: windows-phone-8 monogame

我有一个使用MonoGame框架的WP8项目。我有一些代码应该识别水平和垂直拖动事件并执行一个动作,但我似乎永远不会得到这些事件。我确实得到了一个FreeDrag手势,但Deltas总是NaN。

我在游戏的Initialize方法中初始化TouchPanel.EnabledGestures,如下所示:

  protected override void Initialize()
  {
     // TODO: Add your initialization logic here
     base.Initialize();

     TouchPanel.EnabledGestures = GestureType.HorizontalDrag | GestureType.FreeDrag;
  }

我有一个检查手势类型的方法如下:

  private void CheckUserGesture()
  {
     while (TouchPanel.IsGestureAvailable)
     {
        var gesture = TouchPanel.ReadGesture();

        switch(gesture.GestureType)
        {
           case GestureType.DragComplete:
              System.Diagnostics.Debug.WriteLine("Drag Complete");
              break;

           case GestureType.FreeDrag:
              System.Diagnostics.Debug.WriteLine("Drag Complete");
              break;

           case GestureType.HorizontalDrag:
              if (gesture.Delta.X < 0)
                 gameVm.MoveLeft(Math.Abs((int)gesture.Delta.X));
              if (gesture.Delta.X > 0)
                 gameVm.MoveRight((int)gesture.Delta.X);

              break;

           case GestureType.VerticalDrag:
              if (gesture.Delta.Y > 0)
                 gameVm.MoveDown(Math.Abs((int)gesture.Delta.Y));
              break;

           case GestureType.Tap:
              System.Diagnostics.Debug.WriteLine("Rotating Shape Due To Tap Command");
              gameVm.RotateClockwise();
              break;
        }
     }
  }

这在Update方法中调用:

  protected override void Update(GameTime gameTime)
  {
     base.Update(gameTime);

     // TODO: Add your update logic here
     //CheckTouchGesture();
     CheckUserGesture();
     gameVm.UpdateGame((int)gameTime.ElapsedGameTime.TotalMilliseconds);
  }

我也尝试过使用TouchState:

  private void CheckTouchGesture()
  {
     var touchCol = TouchPanel.GetState();

     foreach (var touch in touchCol)
     {
        // You're looking for when they finish a drag, so only check
        // released touches.
        if (touch.State != TouchLocationState.Released)
           continue;

        TouchLocation prevLoc;

        // Sometimes TryGetPreviousLocation can fail. Bail out early if this happened
        // or if the last state didn't move
        if (!touch.TryGetPreviousLocation(out prevLoc) || prevLoc.State != TouchLocationState.Moved)
           continue;

        // get your delta
        var delta = touch.Position - prevLoc.Position;

        // Usually you don't want to do something if the user drags 1 pixel.
        if (delta.LengthSquared() < DragTolerence)
           continue;

        if (delta.X < 0)
           gameVm.MoveLeft(Math.Abs((int)delta.X));
        else if (delta.X > 0)
           gameVm.MoveRight((int)delta.X);
        else if (delta.Y > 0)
           gameVm.MoveDown((int)delta.Y);
     }
  }

但是,增量总是NaN。

我是否遗漏了一些我可能需要初始化的内容? 我已尝试过EnabledGestures类型的各种组合,但仍然无法使拖动事件起作用。轻弹也不起作用。

Tap这样的东西很好。

由于

1 个答案:

答案 0 :(得分:0)

我认为目前发布的MonoGame(版本3.0.1,发布日期:2013年3月3日)已经打破了这一点。

从GitHub开发者分支构建最新版本: https://github.com/mono/MonoGame.git

(注意:我也从这里建立了SharpDX:https://github.com/sharpdx/SharpDX

似乎解决了很多我的问题

我并不是100%确信它完全正常工作 使用上面代码中显示的touch.TryGetPreviousLocation()始终返回与当前位置相同的位置,因此执行var delta = loc.Position - preLoc.Postion始终为0。

至少我现在正在接受拖动手势。