C# 二维碰撞分辨系统

C# 二维碰撞分辨系统,c#,console,2d,collision,C#,Console,2d,Collision,我正在用C#制作一个简单的2D游戏,作为一个学习项目。然而,我似乎无法想出一个像样的碰撞系统设计 冲突的解决对我来说是最大的问题 基本上可以有以下两组效果的任意组合: 1.移除触发对象或磁贴 2.移除远程对象或磁贴 或者什么也不会发生——物体只是停止移动(即,当两者都是无懈可击的或其他东西时) 任何关于这种效果的想法都将不胜感激。如何检测碰撞和如何响应碰撞是两个完全不同的问题,您应该将它们分开 最简单的方法是在基本游戏对象中有一个虚拟方法来响应碰撞: class GameObject {

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

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

基本上可以有以下两组效果的任意组合:
1.移除触发对象或磁贴
2.移除远程对象或磁贴
或者什么也不会发生——物体只是停止移动(即,当两者都是无懈可击的或其他东西时)


任何关于这种效果的想法都将不胜感激。

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

最简单的方法是在基本游戏对象中有一个虚拟方法来响应碰撞:

class GameObject
{
    virtual protected void OnCollision(GameObject withObject) { }
}
在碰撞检测系统中,每当两个对象发生碰撞时,只需在两个对象上引发碰撞事件:
object1.OnCollision(object2)
object2.OnCollision(object1)


您很快就会意识到,这在某个时候可能会变得一团糟,并且希望了解多分派以及如何在不支持它的语言上模拟它。

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

最简单的方法是在基本游戏对象中有一个虚拟方法来响应碰撞:

class GameObject
{
    virtual protected void OnCollision(GameObject withObject) { }
}
在碰撞检测系统中,每当两个对象发生碰撞时,只需在两个对象上引发碰撞事件:
object1.OnCollision(object2)
object2.OnCollision(object1)


您很快就会意识到这可能会在某个时候变得一团糟,并且希望了解多分派以及如何在不支持多分派的语言上模拟多分派。

到目前为止,您得到了什么?如果你没有我们可以帮助你解决的具体问题,那么有很多关于2d碰撞系统的教程。你读了什么?几年前,我曾多次使用库蒂尼奥的巨著《多体系统的动力学模拟》,这本书的后续部分致力于碰撞基本原理……我的第一个,可能是最天真的想法是,为我的对象指定一些属性,这些属性用于确定发生碰撞时要做什么。例如:killObject、killTile、RespondaObject、respondAsTile、无懈可击。也许我也应该提到这是一个控制台游戏。我想这些标签足以说明这一事实。到目前为止你得到了什么?如果你没有我们可以帮助你解决的具体问题,那么有很多关于2d碰撞系统的教程。你读了什么?几年前,我曾多次使用库蒂尼奥的巨著《多体系统的动力学模拟》,这本书的后续部分致力于碰撞基本原理……我的第一个,可能是最天真的想法是,为我的对象指定一些属性,这些属性用于确定发生碰撞时要做什么。例如:killObject、killTile、RespondaObject、respondAsTile、无懈可击。也许我也应该提到这是一个控制台游戏。我认为这些标签足以说明这一事实。我很清楚检测和解析之间的区别。80*25网格上的检测非常简单,无需太多优化。然而,对于分辨率,我不是指在处理交叉点的正常意义上。我还没有尝试过相互通话的想法。我所做的是一个“gameObject CollizeSwith()”方法,它为ResolveCollization方法提供了两个交互方。它决定是否允许移动。我的问题甚至不在于允许做什么,而在于如何做。在我看来,有更好的方法来处理它,而不是大量的IF。那么,寻找多个分派。这可能就是你要找的。在C#中,您可以使用委托和映射来模拟它。我很清楚检测和解析之间的区别。80*25网格上的检测非常简单,无需太多优化。然而,对于分辨率,我不是指在处理交叉点的正常意义上。我还没有尝试过相互通话的想法。我所做的是一个“gameObject CollizeSwith()”方法,它为ResolveCollization方法提供了两个交互方。它决定是否允许移动。我的问题甚至不在于允许做什么,而在于如何做。在我看来,有更好的方法来处理它,而不是大量的IF。那么,寻找多个分派。这可能就是你要找的。在C#中,您可以使用委托和映射来模拟它。