Qt中的2D游戏:初始化怪物并将动态分配的数组作为指针参数传递[关闭]
Posted
技术标签:
【中文标题】Qt中的2D游戏:初始化怪物并将动态分配的数组作为指针参数传递[关闭]【英文标题】:2D game in Qt: Initializing monsters and passing dynamically allocated array as a pointer parameter [closed] 【发布时间】:2013-07-24 03:08:33 【问题描述】:我正在使用 Qt 框架创建 2D 游戏。虽然我确实有一些其他语言的经验,但 C++ 对我来说是一种新语言。
我的第一个问题是关于怪物的。我应该如何初始化(并存储它们)?我游戏的每个级别都有不同数量的小怪。此时我以这种方式初始化它们:
Monster *mobs;
mobs = new Monster[mobsQuantity];
但我不确定这是最好的方法。此外,每一秒,地图上的每个生物都必须移动 1 个位置。这是应该移动小怪的函数。
void MainWindow::moveMobs()
int random[mobsQuantity]; // Different random position move for each monster.
for(int a = 0; a < mobsQuantity; a++)
random[a] = qrand() % 5; // Initialize the moves
for(int a = 0; a < mobsQuantity; a++)
int x = mobs[a].x();
int y = mobs[a].y(); // Take the position for each different mob
switch(random[a])
case NORTH:
// Collision detection and movement
break;
case SOUTH:
// Collision detection and movement
break;
case WEST:
// Collision detection and movement
break;
case EAST:
// Collision detection and movement
break;
有没有更好的方法来做到这一点?
我的第二个问题是将 Monster 类传递给函数。 Monster 是从 QGraphicsItem 派生的。我在主窗口中有一个函数,它为每个暴徒设置正确的位置,然后将其添加到 QGraphicsScene。我的代码如下所示:
void MainWindow::createMobs()
for(int a = 0; a < mobsQuantity; a++)
mobs[a].setPos(/* X pos */ , /* Y pos */);
scene->addItem(mobs[a]);
错误来自将项目添加到场景中。我应该如何正确地将动态分配数组的元素作为指针传递?
error: no matching function for call to 'QGraphicsScene::addItem(Monster&)'
我尝试像这样添加它:
scene->addItem(&mobs[a]);
但是我的程序崩溃了。
感谢所有愿意帮助我的人。
【问题讨论】:
【参考方案1】:@Austin 是正确的,因为如果你使用 Qt,我会使用 QVector 而不是 std::vector,使用向量或列表对你来说比使用普通数组要好得多。两者都有效,但这是我的偏好。
此外,C++ 中的游戏通常使用在更新循环中更新自身的对象架构。所以你会有一个主游戏循环,它只为怪物调用一个更新函数。像这样的骨架代码:-
class Monster : public QGraphicsObject // note QGraphicsObject instead of Item so we have signals and slots too!
void Update()
// move the monster according to rules
// check for colliding objects
;
然后在你的主游戏循环中
QList<QMonster*> pMonsterList = GetMonsters(); // from CLevel shown by @Austin
QMonster* pMonster;
foreach(pMonster, monsterList)
pMonster->Update();
现在,如果您创建一个基类,我们将其称为 GameObject,它是从 QGraphicsObject 派生的,您可以让所有可移动对象以相同的架构运行。
class GameObject : public QGraphicsObject
virtual void Update() = 0; // move object
;
class Monster : public GameObject
void Update();
;
因此,您现在只需使用以下内容更新关卡中的所有对象:-
CLevel::Update()
QList<GameObject*> gameObjectList = GetGameObjects();
GameObject* pGameObj;
foreach(pGameObj, gameObjectList)
pGameObj->Update();
【讨论】:
您好,感谢您的帮助!我会尝试使用你给我的架构。但是我在哪里可以找到 foreach() 函数? std::for_each() 有点不同。 它是 Qt 的一部分,并在 Container classes 的帮助中列出,尽管它可能只是 Qt5。或者,您可以只使用 for 循环来遍历所有对象。 我建议使用智能指针而不是原始指针。我不是 100% 确定,但我猜测什么适用于 std::vecotr 也适用于 QVector:如果你没有充分的理由使用其他东西,总是更喜欢向量而不是其他所有集合。 std::vector 比 std::list 有更好的性能。在大多数情况下,向量非常好。 @Skalli,就 std 而言,您可能是对的,尽管 Qt 有一个对象层次结构,它几乎负责管理指向其对象的指针,因此减少了对智能指针的需求。至于列表与向量,我读过 QList 是 Qt 中的首选容器。如果您有兴趣,此问题的最佳答案解释了有关 Qt 容器的更多信息:***.com/questions/6602036/qvector-vs-qlist 我想你是对的,我还没有深入研究 Qt。这只是一个假设,意味着他决定使用 std::vector 时的提示。尽管如此,有趣的是 QList 是 Qt 中的首选容器。这有什么来源吗? (不是我不相信你,我相信,但我想扩展我的知识和原因。);)【参考方案2】:似乎使用std::vector<Monster*>
或qvector<Monster*>
是最好的选择。示例:
//header example for CLevel
class CLevel:
CLevel();
std::vector<Monster*> *GetMonsters() return &mMonsterVector;
void CreateMonsters(int NumberOfMonsters);
private:
std::vector<Monster*> mMonsterVector;
;
//cpp file
void CLevel::CreateMonsters(int NumberOfMonsters)
//make this a method in the level class
for(int i = 0; i < NumberOfMonsters; i++)
Monster *newMob = new Monster;
//Fill in the monster properties
newMob->FillProperties();
//end monster properties
mMonsterVector.push_back(newMob);
对于第二个问题,如果不查看所有代码就很难诊断,但如果代码在传递指针(&array[a] 是)后崩溃,则该指针不存在或不存在已初始化或已取消初始化。也许数组是在一个函数中分配的,该函数在编译器清理后调用该函数后已被释放。
【讨论】:
以上是关于Qt中的2D游戏:初始化怪物并将动态分配的数组作为指针参数传递[关闭]的主要内容,如果未能解决你的问题,请参考以下文章