我做了一个子弹地狱游戏。一切都按预期工作。由于我从未参加任何游戏设计课程等,我对代码感到担忧(质量明智和设计明智)。
我所做的是将所有对象存储在GLOBAL VECTORS中(我知道它很糟糕)。比如
EnemiesArray
bulletsArray //敌人子弹
playerBullets //玩家子弹
对于碰撞,我有一个Manager来检查更新中的冲突
for (auto playerBullet : playerBullets)
{
for(auto enemy : EnemyArray)
{
if(enemy->checkCollision(playerBullet->bulletSprite->getPosition()) )
{
//collided
}
}
}
因此,当子弹与敌人发生碰撞时,很多事情都会受到影响。例如后台对象移动,Player获取xp和Hud更改等。
Manager包含对bg hud及其所需内容的引用。
问题1:
如何摆脱全局载体。 (它允许我从代码中的任何地方创建子弹/敌人。)
问题2: 是否应该有经理来检查子弹碰撞?或者对象本身应该检查它?如果是这样的话,我如何将敌人的参考物提供给子弹。
问题3: 管理员正在管理像我提到的太多对象。 (对不起,我在这里听起来很蠢)。我听说一位经理应该管理一种工作。
答案 0 :(得分:1)
我在过去几个月里成功创建了自己的游戏。其中一个主要功能是让玩家射击敌人。你的问题看起来和我的问题非常相似,所以我会告诉你我在项目中是如何处理它们的。
问题1:我的游戏包含几个级别。每个级别都是一个单独的对象,拥有自己的敌人/奖金等容器。唯一可以将生物添加到关卡的地方是关卡的构造函数。但是,在某些情况下动态添加它们不是问题。关键是在完成特定级别后,我删除了分配给它的所有对象。唯一能够得到关于球员及其得分的信息。
问题2:每个动态事件都应该有自己的碰撞检测器。对象本身应不能够自行检查。我宁愿建议创建另一个类,如探测器,并定义一些方法来处理检查玩家和敌人/玩家和子弹/子弹和敌人等之间的碰撞(一种方法用于一个目的)。您可以将level的容器传递给Detector,以便它能够遍历它们并运行您为特定碰撞定义的算法。
问题3:经理应该是游戏设计的每个部分的界面,例如 BulletManager , EnemiesManager - 这就是我的方式处理它。
我希望您能以任何方式找到我的解决方案。