Я работаю над игровым проектом и обнаружил, что застрял в следующей проблеме:
У меня есть класс с именем Game : public sf::Drawable
, который я использую для (помимо прочего) рисования всего в моей игре , Game
содержит класс с именем Player : public Entity
, который, в свою очередь, является подклассом Entity : public sf::Drawable
.
Эти классы немного упрощены, но затронутые функции одинаковы:
Сущность
class Entity : public sf::Drawable
{
private:
sf::Sprite eSprite;
sf::Texture eTex;
std::string texpath;
public:
virtual Entity(std::string texpath, sf::IntRect intrect){
this->texpath = texpath;
eTex.loadFromFile(texpath, intrect);
eSprite.setTexture(eTex); }
virtual ~Entity(){}
virtual void draw(sf::RenderTarget target, sf::RenderStates states)const{
target.draw(this->eSprite);}
//Lots of other functions
}
Игрок
class Player : public Entity¨
{
public:
~Player(){}
Player(std::string texpath, sf::IntRect spriteintrect)
:Entity(texpath, spriteintrect){}
void draw(sf::RenderTarget target, sf::RenderStates states){
Entity::draw(target, states); }
}
Игра
#define PLAYER_START "../filepath/image.png",
sf::IntRect{0,0,40,60,}, sf::Vector2f(320.0f, 200.0f) //Ease of access
class Game : public sf::Drawable
{
private:
Player player;
public:
Game() { player = Player(PLAYER_START); };
~Game() {};
void draw(sf::RenderTarget &target, sf::RenderStates states)const { target.draw(player); }
};
Для облегчения понимания проблемы я создал следующий пример кода:
int main(){
sf::RenderWindow window(sf::VideoMode(640, 480), "Game Test");
sf::Event event = sf::Event{};
Game game;
while (window.isOpen())
{
while (window.pollEvent(event))
if (event.type == sf::Event::Closed)
window.close();
window.clear();
window.draw(game);
window.display();
}
}
Этот код создает белый квадрат.
Я пробовал:
- Создание
Player
вне Game
и вызов window.draw(player);
для него. Это работает. - Создание нового
Player
с помощью оператора присваивания и рисования. Это работает. - Создание нового
Player
через конструктор копирования и чертеж. Это работает. - Вставка
Player
в класс Game
и рисование этого. Это не работает и является тем, что я иллюстрирую приведенным выше кодом
. Я понимаю, что эту проблему (вероятно) можно решить, переместив sf::Sprite
и sf::Texture
в Player
класса, но так как я хочу в конечном итоге получить Coin
и Enemy
из базового класса Entity, я бы предпочел решить проблему как есть. *
Спасибо за любую помощь / знания