我一直在努力学习XNA,虽然我无法访问书籍,但我一直依靠MSDN和教程来指导我,我现在可以绘制精灵并改变他们的位置并使用Intersect和我现在正试图为Windows Phone 7和8手机购买基本的Accelerometer。
我有一些积木和一个球。我希望能够通过向上/向下/向左/向右倾斜手机来移动球(或滚动它)。
如果您在下面看到,绿点代表球可以移动的区域。虽然深灰色块只是边界,如果球接触它们,它会从它们反弹(稍后,我不关心这部分)。
我的问题是,如何让球对倾斜动作做出正确反应?
为了尝试获得非常基本的倾斜动作,我有:
protected override void Initialize()
{
// TODO: Add your initialization logic here
Accelerometer accelerometer = new Accelerometer();
accelerometer.CurrentValueChanged += accelerometer_CurrentValueChanged;
accelerometer.Start();
base.Initialize();
}
void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
{
this.squarePosition.X = (float)e.SensorReading.Acceleration.Z * GraphicsDevice.Viewport.Width + GraphicsDevice.Viewport.Width / 2.0f;
if (Window.CurrentOrientation == DisplayOrientation.LandscapeLeft)
{
this.squarePosition.X = +(float)e.SensorReading.Acceleration.X * GraphicsDevice.Viewport.Width + GraphicsDevice.Viewport.Width / 2;
}
else
{
this.squarePosition.X = (float)e.SensorReading.Acceleration.X * GraphicsDevice.Viewport.Width + GraphicsDevice.Viewport.Width / 2;
}
}
但这绝对令人震惊。它非常紧张,就像物体不断跳跃一样癫痫或其他东西,我甚至不确定这是正确的方法。
答案 0 :(得分:4)
你遇到的主要问题是直接将加速度与位置联系起来,而不是使用加速度来影响速度和影响球位置的速度。你已经做到了这样,球的位置你倾斜多少,而不是加速根据你的倾斜程度。
目前,只要加速度计读数发生变化,球的位置就会设定为读数。您需要将球的加速度分配给读数,并通过该加速度周期性地增加速度,并定期以该速度增加球的位置。
XNA可能有内置的方法来做到这一点,但我不知道XNA所以我可以告诉你如何在没有框架/库的帮助的情况下做到这一点:
// (XNA probably has a built-in way to handle acceleration.)
// (Doing it manually like this might be informative, but I doubt it's the best way.)
Vector2 ballPosition; // (when the game starts, set this to where the ball should be)
Vector2 ballVelocity;
Vector2 ballAcceleration;
...
void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e) {
var reading = e.SensorReading.Acceleration;
// (below may need to be -reading.Z, or even another axis)
ballAcceleration = new Vector2(reading.Z, 0);
}
// (Call this at a consistent rate. I'm sure XNA has a way to do so.)
void AdvanceGameState(TimeSpan period) {
var t = period.TotalSeconds;
ballPosition += ballVelocity * t + ballAcceleration * (t*t/2);
ballVelocity += ballAcceleration * t;
this.squarePosition = ballPosition;
}
如果您不知道t * t / 2来自何处,那么您可能想要阅读基础物理知识。这将有助于理解如何让球按照你想要的方式移动。物理学的相关部分称为kinematics(videos)。
答案 1 :(得分:1)
您需要对输入进行某种平滑处理才能消除这种抖动。
这里有一个Micrsoft博客,其中包含一些相关信息:
请特别注意标题为了解数据平滑
的部分