问题:纹理加载问题,cpp

时间:2020-06-13 19:41:04

标签: c++ oop irrlicht graphical-programming

几周前,我开始在 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);
        }
    }
}

对不起,我的英语不好,我是法国学生:)。

0 个答案:

没有答案