【发布时间】:2012-04-27 19:28:54
【问题描述】:
考虑我有一个对称关系矩阵,类似于:
除了每个“结果”都是一小段代码。
我的场景:我有一堆 Entity 相互“碰撞”的对象。每个实体都有一个CollisionType 值(一个枚举)。在设计中,存在一个关系矩阵,描述了当不同的 CollisionType 相互相遇时实体的行为。
我想知道:我将如何以一种易于添加新 CollisionTypes 的简洁和高性能方式表示关系,并在其之上实现逻辑?在我看来,它看起来像是一个 2D Switch 语句。
示例(不良)解决方案:
void CollideEntities( Entity e1, Entity e2 ) {
CollisionType t1 = e1.GetCollisionType();
CollisionType t2 = e2.GetCollisionType();
// perform basic logic based on t1 & t2
if ( (t1 == COL_SOLID && t2 == COL_SQUISHY) || (t1 == COL_SQUISHY && t2 == COL_SOLID) ) {
// do stuff..
} else if ( (t1 == COL_SOLID && t2 == COL_DAMAGE) || (t1 == COL_DAMAGE && t2 == COL_SOLID) ) {
// do other stuff..
} // and so on...
}
许多潜在的解决方案对我来说是显而易见的,但没有一个让我觉得特别干净、高效或易于添加新类型...
【问题讨论】:
-
只要您不告诉我们您打算如何处理这些数据,任何建议都可能是徒劳的。例如。您可以将其表示为图形或 2D 布尔矩阵,但这取决于您打算通过此实现的目标。
-
我打算比较数据并根据关系执行一些代码。数据是对象的枚举(根据示例),关系的表示正是我想要的建议。 (即现在我将其表示为一系列 if 语句。)扩展问题以澄清。
标签: c++ logic relationship