C# 利用单打和双指手势实现缩放

C# 利用单打和双指手势实现缩放,c#,android,monogame,C#,Android,Monogame,我想使用两个手指滑入/滑出的手势来实现缩放功能,这在《愤怒的小鸟》等游戏中很常见。现在我使用滑块缩放,感觉不如简单的手势好。所以我试着看一下MonoGame中的手势实现,但还没有弄清楚到底是什么可以帮助我实现所描述的beahviour 任何帮助都将不胜感激,谢谢 简短回答:您需要使用触摸面板手势功能来检测捏手势,然后处理生成的手势 更长的答案 当用户松开一个或两个手指时,您将获得多个GestureType.Pinch手势事件,然后是GestureType.PinchComplete。每个Pin

我想使用两个手指滑入/滑出的手势来实现缩放功能,这在《愤怒的小鸟》等游戏中很常见。现在我使用滑块缩放,感觉不如简单的手势好。所以我试着看一下MonoGame中的手势实现,但还没有弄清楚到底是什么可以帮助我实现所描述的beahviour


任何帮助都将不胜感激,谢谢

简短回答:您需要使用
触摸面板
手势功能来检测
手势,然后处理生成的手势


更长的答案

当用户松开一个或两个手指时,您将获得多个
GestureType.Pinch
手势事件,然后是
GestureType.PinchComplete
。每个
Pinch
事件将有两对向量-每个接触点的当前位置和位置变化。要计算挤压的实际变化,您需要反向计算每个接触点的先前位置,获得先前状态和当前状态下接触点之间的距离,然后减去以获得总变化。将其与原始挤压接触点的距离(第一次挤压事件中接触点的原始位置)进行比较,以获得总距离差

首先,确保初始化
触摸面板.EnabledGestures
属性以包括
GestureType.Pinch
和可选的
GestureType.PinchComplete
,具体取决于您是否要捕获用户的收缩手势的结束

接下来,使用类似的方法(从
游戏
类的
更新
方法调用)来处理事件

bool _pinching = false;
float _pinchInitialDistance;

private void HandleTouchInput() 
{
    while (TouchPanel.IsGestureAvailable)
    {
        GestureSample gesture = TouchPanel.GetGesture();

        if (gesture.GestureType == GestureType.Pinch)
        {
            // current positions
            Vector2 a = gesture.Position;
            Vector2 b = gesture.Position2;
            float dist = Vector2.Distance(a, b);

            // prior positions
            Vector2 aOld = gesture.Position - gesture.Delta;
            Vector2 bOld = gesture.Position2 - gesture.Delta2;
            float distOld = Vector2.Distance(aOld, bOld);

            if (!_pinching)
            {
                // start of pinch, record original distance
                _pinching = true;
                _pinchInitialDistance = distOld;
            }

            // work out zoom amount based on pinch distance...
            float scale = (distOld - dist) * 0.05f;
            ZoomBy(scale);
        }
        else if (gesture.GestureType == GestureType.PinchComplete)
        {
            // end of pinch
            _pinching = false;
        }
    }
}
有趣的部分是计算缩放量。有两个基本选项:

  • 如上所示,使用比例因子根据当前
    Pinch
    事件表示的原始距离变化来改变缩放。这是相当简单的,可能会做你需要它做的事情。在这种情况下,您可能可以删除
    \u pinching
    \u pinchinitialstance
    字段和相关代码

  • 跟踪原始接触点之间的距离,并根据当前距离设置缩放,以初始距离的百分比表示(
    float zoom=dist/\u pinchinitialstance;ZoomTo(zoom);

  • 您选择哪一个取决于当前如何处理缩放


    在这两种情况下,您可能还希望记录触摸点之间的中心点,以用作缩放的中心,而不是将缩放点固定到屏幕的中心。或者,如果你想让变得真正的愚蠢,记录原始接触点(
    aOld
    bOld
    ,从第一次
    Pinch
    事件开始),并执行平移、旋转和缩放操作,使这两个点跟随当前的接触点。

    谢谢!真是太棒了!你救了我一天!:)很高兴我能帮忙。我从来没有实际使用过Monogame库,所以希望代码对您有用。