编写一个简单的游戏,

时间:2012-03-02 23:38:54

标签: c++ directx

嘿我正在编写一个使用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语句或嵌套如果需要说明最左边或者最左边的那些是否会被进一步扫描:/

谢谢:)

3 个答案:

答案 0 :(得分:2)

我从你的问题中推测你正在构建某种类型的太空入侵者类型游戏。这将是一种方法,可能比你现在拥有的更好(以伪代码形式):

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操作时,请使用逻辑运算符,而不是按位。 (即使用||代替|等)两者之间存在重要差异。

答案 1 :(得分:1)

顺便说一下,你应该习惯使用逻辑运算符(&&||)来代替按位运算符。它们应该因为短路而更有效率,并在以后防止漏洞。

我不确定是否有足够的信息来回答你的真实问题。你为什么要手动访问第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():
}

答案 2 :(得分:0)

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

例如,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语句中转换外星人?