【问题标题】:2D collision resolution system2D 碰撞解决系统
【发布时间】:2012-01-13 11:30:39
【问题描述】:

我正在使用 C# 在控制台中制作一个简单的 2D 游戏作为学习项目。但是我似乎无法为碰撞系统想出一个像样的设计。

冲突的解决对我来说是最大的问题。

基本上可以任意组合以下2组效果:
1.触发对象或图块被移除;
2.远程对象或图块被移除;
或者什么都不会发生 - 物体只是停止移动(即当两者都无懈可击时)。

任何关于该效果的想法将不胜感激。

【问题讨论】:

  • 到目前为止你得到了什么?如果您没有我们可以帮助您解决的特定问题,那么有很多关于 2d 碰撞系统的教程。
  • 你读了什么?几年前,我使用了 Coutinho 的巨著《多体系统的动态模拟》,而这本书的后续部分致力于碰撞基础知识……
  • 我的第一个,可能是最天真的想法是为我的对象分配一些属性,这些属性用于确定在发生碰撞时该怎么做。例如:killObject、killTile、respondAsObject、respondAsTile、invulnerable。也许我还应该提到它是一款主机游戏。我认为这些标签足以指向这一事实。

标签: c# console 2d collision


【解决方案1】:

如何检测碰撞以及如何响应它是两个完全不同的问题,您应该将它们分开。

最简单的方法是在基础游戏对象中使用虚拟方法来响应碰撞:

class GameObject
{
    virtual protected void OnCollision(GameObject withObject) { }
}

在您的碰撞检测系统中,每当两个对象发生碰撞时,只需在两个对象上引发碰撞事件:object1.OnCollision(object2); 和 object2.OnCollision(object1)。

您很快就会意识到这在某些时候可能会变得一团糟,并且会想要了解多重调度以及如何在不支持它的语言上模拟它。

【讨论】:

  • 我很清楚检测和分辨率之间的区别。在 80*25 网格上的检测非常简单,不需要太多优化。然而,分辨率并不是指正常意义上的处理交叉点。我还没有尝试过互惠电话的想法。我所做的是一个“gameObject collidesWith()”方法,它为 resolveCollision 方法提供了 2 个交互方。它决定是否允许移动。我的麻烦甚至不是在允许的情况下做什么,而是如何去做。在我看来,有一些比大量 IF 更好的方法来处理它。
  • 然后寻找多重分派。这可能就是您正在寻找的。在 C# 中,您可以使用委托和映射来模拟它。
猜你喜欢
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 2011-10-15
  • 2014-11-28
相关资源
最近更新 更多