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