5

10個のアイテムを保持するベクトルがあります(簡単にするために、同じクラスはすべて「a」と呼びます)。私がやりたいことは、「A」が a) 壁を隠していないか、b) 別の「A」を隠していないことを確認することです。これを行う衝突関数があります。

アイデアは単純に、このループ クラスを通過させて「A」を次の位置に移動させることです。そのポーションが衝突を引き起こしている場合は、画面上の新しいランダムな位置を自分自身に与える必要があります。画面が小さいため、要素が別の要素の上 (または壁の上など) に配置される可能性が高くなります。コードのロジックは頭の中でうまく機能しますが、コードをデバッグすると、オブジェクトがループに陥り、同じ位置にとどまります。「A」は画面上を動き回るはずなのに、動かない!

Do while ループをコメント アウトし、'MoveObject()' 関数を上に移動すると、コードは完全に機能し、'A' が画面上を移動します。余分な機能を追加しようとしたとき、それが機能しないときです。

    void Board::Loop(void){


        //Display the postion of that Element. 
        for (unsigned int i = 0; i <= 10; ++i){


            do {

                if (checkCollisions(i)==true){
                moveObject(i); 
                }
                else{
                    objects[i]->ResetPostion();

                }

            }
            while (checkCollisions(i) == false);
            objects[i]->SetPosition(objects[i]->getXDir(),objects[i]->getYDir());
        }

}

以下のクラスは衝突検出です。これは後で拡張します。

    bool Board::checkCollisions(int index){

    char boundry = map[objects[index]->getXDir()][objects[index]->getYDir()];

    //There has been no collisions - therefore don't change anything 
    if(boundry == SYMBOL_EMPTY){
        return false;
    }
    else{
        return true;

    }

}

どんな助けでも大歓迎です。私はあなたに仮想ビールを買います:-)

ありがとう

編集:

ResetPostion -> これにより、要素 A に画面上のランダムな位置が与えられます。 moveObject -> オブジェクトの方向を見て、x および Y コードを適切に調整します。

4

3 に答える 3

2

私はあなたが必要だと思います:

do { ...
... } while (checkCollisions(i)); 

また、要素が 10 個ある場合は、i = 0; i < 10; i++

そしてところで。書かないでくださいif (something == true)、単にif (something)またはif (!something)

于 2013-04-15T18:51:14.420 に答える