Pourtant, j'instancie tout dans le thread principale (le main), donc, normalement, tout est bien instancier avec l'ordre dans lequel j'écris le code, mais ici, je viens de rajouter, un pnj à mon word, et quand je veux récupérer le nom du pnj dans le constructeur, paf, plantage!
Voici un petit bout de code qui montre le problème :
La classe qui contient le 1er thread (en variable membre.) :
#include "network.h"
using namespace sf;
using namespace std;
SrkServer::SrkServer(int nbChannels) : m_thread(&SrkServer::run, this)
{
this->nbChannels = nbChannels;
running = false;
Pnj *pnj = new Pnj (Vec2f (500, 500), Vec2f (50, 100), Entity::E_PNJ, "Mafus");
UpsMapLoader loader("Maps/test.upsmap");
Map *map = new Map();
if (loader.createMap(*map,map->getLightManager(), map->getImageManager())) {
map->gridMap->addPnj(pnj);
World::addMap(map);
} else {
delete map;
}
ostringstream oss;
oss<<"Ho, un nouveau! Bienvenue dans le monde de Dorikasa!!! Voici votre première quête!";
oss<<"Les sphérix sont des monstres venu du des Sorokiens, pouvais vous m'en tuer, 10 suffiront.";
oss<<"Ces monstres mécanique ont le malheur de toujours piétiner mes cultures.";
Quest* quest = new Quest (oss.str(), 5000);
pnj->addQuest(quest);
}
void SrkServer::startSrv(int portTCP, int portUDP) {
for (int i = 0; i < nbChannels; i++) {
SrkChannel *channel = new SrkChannel(*this, "Channel "+conversionIntString(i+1));
channels.push_back(channel);
}
for (unsigned int i = 0; i < channels.size(); i++) {
channels[i]->start();
}
if (!running) {
if (!udpSocket.bind(portUDP) == Socket::Done) {
cerr<<"Impossible d'écouter sur ce port : "<<portUDP<<endl;
} else {
selector.add(udpSocket);
}
if (!listener.listen(portTCP) == Socket::Done) {
cerr<<"Impossible d'écouter sur ce port : "<<portTCP<<endl;
} else {
cout<<"Server started!"<<endl;
selector.add(listener);
m_thread.launch();
}
} else {
cout<<"Server already started!"<<endl;
}
}
Et celle qui contient le second thread en variable membre :
#include "srkchannel.h"
#include "user.h"
#include "../IA/ia.h"
using namespace std;
using namespace sf;
SrkChannel::SrkChannel(SrkServer &server, string name) : server(server), name (name), m_thread(&SrkChannel::run, this)
{
this->map = World::getMap("Map test");
BoundingRectangle mZoneInf(200, 200, 500, 500);
int posX, posY;
Vec2f isoCoords;
do {
posX = rand() % (int) mZoneInf.getWidth();
posY = rand() % (int) mZoneInf.getHeight();
isoCoords = Math::convertTo2DIsoCoords(Vec2f (posX, posY) - mZoneInf.getPosition());
isoCoords += mZoneInf.getPosition();
} while (map->gridMap->getGridCellAt(isoCoords) == NULL || !map->gridMap->getGridCellAt(isoCoords)->isPassable());
BoundingPolygon mZone;
Vec2f** points = new Vec2f*[4];
points[0] = new Vec2f(mZoneInf.getPosition());
Vec2f tmp1 = Math::convertTo2DIsoCoords(Vec2f(mZoneInf.getWidth(), 0));
points[1] = new Vec2f (tmp1 + mZoneInf.getPosition());
Vec2f tmp2 = Math::convertTo2DIsoCoords(Vec2f(mZoneInf.getWidth(), mZoneInf.getHeight()));
points[2] = new Vec2f (tmp2 + mZoneInf.getPosition());
Vec2f tmp3 = Math::convertTo2DIsoCoords(Vec2f (0, mZoneInf.getHeight()));
points[3] = new Vec2f (tmp3 + mZoneInf.getPosition());
for (unsigned int i = 0; i < 4; i++) {
mZone.addPoint(points[i]);
}
Monster *m = new Monster (isoCoords, mZoneInf, mZone, 1, 100);
m->setCenter(isoCoords);
Time t = seconds(5.f);
m->setTime(t);
monsters.push_back(m);
map->gridMap->getPnj("Mafus")->getQuests()[0]->addMonsterToKill(m, 10);
tmpDist = 0;
running = false;
}
void SrkChannel::start () {
m_thread.launch();
}
J'ai un plantage à cette ligne-ci :
map->gridMap->getPnj("Mafus")->getQuests()[0]->addMonsterToKill(m, 10);
Et le débugueur m'afficher une erreur, vraiment bizarre. :/
#0 6FC83FAA ??() (D:\Projets-c++\SorrokSrv\bin\Debug\libstdc++-6.dll:??)
#1 ?? 0x004456d5 in Pnj::getName (this=0x440b02 <GridMap::getPnj(std::string)+210>) (D:\Projets-c++\SorrokSrv\world\pnj.cpp:13)
#2 015DA66C ?? () (??:??)
#3 FEEEFEEE ?? () (??:??)
#4 FEEEFEEE ?? () (??:??)
#5 FEEEFEEE ?? () (??:??)
#6 FEEEFEEE ?? () (??:??)
#7 FEEEFEEE ?? () (??:??)
#8 FEEEFEEE ?? () (??:??)
#9 FEEEFEEE ?? () (??:??)
#10 FEEEFEEE ?? () (??:??)
#11 FEEEFEEE ?? () (??:??)
#12 FEEEFEEE ?? () (??:??)
#13 FEEEFEEE ?? () (??:??)
#14 FEEEFEEE ?? () (??:??)
#15 FEEEFEEE ?? () (??:??)
#16 FEEEFEEE ?? () (??:??)
#17 FEEEFEEE ?? () (??:??)
#18 FEEEFEEE ?? () (??:??)
#19 FEEEFEEE ?? () (??:??)
#20 FEEEFEEE ?? () (??:??)
#21 FEEEFEEE ?? () (??:??)
#22 FEEEFEEE ?? () (??:??)
#23 FEEEFEEE ?? () (??:??)
#24 FEEEFEEE ?? () (??:??)
#25 FEEEFEEE ?? () (??:??)
#26 FEEEFEEE ?? () (??:??)
#27 FEEEFEEE ?? () (??:??)
#28 FEEEFEEE ?? () (??:??)
#29 FEEEFEEE ?? () (??:??)
PS : je fais un test sur le nom du pnj pour récupérer le pnj dans la grille.