3

我一直在玩这个 Flash 游戏,在我克服了最初的(“哈哈,开火”)反应后,我开始想知道如何在编程中复制这种接触变异行为。我想这有点像蜜罐 xkcd

我正在考虑从粒子相互偏转和包含壁的场景开始。该序列将从一定数量的“突变体”粒子开始,当这些突变体与常规粒子碰撞时,它们本身就会变成突变体。我以后可以做一些更有趣的事情。

我的问题是如何开始。我计划使用 .NET 的绘图元素在 C# 中执行此操作(尽管我对 C# 相当陌生 - 如果 .NET 有不同的部分,我应该使用让我知道)但是如果有任何关于它的一般论文我有兴趣阅读它们(当然,如果它们可以在线获得)。

谢谢,罗斯

4

2 回答 2

4

我认为你的想法是正确的,一个盒子里的一些粒子在这里会很好。我无法想象你会找到关于这样一个具体而简单的案例的论文,但也许是一些所需的技术,但与渲染器相比,后端的实现应该相对简单。

移动粒子的一个简单方法是欧拉迭代,您可以在其中存储位置和速度。位置=位置+速度*dt;其中 dt 是自上一帧以来的时间变化。如果可以的话,最好保持 dt 固定,并在渲染器的点之间进行插值......这将减少稳定性问题并使碰撞检测更容易。

要将粒子反射出墙壁,请检查其位置的 x 分量或 y 分量是否会超出边界,然后翻转速度的其他分量的符号,例如

if(Math.Abs(position.x_component + velocity.x_component * dt) > x_bound) 
    velocity.y_component = -velocity.y_component;

if(Math.Abs(position.y_component + velocity.y_component * dt) > y_bound)
    velocity.x_component = -velocity.x_component;

如果你有恒定的 dt,这很有效,但如果它变化,你将需要做一些更复杂的事情。找到与盒子的碰撞点,并将向量在盒子外面的部分反射到被碰撞的面上。

为了使粒子相互碰撞,最好进行距离检查,一旦距离太小就会触发反射。即,如果它们靠得太近,它们就会发生碰撞。像粒子是球体一样反射速度分量,因此反射的法线是它们的位置差。

您可能会发现这篇关于 gamedev 的文章也很有用...

希望这可以帮助。

于 2009-02-01T15:47:35.487 回答
1

为什么不以经典的 Asteroids 游戏为起点呢?这是一个不使用 DirectX 并且在 c# 中的链接

http://www.codeproject.com/KB/GDI-plus/asteroids.aspx

于 2009-02-01T15:56:24.893 回答