1

Qt Framework を使用して 2D ゲームを作成しています。私は他のいくつかの言語の経験がありますが、C++ は私にとって一種の新しい言語です。

最初の質問はモンスターについてです。どのように初期化(および保存)すればよいですか? ゲームのレベルごとにモブの数が異なります。現時点では、次のように初期化します。

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

しかし、これが最善の方法であるかどうかはわかりません。また、マップ上に配置されたすべての Mob は、毎秒 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;
        }
    }
}

これを行うより良い方法はありますか?

私の 2 番目の問題は、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]);

しかし、私のプログラムはクラッシュします。

私を助けようとするすべての人に感謝します。

4

2 に答える 2

1

@Austinは、Qtを使用している場合はstd::vectorではなくQVectorを使用しますが、ベクトルまたはリストを使用する方がプレーンな配列よりもはるかに優れているという点で正しいです。どちらも機能しますが、それが私の好みです。

また、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();
    }
}
于 2013-07-24T08:13:23.673 に答える