[英]SFML Sprite white square
我曾問一個問題,關於SFML昨天平滑運動......這問題解決了,但這個時候,即時通訊使用的精靈被顯示為白色正方形。
我試圖將精靈發送到drawship
函數作為參考,但由於我在main.cpp
上使用該函數,因此我無法執行此答案中的說明。 所以我想知道如何解決這個問題。
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include "Spaceship.hpp"
#include <vector>
#include "ResourcePath.hpp"
int main(int, char const**)
{
// Create the main window
sf::RenderWindow window(sf::VideoMode(800, 600), "SpaceShuttle");
window.setFramerateLimit(30);
// Call to non-static member function without an object argument
// Set the Icon
sf::Image icon;
if (!icon.loadFromFile(resourcePath() + "space-shuttle.png")) {
return EXIT_FAILURE;
}
window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());
// Load a sprite to display
sf::Texture texture;
if (!texture.loadFromFile(resourcePath() + "bg.png")) {
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("SpaceShuttle K1LLM33K", font, 50);
text.setFillColor(sf::Color::White);
text.setPosition(100.0, 130.0);
// Load a music to play
/* sf::Music music; if (!music.openFromFile(resourcePath() + "nice_music.ogg")) { return EXIT_FAILURE; }
// Play the music
music.play();
*/
Spaceship spaceship(window);
sf::Clock sf_clock;
// Start the game loop
while (window.isOpen()) {
// Get time elapsed since last frame
float dt = sf_clock.restart().asSeconds();
// Process events
sf::Event event;
while (window.pollEvent(event)) {
// Close window: exit
if (event.type == sf::Event::Closed) {
window.close();
}
// Escape pressed: exit
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) {
window.close();
}
}
//move spaceship
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { spaceship.moveship(dt, 'l'); }
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { spaceship.moveship(dt, 'r'); }
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { spaceship.moveship(dt, 'u'); }
else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { spaceship.moveship(dt, 'd'); }
// Clear screen
window.clear();
// Draw the sprite(s)
window.draw(sprite);
//
// To draw the Spaceship
//
spaceship.drawsprite(window);
// Draw the string(s)
window.draw(text);
// Update the window
window.display();
}
return EXIT_SUCCESS;
}
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include "ResourcePath.hpp"
#include "Spaceship.hpp"
Spaceship::Spaceship(sf::RenderWindow& game_window){
auto surface = game_window.getSize();
ss_x = ss_y = 0.5f;
ss_speed_x = 250.f / surface.x;
ss_speed_y = 250.f / surface.y;
ss_width = 128;
ss_height = 128;
ss_radius = ss_width/2;
sf::Texture ship;
if (!ship.loadFromFile(resourcePath() + "space-shuttle-64.png")) {
return EXIT_FAILURE;
}
ss_sprite = sf::Sprite(ship);
ss_sprite.setOrigin(ss_width / 2, ss_height / 2);
}
void Spaceship::drawsprite(sf::RenderWindow& game_window){
auto size = game_window.getSize();
ss_sprite.setPosition(ss_x * size.x, ss_y * size.y);
game_window.draw(ss_sprite);
}
void Spaceship::moveship(float dt, char move){
switch (move) {
case 'l': ss_x -= dt * ss_speed_x; break;
case 'r': ss_x += dt * ss_speed_x; break;
case 'u': ss_y -= dt * ss_speed_y; break;
case 'd': ss_y += dt * ss_speed_y; break;
}
}
Spaceship::~Spaceship(){}
#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 */
根據文檔,“只要精靈使用它,紋理就必須存在。實際上,精靈不存儲自己的紋理副本”,因此只需將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);
}
白色方塊而不是你的紋理通常暗示紋理沒有被初始化/創建或被破壞/無效。
在您的情況下,您正在Spaceship
構造函數中創建一個紋理對象,一旦構造函數完成,該對象將無效。 請注意, sf::Sprite
只是接收/存儲對您的紋理的引用(指針),而不是實際紋理的副本。
您必須將其存儲在外部,例如作為某些資源管理器類的一部分,或者只是將其傳遞給您的Spaceship
構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.