我正在尝试为SFML创建一个Screen
类,但是由于某些原因,该应用程序在使用Xcode示例时可以工作,但是一旦我将窗口放入它自己的类中,它就无法工作。为什么会这样,我该如何解决?
这是我的代码(适用于示例):
编辑:
阅读注释后,我已更改为以下代码。这仍然不显示屏幕,并且程序仍然退出。
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include "ResourcePath.hpp"
class Screen{
public:
sf::RenderWindow window;
Screen(){
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
}
};
int main(int, char const**)
{
Screen* screen = new Screen();
// Set the Icon
sf::Image icon;
if (!icon.loadFromFile(resourcePath() + "icon.png")) {
return EXIT_FAILURE;
}
screen->window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());
// Load a sprite to display
sf::Texture texture;
if (!texture.loadFromFile(resourcePath() + "cute_image.jpg")) {
return EXIT_FAILURE;
}
sf::Sprite sprite(texture);
// Create a graphical text to display
sf::Font font;
if (!font.loadFromFile(resourcePath() + "sansation.ttf")) {
return EXIT_FAILURE;
}
sf::Text text("Hello SFML", font, 50);
text.setFillColor(sf::Color::Black);
// Load a music to play
sf::Music music;
if (!music.openFromFile(resourcePath() + "nice_music.ogg")) {
return EXIT_FAILURE;
}
// Play the music
music.play();
// Start the game loop
while (screen->window.isOpen())
{
// Process events
sf::Event event;
while (screen->window.pollEvent(event))
{
// Close window: exit
if (event.type == sf::Event::Closed) {
screen->window.close();
}
// Escape pressed: exit
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) {
screen->window.close();
}
}
// Clear screen
screen->window.clear();
// Draw the sprite
screen->window.draw(sprite);
// Draw the string
screen->window.draw(text);
// Update the window
screen->window.display();
}
return EXIT_SUCCESS;
}
答案 0 :(得分:1)
构造函数中出现逻辑错误。创建方式,将Screen::window
保留为未初始化状态,然后创建另一个RenderWindow
对象,该对象在执行离开构造函数后立即变得不可访问。
相反,您应该这样做
class Screen{
public:
sf::RenderWindow window;
Screen():
window(sf::VideoMode(800, 600), "SFML window") {}
};
其他所有内容均应按预期工作,除非它没有任何其他错误。如果您对我使用的语法感到好奇,可以访问this link。
答案 1 :(得分:-1)
很难说。也许您访问的内存地址不属于您的程序?尝试使用唯一指针和make_unique定义一些指针。
例如:
std::unique_ptr<sf::RenderWindow> window;
window = std::make_unique<sf::RenderWindow>(sf::VideoMode(WIDTH, HEIGHT), "PushBlox",sf::Style::Default);
我之前确实使用sfml创建了一个项目,所以请随时在此处签出我的代码-> https://github.com/FromAlaska/ComputerScience/tree/2017/Projects/Frontier