c++ - 2D 游戏:在Qt中初始化怪物并将动态分配的array 作为指针参数

  显示原文与译文双语对照的内容
0 0

我正在使用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;
 }
 }
}

有什么更好的方法来做这个?

我的2nd 问题是把怪物类传递给函数。 怪物是从QGraphicsItem衍生出来的。 我在主窗口中有一个函数,它为每个暴徒设定正确的位置,然后将它添加到 QGraphicsScene 。 我的代码如下所示:

void MainWindow::createMobs(){
for(int a = 0; a <mobsQuantity; a++){
 mobs[a].setPos(/* X pos */,/* Y pos */);
 scene->addItem(mobs[a]);
}

}

错误来自将项目添加到场景中。 如何正确地将dinamically分配的array的元素作为指针传递?

 error: no matching function for call to 'QGraphicsScene::addItem(Monster&)'

我尝试这样添加它:

 scene->addItem(&mobs[a]);

但是我的程序崩溃了。

感谢所有尝试帮助我的人。

时间:原作者:2个回答

0 0

@Austin 使用矢量或者列表比使用纯 array 更好,尽管我使用的是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();
}

现在,如果你创建一个基类,让我们称之为with游戏对象,你可以以使用相同的体系结构。

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();
 }
}
原作者:
0 0

看来使用 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);
 }
 }

对于 2nd 问题,很难诊断所有代码,但如果代码在传递指针( 哪个&数组 [a] ) 之后,指针不会初始化或者初始化。 也许 array 被分配在函数被调用之后已经被分配的函数中,因为编译器清除该函数。

原作者:
...