我最近开始使用sfml,但我无法解决这个问题。我有两个类应该工作并显示我的精灵但屏幕上没有任何显示。我已经尝试了一些东西,但到目前为止还没有一个工作,这就是为什么我决定在这里问:/
感谢您的任何帮助,我们也将不胜感激;)
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
答案 0 :(得分:1)
您的播放器精灵初始化为空纹理。然后你将另一张图片加载到纹理中,玩家精灵不知道这一点。精灵对纹理所做的所有计算(例如大小)现在都无效。
确保在之前加载纹理,然后将其传递给精灵。之后不要改变它。
答案 1 :(得分:0)
你确定纹理是否正确加载?检查sf::Texture::loadFromFile
的返回值以进行测试。
更重要的是,为什么您的课程Player
不会延伸到sf::Sprite
?我认为在这种情况下,继承会更合适于组合。
此外,在函数handle_events中,您可以在用户想要关闭窗口时直接调用方法RenderWindow::close
。然后,在您的函数运行中,调用RenderWindow::isOpen
以检查您的应用是否可以继续。它会比这个丑陋的未初始化的退出变量更脏。
答案 2 :(得分:0)
nvoigt是完全正确的。
首先设置精灵的纹理(在播放器构造函数中)并在之后加载它(在主函数中):
...
player_sprite.setTexture(player_texture);
...
player_texture.loadFromFile("player.png");
...
您必须在加载后使用主函数内的.setTexture
重新加载纹理。或者你必须完成你的代码重组。
顺便说一下,这个if (frame.pollEvent(event))
并不是一个好主意。
可能在帧上触发了多个事件,例如鼠标移动和之后的窗口关闭。使用if
,您只能处理此帧中的第一个事件,即鼠标移动,即使您正在寻找第二个事件。所以你应该花一段时间(while (frame.pollEvent(event))
)来确保所有事件都在处理。