Возникла проблема, когда я пытаюсь нарисовать спрайт в цикле рисования, он не будет рисовать
В конструкторе для этого класса я устанавливаю спрайт.
Конструктор у меня есть:
texture.loadFromFile("img1.png");
sprite.setTexture(texture);
спрайт и текстура в шапке файла
Я сделал несколько экспериментов, и если я использую texture.loadFromFile();
в цикле отрисовки это работает.
Но тогда мне приходится «перезагружать» картинку 60 раз в секунду.
void PlayerReceiver::draw(sf::RenderWindow & rw){
//texture.loadFromFile("mario.png");
//std::cout<<texture.getSize().y<<std::endl;
rw.draw(sprite);
}
Спасибо за ответы.
Возникла проблема, когда я пытаюсь нарисовать спрайт в цикле рисования
не будет рисовать В конструкторе для этого класса я устанавливаю спрайт.
Из того, что я понимаю из этого вопроса, вы хотите загрузить текстуру и спрайт внутри конструктора, и это не работает, когда вы пытаетесь нарисовать его из цикла рисования.
У меня есть программа, которая загружает текстуры в конструктор, и она работает нормально, так что я думаю, что это неправильно (и я не уверен, так как я не вижу, кроме шести строк вашей программы в приведенном выше посте), что текстура и спрайтовые объекты не определены на уровне класса.
Вот мой файл заголовка для объекта текстуры, который я использую:
class GraphPaper
{
public:
GraphPaper();
~GraphPaper();
bool isObjectLoaded();
sf::Sprite getSprite();
private:
void load(std::string filename);
bool isLoaded;
sf::Texture texture;
sf::Sprite sprite;
const std::string file = "images/Graph-Paper.png";
};
Объекты текстуры и спрайта перечислены на уровне класса как закрытые члены и доступны через методы получения.
И вот конструктор для этого класса (немного измененный, чтобы лучше соответствовать тому, что вы хотели сделать):
#include "GraphPaper.h"
GraphPaper::GraphPaper() //: isLoaded(false)
{
if (texture.loadFromFile(file) == false)
isLoaded = false;
else
{
texture.setRepeated(true);
sprite.setTexture(texture);
isLoaded = true;
}
//load(file);
assert(isObjectLoaded());
}
После этого я просто рисую свой объект «GraphPaper».
mainWindow.draw(paper.getSprite());
У меня уже есть доступ к нему, потому что я определил объект «GraphPaper» под названием «paper» в моем заголовочном файле MainWindow.
#pragma once
#include "GraphPaper.h"#include "stdafx.h"
class MainWindow
{
public:
void close();
void start();
void moveCamera(sf::Event);
private:
bool leftMousePressed, rightMousePressed, isExiting;
int r, g, b, mouseX, mouseY;
GraphPaper paper;
const sf::Color white = sf::Color(255, 255, 255);
sf::RenderWindow mainWindow;
sf::View view;
};
Предполагая, что это то, что вы хотите сделать, ваша проблема, скорее всего, в заголовочном файле. Любые объекты, определенные на уровне класса, после загрузки не будут уничтожены, пока сам класс не будет уничтожен. Может быть, вам нужно убедиться, что вы не уничтожаете ссылку на класс, в котором находится конструктор. Например, если вы создадите экземпляр вашего класса внутри цикла, в тот момент, когда цикл завершается, объект класса будет уничтожен.
Просто предположение: у вас есть это в вашем строителе:
PlayerReceiver::PlayerReceiver()
{
sf::Texture texture;
texture.loadFromFile("img1.png");
sprite.setTexture(texture);
}
Таким образом, объект текстуры уничтожается сразу после завершения конструктора. Оба sprite
и texture
должны быть членами класса, чтобы они не уничтожались до тех пор, пока сам игрок не был уничтожен.
Если это не ваша проблема, пожалуйста, напишите больше кода.