0

マップ上で他のプレイヤーの動きをチェックし、それに応じて位置を調整する機能があり、プレイヤーがちょうど入ったかどうかもチェックします。

void mapManager::checkForOtherPlayerMovement(int plyId)
{
    sf::Packet receivedPacket;
    std::vector<player>::iterator it;
    player pl(0,0,1);

    if(socket->Receive(receivedPacket) == sf::Socket::Done)
    {
        int header;
        receivedPacket >> header;

        switch(header)
        {
            case PACKET_PLAYER_DISPATCHNEWPOSITION:
            {
                receivedPacket >> pl;

                std::cout << pl.plyId << std::endl;

                if(plyId != pl.plyId)
                {
                    try
                    {
                        if(pl.plyId != 0)
                        {
                            std::cout << "DEBUG1" << std::endl;
                            players->at(pl.plyId-1).posX = pl.posX;
                            players->at(pl.plyId-1).posY = pl.posY;
                        }
                        else
                        {
                            std::cout << "DEBUG2" << std::endl;
                            players->at(pl.plyId).posX = pl.posX;
                            players->at(pl.plyId).posY = pl.posY;
                        }


                    }
                    catch(const std::out_of_range& oor)
                    {
                        std::cout << "Added new player!" << std::endl;
                        players->push_back(pl); // This crashes

                    }
                }


                break;

            }
            case PACKET_PLAYER_DISPATCHENTEREDMAP:
            {
                break;
            }


        }
    }





}

したがって、基本的に、新しいプレーヤーがサーバーに接続し、ゲームがベクター内に追加する必要があるときにクラッシュが発生します。奇妙なことに、Visual Studio 2010 ではクラッシュしませんでしたが、vs 2012 に変更するとクラッシュするので、何か間違ったことをしているに違いありません。

編集: プレーヤーのベクトルを作成する方法は次のとおりです。

mapManager.h

std::vector<player> * players;

mapManager.cpp

players = new std::vector<player>();

ここでは、プレーヤーのベクトルを使用します

void mapManager::drawOtherPlayers(int plyId, player *ownPlayer)
{
    ownPlayerSprite->SetPosition(ownPlayer->getX(), ownPlayer->getY());
    window.Draw(*ownPlayerSprite);

    for(std::vector<player>::iterator it = players->begin(); it != players->end(); ++it) 
    {
            spriteToDraw->SetPosition(it->posX,it->posY);
            window.Draw(*spriteToDraw);
    }

}

私のプレーヤークラス: Player.h と player.cpp

4

1 に答える 1