C++ 雪碧白色方块

C++ 雪碧白色方块,c++,sprite,sfml,C++,Sprite,Sfml,昨天我问了一个关于SFML平滑运动的问题。。。这个问题解决了,但这次我使用的精灵显示为白色方块 我已尝试将精灵发送到drawship函数作为参考,但由于我在main.cpp上使用该函数,因此无法执行上的指示。所以我想知道如何解决这个问题 main.cpp #包括 #包括 #包括“Spaceship.hpp” #包括 #包括“ResourcePath.hpp” int main(int,字符常量**) { //创建主窗口 sf::渲染窗口(sf::视频模式(800600),“航天飞机”); 设置帧

昨天我问了一个关于SFML平滑运动的问题。。。这个问题解决了,但这次我使用的精灵显示为白色方块

我已尝试将精灵发送到
drawship
函数作为参考,但由于我在
main.cpp
上使用该函数,因此无法执行上的指示。所以我想知道如何解决这个问题

main.cpp
#包括
#包括
#包括“Spaceship.hpp”
#包括
#包括“ResourcePath.hpp”
int main(int,字符常量**)
{
//创建主窗口
sf::渲染窗口(sf::视频模式(800600),“航天飞机”);
设置帧率限制(30);
//不带对象参数调用非静态成员函数
//设置图标
sf::图像图标;
如果(!icon.loadFromFile(resourcePath()+“space sputter.png”)){
返回退出失败;
}
setIcon(icon.getSize().x,icon.getSize().y,icon.getPixelsPtr());
//加载要显示的精灵
sf::纹理;
如果(!texture.loadFromFile(resourcePath()+“bg.png”)){
返回退出失败;
}
雪碧雪碧(纹理);
//创建要显示的图形文本
sf::字体;
如果(!font.loadFromFile(resourcePath()+“sansation.ttf”)){
返回退出失败;
}
sf::文本文本(“航天飞机K1LLM33K”,字体,50);
text.setFillColor(sf::Color::White);
text.setPosition(100.0130.0);
//加载要播放的音乐
/*sf::Music Music;if(!Music.openFromFile(resourcePath()+“nice_Music.ogg”){return EXIT_FAILURE;}
//演奏音乐
音乐。播放();
*/
太空船太空船(窗口);
sf::时钟sf_时钟;
//开始游戏循环
while(window.isOpen()){
//获取自上一帧以来经过的时间
float dt=sf_clock.restart().asSeconds();
//处理事件
sf::事件;
while(window.pollEvent(事件)){
//关闭窗口:退出
如果(event.type==sf::event::Closed){
window.close();
}
//按下退出按钮:退出
if(event.type==sf::event::KeyPressed&&event.key.code==sf::Keyboard::Escape){
window.close();
}
}
//移动宇宙飞船
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){spaceship.moveship(dt,'l');}
如果(sf::Keyboard::iskeypress(sf::Keyboard::Right)){spaceship.moveship(dt,'r');}
如果(sf::Keyboard::iskeypress(sf::Keyboard::Up)){spaceship.moveship(dt,'u');}
如果(sf::Keyboard::iskeypress(sf::Keyboard::Down)){spaceship.moveship(dt,'d');}
//清屏
window.clear();
//画精灵
窗口。绘制(精灵);
//
//画宇宙飞船
//
太空船。drawsprite(窗口);
//画线
窗口。绘制(文本);
//更新窗口
window.display();
}
返回退出成功;
}
太空船
#包括
#包括
#包括“ResourcePath.hpp”
#包括“Spaceship.hpp”
太空船::太空船(sf::渲染窗口和游戏窗口){
auto surface=game_window.getSize();
ss_x=ss_y=0.5f;
ss_速度_x=250.f/表面x;
ss_速度_y=250.f/表面.y;
ss_宽度=128;
ss_高度=128;
ss_半径=ss_宽度/2;
sf::纹理船;
如果(!ship.loadFromFile(resourcePath()+“space-shutter-64.png”)){
返回退出失败;
}
雪碧=sf::雪碧(船);
ss_sprite.setOrigin(ss_宽度/2,ss_高度/2);
}
虚空宇宙飞船::drawsprite(sf::渲染窗口和游戏窗口){
auto size=game_window.getSize();
设置位置(ss_x*size.x,ss_y*size.y);
游戏窗口绘制(ss_sprite);
}
void Spaceship::moveship(float dt,char move){
开关(移动){
案例“l”:ss_x-=dt*ss_速度;中断;
案例'r':ss_x+=dt*ss_速度;中断;
案例“u”:ss_y-=dt*ss_速度;中断;
案例“d”:ss_y+=dt*ss_速度;中断;
}
}
太空船::~Spaceship(){}
太空船
#ifndef飞船(水电站)
#定义太空船
#包括
#包括
#包括
#包括
使用名称空间std;
二级宇宙飞船{
公众:
宇宙飞船();
宇宙飞船(sf::RenderWindow&);
~宇宙飞船();
无效移动船舶(浮动,字符);
虚空drawsprite(sf::RenderWindow&);
私人:
浮点数ss_x,ss_y;
浮动速度x,速度y;
int ss_宽度、ss_高度、ss_半径;
sf::雪碧ss_雪碧;
};
#endif/*宇宙飞船水电站*/
根据“只要精灵使用纹理,它就必须存在。事实上,精灵并不存储它自己的纹理副本”,因此只要将
sf::texture
从构造函数移动到
太空船的一个成员就可以修复它

class Spaceship {
    // Some stuff
    sf::Texture ss_ship_texture;
};

Spaceship::Spaceship(const sf::RenderWindow& window) {
    // Some stuff
    ss_ship_texture.loadFromFile("path/to/ship/image");
    ss_ship.setTexture(ss_ship_texture);
}
根据“只要精灵使用纹理,它就必须存在。事实上,精灵并不存储它自己的纹理副本”,因此只要将
sf::texture
从构造函数移动到
Spaceship
的一个成员就可以修复它

class Spaceship {
    // Some stuff
    sf::Texture ss_ship_texture;
};

Spaceship::Spaceship(const sf::RenderWindow& window) {
    // Some stuff
    ss_ship_texture.loadFromFile("path/to/ship/image");
    ss_ship.setTexture(ss_ship_texture);
}

白色正方形而不是纹理通常会提示纹理未初始化/创建或已销毁/无效

在您的例子中,您正在
太空船
构造函数中创建纹理对象,一旦构造函数完成,该对象将无效。请注意,
sf::Sprite
只接收/存储指向纹理的引用(指针),而不是实际纹理的副本


您必须将其存储在外部,例如,作为某个资源管理器类的一部分,或者只需将其传递给您的
太空船
构造函数。

一个白色正方形而不是您的纹理通常会提示纹理未初始化/创建或已销毁/无效

在您的例子中,您正在
太空船
构造函数中创建纹理对象,一旦构造函数完成,该对象将无效。请注意,
sf::Sprite
只接收/存储指向纹理的引用(指针),而不是
#ifndef Spaceship_hpp
#define Spaceship_hpp
#include <iostream>
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <stdio.h>

using namespace std;

class Spaceship {
public:
    Spaceship();
    Spaceship(sf::RenderWindow&);
    ~Spaceship();
    void moveship(float, char);
    void drawsprite(sf::RenderWindow&);
private:
    float ss_x, ss_y;
    float ss_speed_x, ss_speed_y;
    int ss_width, ss_height, ss_radius;
    sf::Sprite ss_sprite;

};

#endif /* Spaceship_hpp */
class Spaceship {
    // Some stuff
    sf::Texture ss_ship_texture;
};

Spaceship::Spaceship(const sf::RenderWindow& window) {
    // Some stuff
    ss_ship_texture.loadFromFile("path/to/ship/image");
    ss_ship.setTexture(ss_ship_texture);
}