- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有点困惑:假设我正在制作一款简单的 2D 类塞尔达传说游戏。当两个对象发生碰撞时,每个对象都应该有一个结果 Action 。然而,当主角与某物发生碰撞时,他的 react 完全取决于他所碰撞的物体的类型。如果是怪物,他应该反弹回来,如果是墙,什么都不应该发生,如果是带有丝带的神奇蓝色盒子,他应该治疗等等(这些只是例子)。
我还应该注意,这两者都是碰撞的一部分,也就是说,碰撞事件应该同时发生在角色和怪物身上,而不只是其中之一。
你会如何编写这样的代码?我可以想到许多令人难以置信的不优雅的方法,例如,在全局 WorldObject 类中使用虚函数来识别属性——例如,一个 GetObjectType() 函数(返回 ints、char*s,任何将对象标识为 Monster 的东西、Box 或 Wall),然后在具有更多属性的类中,比如 Monster,可能会有更多虚函数,比如 GetSpecies()。
但是,维护起来很烦人,并导致碰撞处理程序中出现大量级联开关(或 If)语句
MainCharacter::Handler(Object& obj)
{
switch(obj.GetType())
{
case MONSTER:
switch((*(Monster*)&obj)->GetSpecies())
{
case EVILSCARYDOG:
...
...
}
...
}
}
还有使用文件的选项,这些文件将包含以下内容:
Object=Monster
Species=EvilScaryDog
Subspecies=Boss
然后代码可以检索属性,而不需要虚函数把一切搞得一团糟。但是,这并不能解决级联 If 问题。
然后可以选择为每种情况设置一个函数,比如 CollideWall()、CollideMonster()、CollideHealingThingy()。这是我个人最不喜欢的(尽管它们都不讨人喜欢),因为它看起来维护起来最麻烦。
有人可以就这个问题的更优雅的解决方案提供一些见解吗?感谢您提供的所有帮助!
最佳答案
反之亦然——因为如果角色与物体发生碰撞,那么物体也会与角色发生碰撞。因此你可以有一个基类对象,像这样:
class Object {
virtual void collideWithCharacter(MainCharacter&) = 0;
};
class Monster : public Object {
virtual void collideWithCharacter(MainCharacter&) { /* Monster collision handler */ }
};
// etc. for each object
通常在 OOP 设计中,虚函数是这种情况下唯一“正确”的解决方案:
switch (obj.getType()) {
case A: /* ... */ break;
case B: /* ... */ break;
}
编辑:
在你澄清之后,你需要稍微调整一下上面的内容。 MainCharacter
应该为它可能与之碰撞的每个对象提供重载方法:
class MainCharacter {
void collideWith(Monster&) { /* ... */ }
void collideWith(EvilScaryDog&) { /* ... */ }
void collideWith(Boss&) { /* ... */ }
/* etc. for each object */
};
class Object {
virtual void collideWithCharacter(MainCharacter&) = 0;
};
class Monster : public Object {
virtual void collideWithCharacter(MainCharacter& c)
{
c.collideWith(*this); // Tell the main character it collided with us
/* ... */
}
};
/* So on for each object */
通过这种方式,您可以将碰撞通知给主角,它可以采取适当的行动。此外,如果您需要一个不应该通知主角有关碰撞的对象,您可以只删除该特定类中的通知调用。
这种方法称为 double dispatch .
我还会考虑将 MainCharacter 本身设为 Object
,将重载移动到 Object
并使用 collideWith
而不是 collideWithCharacter
.
关于c++ - 如何编写优雅的碰撞处理机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3644065/
谁能推荐一个好的成员(member)结构? 例如,用户支付了 1 个月的成员(member)费,从 2012 年 2 月 1 日到 2012 年 3 月 1 日结束。 何时何地检查用户是否仍是成员(m
我想在我的 JTextPane 中实现查找机制(如文本编辑器或 word)。我希望它有下一个/上一个选项(向上/向下箭头)并突出显示它找到的所有单词。有没有简单的方法可以做到这一点? 最佳答案 我不是
Android 上是否有任何机制和/或编程实践来执行一次性安装/更新脚本?这似乎是一个非常基本的问题,但谷歌搜索没有帮助。 假设我的应用程序使用了一个数据库,并且需要一个常量值表(例如国家名称、城市名
是否可以将 SimpleMembership 与 ASP.NET WebForms 一起使用? John Galloway 的文章似乎表明 WebForms“在 ASP.NET 成员资格之上实现 OA
我是一名优秀的程序员,十分优秀!