我有一个使用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这样的东西很好。
由于
答案 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。
至少我现在正在接受拖动手势。