2015-04-07 118 views
0

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

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

第二,鼠标是平滑的运动,这可能是两者中最重要的。由于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.

任何帮助任何部分,这是非常感谢。

回答

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); 
} 
+0

好的,很酷。代码 “mousePosV2 + = stickMovement * dt * desiredMouseSpeed;” 是我希望得到的一般结构,并且规范化向量是一个好主意。 非常感谢您的帮助。 – EternalDahaka