编程一个简单的游戏,

问题描述:

嗨im编程一个简单的游戏,使用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的说,如果最远的左侧或右侧被破坏的人走得更远需要跨越:/

谢谢:)

+3

你是否有意使用按位OR('|')而不是逻辑OR('||')(同样适用于AND)?我不认为你是。另外...'矢量'是你的朋友:) – 2012-03-02 23:42:19

+0

你的意思是使用二进制'|'和'&'运算符或逻辑'||'和'&&'? – sholsapp 2012-03-02 23:42:48

+0

你的代码有几个问题:你为什么不使用for循环遍历一个'Alien'列表?你为什么使用'.dead'属性而不是从这样的列表中删除它们? – kaoD 2012-03-02 23:45:34

我从你的问题假设你正在构建某种太空侵略者类型的游戏。这里将接近这一点,可能比你现在有更好的(以伪代码形式)的一种方法:

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

谢谢你的帮助:) – 2012-03-03 08:17:11

顺便说一句,你应该使用逻辑运算符的习惯得到(&&||),而不是按位运算符。由于短路,他们应该更高效,并防止后来的错误。

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

* furthestRightAlien ...不要忘记* – Bingo 2012-03-03 00:31:36

+0

@Bingo谢谢,我想这是在同一行中声明多个变量的问题。 – 2012-03-03 01:27:28

+0

谢谢你的帮助:) – 2012-03-03 08:17:40

你应该真的在使用不同的数据结构。 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语句内部转动外星人而不是使用周转变量?

+0

谢谢你的帮助:) – 2012-03-03 08:17:29