c++ - Qt 中的 2D 游戏 : Initializing monsters and passing dynamically allocated array as a pointer parameter

标签 c++ arrays qt 2d

<分区>

我正在使用 Qt Framework 创建一个 2D 游戏。虽然我确实有一些其他语言的经验,但 C++ 对我来说是一种新语言。

我的第一个问题是关于怪物的。我应该如何初始化(并存储它们)?我游戏的每个级别都有不同数量的怪物。此时我以这种方式初始化它们:

    Monster *mobs;
    mobs = new Monster[mobsQuantity];

但我不确定这是最好的方法。此外,每一秒, map 上的每个生物都必须移动 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]);

但是我的程序崩溃了。

感谢所有愿意帮助我的人。

最佳答案

@Austin 是正确的,使用 vector 或列表比使用普通数组要好得多,但如果您使用 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();
}

现在,如果您创建一个基类,我们称它为派生自 QGraphicsObject 的 GameObject,然后您可以让所有可移动对象以相同的体系结构运行。

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();
    }
}

关于c++ - Qt 中的 2D 游戏 : Initializing monsters and passing dynamically allocated array as a pointer parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17824537/

相关文章:

c++ - 为什么不能将范围解析与成员指针取消引用一起使用?

c++ - 如何从缓冲区读取特定字符串

c - "array of pointers"中指针的初始值是多少?

c++ - 在 QCustomPlot 中,如何实时为相同数据绘制折线图和条形图?

c++ - Qt资源文件利用

c++ - 在每分钟开始时运行一个函数?

C++:方法重复;需要 DRY 优化

c++ - Windows Phone 7 中 native 代码 C++ 和 openGL 的兼容性

python - 如何使用另一个数组的所有元素声明一个数组?

Qt QAudioOutput 推送模式