几周前,我开始在 cpp 中使用 Irrlicht 库,因此仍然有些我不了解的行为。
这是我的问题:当我调用IVideoDriver::getTexture()
方法时,出现了 Segmentation Fault 。当我注释调用此方法的行时, Irrlicht 打印std::exception
,然后程序停止。
看看我的代码:
MainMenu.cpp
void MainMenu::_launchGame()
{
Game game(_device, _driver, _sceneManager, 4, 0);
game.run();
}
这是Game
类的构造函数:
Game::Game(IrrlichtDevice *device, IVideoDriver *driver, ISceneManager *scenes, const irr::u8 &playerNb, const irr::u8 &AINb)
: _device(device), _driver(driver), _scenes(scenes), _playerNb(playerNb), _AINb(AINb),
_map((_AINb + _playerNb) * 10, (AINb + _playerNb) * 10),
_localHost(true), _serverHost(false)
{
_camera = _scenes->addCameraSceneNode(0,
vector3df((_map.getSize().width * 10) / 2, ((_AINb + _playerNb) * 6) + 250, (_map.getSize().height * 10) / 2),
vector3df((_map.getSize().width * 10) / 2, 0, (_map.getSize().height * 10) / 2));
for (u8 i = 0; i < playerNb; i++) {
IAnimatedMeshSceneNode *player = _scenes->addAnimatedMeshSceneNode(_scenes->getMesh("sydney.md2"));
vector2d<u32> spawn = _map.getSpawn(i);
vector3df spawn3D = vector3df(spawn.X * 10, spawn.Y * 10, 20);
player->setPosition(spawn3D);
player->setMaterialFlag(EMF_LIGHTING, false);
player->setFrameLoop(0, 0);
player->setMaterialTexture(0, _driver->getTexture("sydney.bmp"));
_players.push_back(player);
}
}
run()
函数调用render()
方法:
void Game::run()
{
_render();
}
所以_render()
方法:
void Game::_render()
{
CEventReceiver receiver(_players.at(0));
_device->setEventReceiver(&receiver);
_map.makeRender(_scenes, _driver);
while (_device->run()) {
_driver->beginScene(true, true, SColor(255, 255, 255, 255));
receiver.majPosMesh();
_scenes->drawAll();
_driver->endScene();
}
_device->drop();
}
我需要弄清楚,当我注释从makeRender()
类调用Map
方法的行时,该程序运行良好,但是发现问题出处时,向我展示其余代码很有用那部分。
这是Map::makeRender()
方法:
void Map::makeRender(ISceneManager *scenes, IVideoDriver *driver)
{
std::vector<ISceneNode *> blocks;
_useRandomBlockTextures(driver);
for (u16 y = 0; y < _size.height; y++) {
for (u16 x = 0; x < _size.width; x++) {
ITexture *texture = nullptr;
ISceneNode *blockNode = scenes->addCubeSceneNode(10.0F, 0, -1, vector3df(x * 10, (_isFreeBlock(at(x, y)) ? 0 : 10), y * 10));
if (_isFreeBlock(at(x, y)))
texture = _textures.at(PATH_TEXTURE);
else if (at(x, y) == Block::UNBREAKABLE_WALL)
texture = _textures.at(UNBREAKABLE_WALL_TEXTURE);
else {
ISceneNode *underPath = scenes->addCubeSceneNode(10.0F, 0, -1, vector3df(x * 10, 0, y * 10));
underPath->setMaterialTexture(0, _textures.at(PATH_TEXTURE));
underPath->setMaterialFlag(EMF_LIGHTING, false);
texture = _textures.at(WALL_TEXTURE);
}
blockNode->setMaterialTexture(0, texture);
blockNode->setMaterialFlag(EMF_LIGHTING, false);
blocks.push_back(blockNode);
}
}
}
对不起,我的英语不好,我是法国学生:)。