SFML 不显示精灵
SFML not displaying sprite
我最近开始使用 sfml,但我无法解决这个问题。我有两个 类 应该可以工作并显示我的精灵,但屏幕上没有任何显示。我已经尝试了一些方法,但是 none 到目前为止它们都有效,这就是为什么我决定在这里问:/
感谢您的帮助,我们也将不胜感激 ;)
Main.cpp:
#include <SFML\Graphics.hpp>
#include "Player.hpp"
sf::RenderWindow frame;
sf::Texture player_texture;
Player player(player_texture, 100, 100);
bool quit;
bool handle_events() {
sf::Event event;
if (frame.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
return true;
}
}
return false;
}
void update() {
}
void render() {
frame.clear(sf::Color(127, 142, 123));
player.draw_player(frame);
frame.display();
}
void run() {
while (quit != true) {
quit = handle_events();
update();
render();
}
}
int main() {
player_texture.loadFromFile("player.png");
frame.create(sf::VideoMode(800, 600), "frame");
run();
return 0;
}
Player.cpp:
#include "Player.hpp"
Player::Player(sf::Texture & player_texture, int pos_x, int pos_y) {
player_sprite.setTexture(player_texture);
player_sprite.setPosition(pos_x, pos_y);
player_sprite.scale(4, 4);
}
void Player::draw_player(sf::RenderWindow & frame) {
frame.draw(player_sprite);
}
Player.hpp:
#ifndef Player_hpp
#define Player_hpp
#include <SFML\Graphics.hpp>
#include <iostream>
class Player
{
private:
sf::Sprite player_sprite;
public:
Player::Player(sf::Texture & player_texture, int pos_x, int pos_y);
void Player::draw_player(sf::RenderWindow & frame);
};
#endif
您确定纹理加载正确吗?检查 sf::Texture::loadFromFile
的 return 值进行测试。
此外,为什么你的 class Player
没有从 sf::Sprite
延伸?我认为在这种情况下,继承更适合组合。
另外,在你的函数handle_events中,当用户想要关闭window时,你可以直接调用方法RenderWindow::close
。然后,在您的函数 运行 中调用 RenderWindow::isOpen
以检查您的应用是否可以继续。它会比这个丑陋的未初始化退出变量更干净。
您的玩家精灵已使用空纹理进行初始化。然后你将另一张图片加载到纹理中,而玩家精灵并不知道这一点。精灵在纹理上所做的所有计算(例如大小)现在都无效。
确保在将纹理传递给精灵之前加载纹理。之后不要更改它。
nvoigt 完全正确。
首先设置精灵的纹理(在播放器构造函数中)然后加载它(在主函数中):
...
player_sprite.setTexture(player_texture);
...
player_texture.loadFromFile("player.png");
...
您要么必须在加载后在 main 函数中使用 .setTexture
重新加载纹理。或者你必须完成重组你的代码。
顺便说一句,这 if (frame.pollEvent(event))
不是个好主意。
帧中可能触发了多个事件,例如鼠标移动和 window 之后关闭。使用 if
您将只处理此帧中的第一个事件,即鼠标移动,即使您正在寻找第二个事件。所以你应该用一段时间 (while (frame.pollEvent(event))
) 来确保所有事件都得到处理。
我最近开始使用 sfml,但我无法解决这个问题。我有两个 类 应该可以工作并显示我的精灵,但屏幕上没有任何显示。我已经尝试了一些方法,但是 none 到目前为止它们都有效,这就是为什么我决定在这里问:/
感谢您的帮助,我们也将不胜感激 ;)
Main.cpp:
#include <SFML\Graphics.hpp>
#include "Player.hpp"
sf::RenderWindow frame;
sf::Texture player_texture;
Player player(player_texture, 100, 100);
bool quit;
bool handle_events() {
sf::Event event;
if (frame.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
return true;
}
}
return false;
}
void update() {
}
void render() {
frame.clear(sf::Color(127, 142, 123));
player.draw_player(frame);
frame.display();
}
void run() {
while (quit != true) {
quit = handle_events();
update();
render();
}
}
int main() {
player_texture.loadFromFile("player.png");
frame.create(sf::VideoMode(800, 600), "frame");
run();
return 0;
}
Player.cpp:
#include "Player.hpp"
Player::Player(sf::Texture & player_texture, int pos_x, int pos_y) {
player_sprite.setTexture(player_texture);
player_sprite.setPosition(pos_x, pos_y);
player_sprite.scale(4, 4);
}
void Player::draw_player(sf::RenderWindow & frame) {
frame.draw(player_sprite);
}
Player.hpp:
#ifndef Player_hpp
#define Player_hpp
#include <SFML\Graphics.hpp>
#include <iostream>
class Player
{
private:
sf::Sprite player_sprite;
public:
Player::Player(sf::Texture & player_texture, int pos_x, int pos_y);
void Player::draw_player(sf::RenderWindow & frame);
};
#endif
您确定纹理加载正确吗?检查 sf::Texture::loadFromFile
的 return 值进行测试。
此外,为什么你的 class Player
没有从 sf::Sprite
延伸?我认为在这种情况下,继承更适合组合。
另外,在你的函数handle_events中,当用户想要关闭window时,你可以直接调用方法RenderWindow::close
。然后,在您的函数 运行 中调用 RenderWindow::isOpen
以检查您的应用是否可以继续。它会比这个丑陋的未初始化退出变量更干净。
您的玩家精灵已使用空纹理进行初始化。然后你将另一张图片加载到纹理中,而玩家精灵并不知道这一点。精灵在纹理上所做的所有计算(例如大小)现在都无效。
确保在将纹理传递给精灵之前加载纹理。之后不要更改它。
nvoigt 完全正确。
首先设置精灵的纹理(在播放器构造函数中)然后加载它(在主函数中):
...
player_sprite.setTexture(player_texture);
...
player_texture.loadFromFile("player.png");
...
您要么必须在加载后在 main 函数中使用 .setTexture
重新加载纹理。或者你必须完成重组你的代码。
顺便说一句,这 if (frame.pollEvent(event))
不是个好主意。
帧中可能触发了多个事件,例如鼠标移动和 window 之后关闭。使用 if
您将只处理此帧中的第一个事件,即鼠标移动,即使您正在寻找第二个事件。所以你应该用一段时间 (while (frame.pollEvent(event))
) 来确保所有事件都得到处理。