【发布时间】: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