我即将编写自己的碰撞检测代码。这就是它的工作原理:
现在问题是我的对象的移动速度有时会在以下代码中发生变化:
private void OnObjectMove(StaticObject MovingObject)
{
if(maskCollision(MovingObject))
{
Console.WriteLine("===============================");
Console.WriteLine("movementX: " + MovingObject.movement_Y.Speed + " movementY " + MovingObject.movement_Y.Speed);
resolveMaskCollision(MovingObject);
}
}
和我的解决方案碰撞方法的开始:
private void resolveMaskCollision(StaticObject collidingObject)
{
Console.WriteLine("movementX: "+collidingObject.movement_X.Speed + " movementY: " + collidingObject.movement_Y.Speed);
.
.
.
所以示例输出是:
movementX: -8,700003 movementY -8,700003
movementX: 0 movementY: -8,700003
你可以看到我的运动因某种原因而改变了......
输出大多数时候都是相同的,但有时它不是,然后我的所有方法都会引发exeptions因为我不希望速度在那里改变。现在我对对象速度变化的唯一解释是事件在一个单独的线程上运行。 这是真的?我怎么能等待这个活动?如果可能的话,等待它是否聪明?或者它会减慢我的代码? (我可以以某种方式调用我的movingObject中的方法。但是它必须保存世界/ collisionmanager -object)
答案 0 :(得分:2)
如this answer所示,事件是同步的,除非你构建它们。
作为gamedev对我有用的,对你有用的是“脏位”的实现,它告诉对象是否已经改变(位置等),以避免不必要的调用计算上昂贵的方法。这允许您在移动每个对象时串行移动对象,测试碰撞。如果遇到性能问题,您还可以在3d系统中找到Quadtrees(或octrees)特别有用。
答案 1 :(得分:1)
@Adam Sears是对的,有你的答案,见:
MovingObject.movement_Y.Speed
VS。
collidingObject.movement_X.Speed
你将Y与X进行比较。
这两个方法在同一个线程中运行。
答案 2 :(得分:1)
对于事件是否在C#中异步运行的问题,类似的答案适用于如此多的问题:这取决于您(或者您编写要使用其事件的类的人)。在C#中实现事件的默认方式是在导致事件所代表的“事件”的同一线程中触发事件。但是,您可以以不同方式实现此部分并实现异步事件。
同步实现如下所示:
protected virtual void OnFoo(EventArgs e)
{
if (Foo != null) Foo(this, e);
}
异步实现如下所示:
protected virtual void OnFooAsync(EventArgs e)
{
if (Foo != null) Foo.BeginInvoke(this, e);
}
答案 3 :(得分:0)
这种情况是完全同步的事件。请输入被称为速度的代码。
有可能在获取速度“MovingObject.movement_Y.Speed”时,由于某些异步调用,某些依赖字段会发生变化。