2012-01-11 43 views
0

我想创建一个简单的刚体2D物理引擎。如何刷新我的网格?以及如何计算时间量?

我能够创建一个矩形图像通过使用四条线,并能够根据其角度和位置操纵图像;我可以移动并旋转它(尽管我可以旋转,因为我无法理解角动量理论,所以我不使用旋转函数)。

的图像将下降,根据简单的公式反弹:

v(velocity) += a(acceleration) 
x += v(velocity) 

但我要我要执行一个动作,每次点击一个按钮。

我希望它自动执行自动并自动更新,我试图使用循环,但由于某种原因,程序似乎在循环部分停止。而且因为我使用了一个会重复开始的无限循环,所以我的程序就冻结了。

不仅这是问题,而且我的好朋友,他在物理学方面有更好的知识,告诉我如果我想使这个引擎正常工作,我应该能够计算出时间量。

+0

你有没有想过使用线程和或定时器和设置间隔..? – MethodMan 2012-01-11 17:45:53

+0

XNA不是一个选项吗? XNA不仅提供了自动刷新场景的方法,而且还专门为游戏设计,听起来非常像你想要完成的事情(请注意,我并不是说你在制作游戏)。 – PedroC88 2012-01-11 17:55:08

+0

你可以发布你已经试图实现这个,而线程和XNA是非常好的解决方案,它可能只是一个简单的错误,阻止你的循环完成 – Johnv2020 2012-01-11 17:58:00

回答

1

我喜欢DJ KRAZE的评论 - 使用System.Windows.Threading.DispatcherTimer,并将间隔设置为经常需要重绘的图片。在计时器的Tick事件上,请重新绘制。

如果你想知道为什么简单循环不起作用,你必须知道一点关于Windows message loop。对于一个简短的,有些不准确的概述,应用程序中运行的所有东西,听起来像是在一个线程上发生。 Windows使用消息WM_PAINT,它通过消息循环,使控制画本身。它一次只处理消息。

如果你有你的无限循环,这是发生在一些消息的处理。因此,这可以防止消息循环处理任何消息,包括用于绘制控件的消息。所以你在无限循环中看不到任何更新。

+0

这是关于WPF,所以我宁愿建议一个'System.Windows .Threading。DispatcherTimer',一个'System.Threading.Timer'或一个'System.Timers.Timer'来代替。 – Nuffin 2012-01-11 18:09:43

+0

哎呀,我认为我在那里看到了一个窗体标签,但很明显我会失明。 – dsolimano 2012-01-11 18:29:27

+0

这可能是因为我缺乏深刻的知识,我并不坚持解释,因为我知道我不太可能理解计时器和DispatcherTimer之间的区别,但我很惊讶地发现有很多不同类型的计时器并很困惑 – Bug 2012-01-11 18:52:18

0

也许你可以看看XNA,它是一个有助于游戏开发的微软平台,你应该去App Hub了解如何开始。

至于你在刷新屏幕上的具体问题,你可以看看UpdateDraw方法。 Here是一个教程,尽管可能无法解决您的具体问题,但应该告诉您如何刷新屏幕。