编程一个简单的游戏,
嗨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的说,如果最远的左侧或右侧被破坏的人走得更远需要跨越:/
谢谢:)
我从你的问题假设你正在构建某种太空侵略者类型的游戏。这里将接近这一点,可能比你现在有更好的(以伪代码形式)的一种方法:
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
,这些敌人都是从这些敌人中继承而来的。这很可能会使您的设计更加健壮和可扩展。
另外,正如其他人已经指出的那样,当您要运行AND
或OR
操作时,使用逻辑运算符而不是按位运算。 (也就是说,使用||
而不是|
等)。两者之间有一个重要的区别。
谢谢你的帮助:) – 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():
}
* furthestRightAlien ...不要忘记* – Bingo 2012-03-03 00:31:36
@Bingo谢谢,我想这是在同一行中声明多个变量的问题。 – 2012-03-03 01:27:28
谢谢你的帮助:) – 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语句内部转动外星人而不是使用周转变量?
谢谢你的帮助:) – 2012-03-03 08:17:29
你是否有意使用按位OR('|')而不是逻辑OR('||')(同样适用于AND)?我不认为你是。另外...'矢量'是你的朋友:) –
2012-03-02 23:42:19
你的意思是使用二进制'|'和'&'运算符或逻辑'||'和'&&'? – sholsapp 2012-03-02 23:42:48
你的代码有几个问题:你为什么不使用for循环遍历一个'Alien'列表?你为什么使用'.dead'属性而不是从这样的列表中删除它们? – kaoD 2012-03-02 23:45:34