我知道为了用 C++ 杀死入侵者,我需要制作一个碰撞器。 然而,在那场比赛中,没有什么能杀死入侵者。 这是 header 中的代码:
bool DoCollision(float Xbpos, float Ybpos, int BulWidth, int BulHeight, float Xipos, float Yipos, int InvWidth, int InvHeight);
这是我正在初始化的函数:
bool Game::DoCollision(float Xbpos, float Ybpos, int BulWidth, int BulHeight, float Xipos, float Yipos, int InvWidth, int InvHeight) {
if (Xbpos+BulWidth < Xipos || Xbpos > Xipos+InvWidth) return false;
if (Ybpos+BulHeight < Yipos || Ybpos > Yipos+InvHeight) return false;
return true;
}
如果有人按下空格键,会发生这种情况:
if (code == 57) { //Space
myKeyInvader.MeBullet.Active = true;
myKeyInvader.MeBullet.Xpos = myKeyInvader.Xpos + 10;
myKeyInvader.MeBullet.Ypos = myKeyInvader.Ypos - 10;
myKeyInvader.MeBullet.yvuel = 0.2;
myKeyInvader.MeBullet.BulletP->CopyTo(m_Screen,myKeyInvader.Xpos,myKeyInvader.Ypos);
if (DoCollision(Invaders[counter].MyBullet.Xbpos,Invaders[counter].MyBullet.Ybpos,Invaders[counter].MyBullet.BulWidth,
Invaders[counter].MyBullet.BulHeight,Invaders[counter].Xipos,Invaders[counter].Yipos,Invaders[counter].InvWidth,Invaders[counter].InvHeight)) {
//myKeyInvader.Ypos = 100;
Invaders[counter].Active = false;
printf("Collide!\n");
}
}
有人知道怎么回事吗?
最佳答案
问题不在于 C++。问题是你如何使用它。如果入侵者就在您的上方,那么您将被编写的代码杀死的唯一方法。但为时已晚。外星入侵者已经杀了你。
您需要做的是将这些子弹变成随时间传播的对象,就像您的入侵者是随时间传播的对象一样。对用户按下空格键的响应应该是将一个新的项目符号实例添加到事件项目符号集中。这些事件子弹中的每一个都有一个随时间变化的位置。在每个时间步,您应该按照规定入侵者如何移动的规则推进事件入侵者的状态,并按照规定子弹如何移动的规则推进事件子弹的状态。当子弹到达屏幕顶部时将其移除,如果外星入侵者到达屏幕底部,则游戏结束。
传播、移除屏幕外的子弹并检查游戏是否结束后,您想要检查 N 颗子弹中的每一颗与 M 个入侵者中的每一个之间的碰撞。当检测到碰撞时,从事件子弹集中移除子弹并从事件入侵者集中删除外来入侵者。当然,您会需要一些漂亮的图形来向用户展示另一个外星人咬了灰尘。
旁白:作为一个 NxM 问题,此检查可能是对 CPU 使用率的最大消耗。您可以通过一些简单的启发式方法来加快速度。
您可以自己管理外星入侵者和子弹的收藏,小心使用 new
和 delete
以免您的入侵者和子弹因内存泄漏而杀死您的程序。你不必这样做。 C++ 为您提供了一些漂亮的工具来管理这些集合。使用 C++ 标准库集合之一,而不是滚动您自己的集合。例如,std::vector<AlienInvader> invaders;
或 std::list<AlienInvader> invaders
,子弹也一样。你会从中间删除很多,这表明 std::list
或 std::deque
可能比 std::vector
更合适在这里。
关于c++ - 杀死入侵者在 C++ 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12971574/