我想创建一个简单的鼠标模拟器控制的操纵杆的右拇指。我试图让鼠标沿着棍子指向的方向移动,压力值的平滑梯度决定了速度,但我试图这样做时遇到了一些障碍。移动鼠标的方向和速度
首先是如何准确地将角度转换为准确的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.
任何帮助任何部分,这是非常感谢。
好的,很酷。代码 “mousePosV2 + = stickMovement * dt * desiredMouseSpeed;” 是我希望得到的一般结构,并且规范化向量是一个好主意。 非常感谢您的帮助。 – EternalDahaka