1

に設定されたポインターがあり0、後で同じ関数内で、いくつかのループ/条件内でそれを再割り当てしようとしています..(コメントを読んでください)

for(Entity* tile : _originalFloorTiles)
        {
            for(Turns turn : pointsUpLeftDownRight)
            {
                if(tile->GetCollisionRect().ContainsPoint(turn.first.x, turn.first.y)){
                    turn.second = tile; //everything looks fine here, turn.second is still null and tile is a valid pointer
                    assert(turn.second); //turn.second is definitely assigned the value of tile here.
                }
               HAPI->DebugText("check pointsUpLeftDownRight now");//!Here's where it gets weird,
            // If i hover over turn and inspect it in visual studio now, turn.second is still completely valid 
            // (with the assigned value of tile).
            // But hovering over pointsUpLeftDownRight shows its contents for each turn..
            // and inside there the current turn is a NULL pointer for turn.second!
            }
        }

したがって、ある瞬間にポインタを問題なく割り当て、次の瞬間にはポインタがまったく変更されていないように見えます。

明確にするために、これTurnsは怠惰なtypedefですstd::pair<Vect, Entity*>。それが私のコードを読みにくくする場合は、お詫びします。敵のaiがすぐに一緒になります。以下に完全な機能を投稿します。

私はここで本当に困惑していて、私がばかであるのか、何か奇妙なことが起こっているのかわからないので、時間をかけて見てくれる人を本当に感謝します。

//ゴーストが取ることができるターンを探します。

void IceGhostNPC::RespondToTimePassed()
{   
    //Entity* t = _originalFloorTiles[0];

    //test if enough time has passed since ghost last decided to look for turns
    if(_lastTimeTurned < timeGetTime() - _timeBeforeSearchingForTurns)
    {
        //store points surrounding ghost in a way that we can associate them with a valid floor tile to move onto 
        std::vector<Turns> pointsUpLeftDownRight;
        pointsUpLeftDownRight.push_back(
            Turns(Vect(GetCenterXPos(), GetCenterYPos() - floorTileHeight), 0)); //point above
        pointsUpLeftDownRight.push_back(
            Turns(Vect(GetCenterXPos() - floorTileWidth, GetCenterYPos()), 0)); //point left
        pointsUpLeftDownRight.push_back(
            Turns(Vect(GetCenterXPos(), GetCenterYPos() + floorTileHeight), 0)); //point down
        pointsUpLeftDownRight.push_back(
            Turns(Vect(GetCenterXPos() + floorTileWidth, GetCenterYPos()), 0)); //point right

        //look through original floor tiles, 
        for(Entity* tile : _originalFloorTiles)
        {
            //see if its possible to take a turn 
            for(Turns turn : pointsUpLeftDownRight)
            {
                if(tile->GetCollisionRect().ContainsPoint(turn.first.x, turn.first.y)){
                    turn.second = tile;
                    assert(turn.second);
                }
                HAPI->DebugText("check pointsUpLeftDownRight now");
            }
        }

        //Now to make the behaviour more interesting we have the ghost randomly take one of the turns,
        // ( we use associated tile to check the turn is possible, and we can also change that tile to an icy patch )
        bool turnTaken = false;
        do{
            int turnChoice = rand() % 4;
            if(pointsUpLeftDownRight[turnChoice].second == 0)
                continue; //go back to top of loop if that turn had a null tile
            else
            {
                switch(turnChoice){
                    case 0: //turn upwards
                        _moveable->SetYDirection(Controller::UP);
                        _moveable->SetXDirection(Controller::NONE);
                        break;
                    case 1: //turn leftwards
                        _moveable->SetYDirection(Controller::NONE);
                        _moveable->SetXDirection(Controller::LEFT);
                        break;
                    case 2: //turn downwards
                        _moveable->SetYDirection(Controller::DOWN);
                        _moveable->SetXDirection(Controller::NONE);
                        break;
                    case 3: //turn right
                        _moveable->SetYDirection(Controller::NONE);
                        _moveable->SetXDirection(Controller::RIGHT);
                        break;
                }
                turnTaken = true;
                _lastTimeTurned = timeGetTime();
                //ice tile up baby
            }

        }while(turnTaken = false);
    }

    FinishResponding(timeGetTime());
}
4

1 に答える 1

8

この行を確認してください:

for(Turns turn : pointsUpLeftDownRight)

の要素のコピーを繰り返し処理していpointsUpLeftDownRightます。そのコピーに割り当てた値は、コピーが破棄されると(for本文の最後で)失われます。割り当てが一時的に変更されます。

代わりにこれを試してください:

for(Turns& turn : pointsUpLeftDownRight)
于 2012-12-19T18:28:57.920 に答える