SFML Неоднозначное преобразование из производного класса при реализации функции рисования - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь создать на собственном игровом движке, где каждый базовый элемент представляет собой GameObject, который будет состоять из функции обновления и других уведомителей.

Вот мой код:

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include "AssetManager.hpp"

class GameObject : public sf::Drawable, public sf::Transformable
{
public:
  virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const{
    target.draw(*this, states);
  };
};

class Sprite : public GameObject, public sf::Sprite {
public:
  Sprite(AssetManager assetManager, std::string assetName) : sf::Sprite(){
    setTexture(assetManager.getTextureNamed(assetName));
  }
};


int main(int argc, char const** argv)
{
  sf::RenderWindow window(sf::VideoMode::getDesktopMode(), "");
  AssetManager assetManager = AssetManager("/Users/iProgram/Desktop/My Game Engine/My Game Engine");
  assetManager.loadTextureWithName("tank", "tank.png", sf::Vector2f(16,16));

  Sprite tank = Sprite(assetManager, "tank");

  while(window.isOpen()){
    window.clear();
    window.draw(tank);
    window.display();
  }

  return EXIT_SUCCESS;
}

Обратите внимание, что менеджер ресурсов просто сохраняет текстуры в памяти и возвращает их при необходимости с заданным размером.

Проблема в строке: window.draw(tank);, я получаю ошибку

Неоднозначное преобразование из производного класса 'const Sprite' в базовый класс 'const sf :: Drawable':

Почему я реализовал функцию рисования в классе GameObjectи как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Чтобы решить эту проблему, мне не нужно использовать частное наследование, как некоторые предлагали, мне просто нужен мой базовый класс (GameObject), чтобы ничего не наследовать.Мой класс Sprite наследовал бы sf::Sprite примерно так:

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include "AssetManager.hpp"

class GameObject{
public:
  virtual void update(){}
};

class Sprite : public GameObject, public sf::Sprite {
public:
  Sprite(AssetManager* assetManager, std::string assetName) : sf::Sprite(assetManager->getTextureNamed(assetName)){
  }
};

class Tank: public Sprite{
public:
  Tank(AssetManager* assetManager) : Sprite(assetManager, "tank"){
    setScale(3, 3);
  };

  virtual void update(){
    move(1,0);
  }
};

int main(int argc, char const** argv)
{
  sf::RenderWindow window(sf::VideoMode::getDesktopMode(), "");
  AssetManager* assetManager = new AssetManager("/Users/iProgram/Desktop/My Game Engine/My Game Engine");
  assetManager->loadTextureWithName("tank", "tank.png", sf::Vector2f(16,16));

  Tank tank = Tank(assetManager);
  while(window.isOpen()){
    sf::Event event;
    while(window.pollEvent(event)){
      if(event.type == sf::Event::Closed){
        window.close();
      }
    }
    tank.update();
    window.clear();
    window.draw(tank);
    window.display();
  }

  return EXIT_SUCCESS;
}
0 голосов
/ 23 февраля 2019

Ваш класс Sprite наследуется от GameObject, который наследуется от sf::Drawable.Ваш класс также наследует от sf::Sprite, который также наследует от sf::Drawable.Теперь у вашего Sprite класса есть 2 унаследованных sf::Drawable подобъекта, и компилятор не может выбирать.

Чтобы исправить это, либо переосмыслите свой дизайн, либо виртуально наследуйте.

...