【发布时间】:2015-12-02 07:25:39
【问题描述】:
我正在学习使用 SFML 来制作一个小游戏,到目前为止,我已经创建了一个窗口并弄乱了它的设置,并设置了一个绘制循环和事件处理程序。
当我尝试使用以下代码添加我的第一个纹理时,问题就开始了:
#include "SpaceNomad.ih"
void MainMenu(GameEngine &Engine)
{
sf::Texture texture;
if(!texture.loadFromFile("MenuBackGround.png"))
{
cout << "couldn't load background texture\n";
}
sf::Sprite *sprite = new sf::Sprite;
sprite->setTexture(texture);
Engine.AddEntity(sprite, 5);
}
它在不同的图像之外,实际上是SFML tutorial page 上给出的示例代码。
当我尝试编译时,我收到以下错误:
||=== Build: Debug in space nomad (compiler: GNU GCC Compiler) ===|
obj\Debug\projects\st\take2\MainMenu.o||In function `Z8MainMenuR10GameEngine':|
D:\projects\st\take2\MainMenu.cpp|7|undefined reference to `_imp___ZN2sf7Texture12loadFromFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_4RectIiEE'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
我已检查所有 sfml 库是否都包含在构建选项中(我正在使用带有 GCC MinGW 的 code::Blocks)。
https://drive.google.com/file/d/0B4qzXcgqbLZtcHJWUy1vSUhpdVk/view?usp=sharing
我见过的其他主题涉及对人们自己创建的函数的未定义引用,但这里我使用的是库。
编辑:我刚刚尝试使用同一个库中的基本形状:
sf::CircleShape *shape = new sf::CircleShape(50);
// set the shape color to green
shape->setFillColor(sf::Color(100, 250, 50));
Engine.AddEntity(shape, 5);
编译和显示没有问题。
【问题讨论】:
-
但是,我必须补充一点,即使您修复了未定义的引用错误,您也会面临
white square problem。此外,我认为尽可能使用堆并不是一个好的设计。为什么你的sf::Sprite-Instance 不在堆栈上? -
这个想法是让背景或按钮等对象的实现与绘图循环分开,其中绘图循环只有一个指向它需要绘制的对象的指针。这里的对象实现根本还没有实现。如果我把它放在堆栈中,它会在它被绘制时被清理干净。
-
你的纹理在绘制之前会被清理干净。精灵只有一个指向纹理的指针,而不是纹理本身的完整副本。因此你会遇到纹理不会被绘制。
-
你链接了吗。除了
sfml-graphics、sfml-system,还有吗? -
我添加了一张图片drive.google.com/file/d/0B4qzXcgqbLZtcHJWUy1vSUhpdVk/view,您可以在其中看到我如何链接 sfml-audio-d、sfml-graphics-d、sfml-window-d 和 sfml-system-d