编程一个简单的游戏,

Programming a simple Game,

本文关键字:简单 游戏 一个 编程      更新时间:2023-10-16

嘿,我用directX和C++编程了一个简单的游戏,我遇到了一个小问题,我相信一些天才可以解决。

我现在有一个由8个外星人组成的数组,我现在使用这个代码将它们从左向右移动一行。

bool turnaround=false;
if ((Aliens[0].pos.x<-5 & Aliens[0].vel.x<0)|(Aliens[3].pos.x>5&Aliens[3].vel.x>0))
{
    turnaround=true;
    if(Aliens[0].vel.x<0)
        Aliens[0].animCtrl->SetTrackSpeed(0,1);
    else
        Aliens[0].animCtrl->SetTrackSpeed(0,-1);
}

然而,如果左边或右边的已经被破坏(它们被变量Aliens[i].dead = true 破坏

我想知道是否有人能想出if语句或嵌套if语句。如果需要说明最左边或右边的语句是否被破坏,请进一步查看:/

感谢:)

根据您的问题,我推测您正在构建某种太空入侵者类型的游戏。以下是一种可能比您目前拥有的(伪代码形式)更好的方法:

For each alien:
  If alien is currently on an odd row:
    Set direction to left
    If alien x position is near 0:
       Set direction to down
  Else
    Set direction to right
    If alien x position is near screen width:
       Set direction to down

这应该会导致外星人一排排地向下移动到屏幕底部。(当然,在这种类型的游戏中,外星人可以采取许多不同的形态,这只是其中之一)。你不清楚当他们被杀时,你希望他们表现出什么样的行为("走得更远"是模棱两可的,这是玩家还是一些外星人,还是什么?)然而,如果你详细说明,我可以在这里提供进一步的建议。

我还建议你重新考虑一下你的设计。你有一个固定大小的阵列,里面有8个外星人。虽然这可能允许你构建一个特定的级别,但它可能会被证明是非常严格的。如果在另一个层次上你想要12个外星人呢?我建议你把你的Aliens数组变成std::vector,这样你就可以随心所欲地把它们添加到一个级别。更好的是,如果你有不同类型的敌人,他们都共享相同的属性,你可以创建一个超类CEnemy,这些敌人都从中继承。这可能会使您的设计更加坚固和可扩展。

此外,正如其他人已经指出的那样,当您想要运行ANDOR操作时,请使用逻辑运算符,而不是按位操作。(也就是说,使用||而不是|等)两者之间有一个重要的区别。

顺便说一句,您应该养成使用逻辑运算符(&&||)而不是按位运算符的习惯。它们应该更有效率,因为短路和防止以后出现错误。

我不确定是否有足够的信息来回答你的真实问题。为什么要手动访问第0个和第3个外星人?理想情况下,你希望外星人的行为如何?

编辑1:

像这样的东西应该起作用:

Alien * furthestLeftAlien, * furthestRightAlien;
/** here loop through your Aliens array to find
    the furthest left and furthest right aliens **/
if(furthestLeftAlien->dead || furthestRightAlien->dead)
{
    goFurtherAcross():
}

您应该完全使用不同的数据结构。C++标准库有几个不同的容器类可以帮助您。

例如,std::deque允许您轻松地从两端移除项目。

你可以移除死去的外星人,比如:

while (!Aliens.empty() && Aliens.front().is_dead()) Aliens.pop_front();
while (!Aliens.empty() && Aliens.back().is_dead()) Aliens.pop_back();

然后你上面的代码会变成:

bool turnaround=false;
if ((Aliens.front().pos.x<-5 && Aliens.front().vel.x<0) || (Aliens.back().pos.x>5 && Aliens.back().vel.x>0))
{
    turnaround=true;
    if(Aliens.front().vel.x<0)
        Aliens.front().animCtrl->SetTrackSpeed(0,1);
    else
        Aliens.front().animCtrl->SetTrackSpeed(0,-1);
}

尽管说实话,我不确定这里的代码是如何扭转整排外星人的。与其使用周转变量,为什么不在if语句中让外星人周转呢?