【问题标题】:Moving mouse in direction and rate在方向和速率上移动鼠标
【发布时间】:2015-04-07 06:58:53
【问题描述】:

我正在尝试创建一个由操纵杆的右拇指杆控制的简单鼠标模拟器。我试图让鼠标沿着摇杆指向的方向移动,压力值的平滑梯度指示速度,但在尝试这样做时遇到了一些障碍。

首先是如何准确地将角度转换为准确的 X 和 Y 值。我找不到正确实现角度的方法。以我的方式,对角线的移动速度可能比红衣主教快得多。 我在想我需要像 Math.Cos(angle) 的 X 值和 Math.Sin(angle) 的 Y 值来增加鼠标,但我想不出一种方法来设置它。

第二个,是鼠标的平滑移动,这可能是两者中更重要的一个。由于 SetPosition() 函数仅适用于整数,因此像素随时间移动的速率似乎非常有限。我的代码非常基础,只记录 1-10 的整数值。这不仅会在加速中产生小的“跳跃”,而且还会限制对角线运动。 目标是每秒 10 个像素,程序以 100hz 运行,每个周期输出 0.1 个像素移动。

我想我可能能够跟踪 X 和 Y 值的像素“小数”,并在它们构建为整数时将它们添加到轴上,但我想有一种更有效的方法来这样做仍然不会激怒 SetPosition() 函数。

我觉得 Vector2 对象应该完成这项工作,但我不知道角度如何适应。

示例代码:

        //Poll Gamepad and Mouse.  Update all variables.
    public void updateData(){

        padOne = GamePad.GetState(PlayerIndex.One, GamePadDeadZone.None);
        mouse = Mouse.GetState();

        currentStickRX = padOne.ThumbSticks.Right.X;
        currentStickRY = padOne.ThumbSticks.Right.Y;
        currentMouseX = mouse.X;
        currentMouseY = mouse.Y;
        angle = Math.Atan2(currentStickRY, currentStickRX);

        vectorX = (int)( currentStickRX*10 );
        vectorY = (int)( -currentStickRY*10 );
        mouseMoveVector.X = vectorX;
        mouseMoveVector.Y = vectorY;


        magnitude = Math.Sqrt(  Math.Pow( (currentStickRX - 0), 2 ) + Math.Pow( (currentStickRY - 0), 2 )  );
        if (magnitude > 1){
            magnitude = 1;
        }

        //Get values not in deadzone range and re-scale them from 0-1
        if(magnitude >= deadZone){
            activeRange = (magnitude - deadZone)/(1 - deadZone);
        }

        Console.WriteLine();  //Test Code
    }

    //Move mouse in in direction at specific rate.
    public void moveMouse(){
        if (magnitude > deadZone){
            Mouse.SetPosition( (currentMouseX + vectorX), (currentMouseY + vectorY));
        }


        previousStickRX = currentStickRX;
        previousStickRY = currentStickRY;
        previousActiveRange = activeRange;
    }

注意:我正在使用所有的 xna 框架。

无论如何,如果我对这些事情的解释有误,我深表歉意。我一直无法找到一个好的资源,而且我搜索的向量示例仅以整数增量从 A 点移动到 B 点。

非常感谢任何有关这方面的帮助。

【问题讨论】:

    标签: c# vector mouse emulation joystick


    【解决方案1】:

    我自己没有尝试过,但从我的角度来看,你应该在阅读它们之后标准化垫轴,这样对角线的移动速度与红雀相同。对于第二部分,我会在浮动变量(例如 Vector2)中跟踪鼠标,并在设置鼠标位置时进行强制转换(可能更好地舍入)。

    public void Start()
    {
       mousePosV2 = Mouse.GetState().Position.ToVector2();
    }
    
    public void Update(float dt)
    {
       Vector2 stickMovement = padOne.ThumbSticks.Right;
       stickMovement.Normalize();
       mousePosV2 += stickMovement*dt*desiredMouseSpeed; 
    
       /// clamp here values of mousePosV2 according to Screen Size
       /// ...
    
       Point roundedPos = new Point(Math.Round(mousePosV2.X), Math.Round(mousePosV2.Y));
       Mouse.SetPosition(roundedPos.X, roundedPos.Y);
    }
    

    【讨论】:

    • 好吧,很酷。代码“mousePosV2 +=stickMovementdtdesiredMouseSpeed;”是我希望得到的一般结构,并且规范化棒向量是一个好主意。非常感谢您的帮助。
    猜你喜欢
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多