编程一个简单的游戏,
Programming a simple Game,
嘿,我用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
操作时,请使用逻辑运算符,而不是按位操作。(也就是说,使用||
而不是|
等)两者之间有一个重要的区别。
顺便说一句,您应该养成使用逻辑运算符(&&
和||
)而不是按位运算符的习惯。它们应该更有效率,因为短路和防止以后出现错误。
我不确定是否有足够的信息来回答你的真实问题。为什么要手动访问第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语句中让外星人周转呢?
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- 简单的游戏数据库问题
- X 变量在最后一次尝试简单猜谜游戏时发生变化,C++
- 简单的比赛游戏与 C++ 中的动态数组
- 简单的游戏,同时循环和检查字符串
- 生活的游戏邻居检查(更简单的方法可能吗?)
- 如何简单地管理我的游戏状态?C++
- 循环麻烦.C 简单游戏
- 简单的单词猜测游戏
- 我简单的 c++ 文本游戏不起作用。我正在使用随机数生成,我很困惑
- OpenGL - 简单3D游戏的低FPS
- 简单的战舰游戏建议
- 我需要哪种语言/课程来制作简单的纸牌游戏
- 如何创建一个简单的侧滚动游戏
- 为什么c++游戏与unity3d相比如此简单
- 变量的值在使用C++的简单文本 RPG 游戏中不会更改
- 我的简单游戏的计时器非常关闭...C++
- 组织X11和Win32简单游戏代码的最佳方式是什么
- 如何得到每个子弹的起点?Libgdx简单游戏
- 一个用c++编写的简单游戏循环程序