我知道,为了杀死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使用率的最大消耗。您可以通过一些简单的启发式方法来加快速度。

您可以小心地使用newdelete自己管理外来入侵者和项目符号的集合,以防止入侵者和项目符号因内存泄漏而杀死程序。您不必这样做。 C++为您提供了一些漂亮的工具来管理这些集合。使用C++标准库集合之一,而不要滚动自己的集合。例如,std::vector<AlienInvader> invaders;std::list<AlienInvader> invaders,而项目符号也一样。您会从中间删除很多内容,这表明std::liststd::deque可能比std::vector更合适。

关于c++ - 杀死入侵者在C++中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12971574/

10-11 05:18