C++ SFML 对象不会绘制

C++ SFML object won't draw

本文关键字:绘制 对象 SFML C++      更新时间:2023-10-16

在下面的代码中,我试图在复合对象中绘制一个圆形对象,但它无法绘制。我不知道为什么。此代码永远不会到达圆形绘制方法。

如果我直接调用main.cpp中circle的draw()方法,它会绘制。。

可提取.h

#pragma once
#include <SFML/Graphics.hpp>
class drawable{
  public:
   drawable(sf::Vector2f position);
   virtual void draw(sf::RenderWindow & window){};
   sf::Vector2f position;
};
class circle : public drawable{
  public:
   circle(sf::Vector2f position);
   void draw(sf::RenderWindow & window) override;
};
class composite : public drawable{
  public:
   composite(sf::Vector2f position, drawable part);
   void draw(sf::RenderWindow & window) override;
  private:
   int count = 0;
   drawable part;
};

可提取.cpp

#include "drawable.h"
#include <iostream>
using namespace std;
drawable::drawable(sf::Vector2f position) : position{ position } {
}
circle::circle(sf::Vector2f position) : drawable{ position } {
}
composite::composite(sf::Vector2f position, drawable part) : drawable(position), part{ part }{
}
void circle::draw(sf::RenderWindow & window) {
  sf::CircleShape circle;
  circle.setPosition(position);
  circle.setRadius(30);
  window.draw(circle);
}
void composite::draw(sf::RenderWindow & window) {
  this->part.position.x = this->position.x + part.position.x;
  this->part.position.y = this->position.y + part.position.y;
  this->part.draw(window);
}

main.cpp

#include <SFML/Graphics.hpp>
#include "drawable.h"
int main()
{
  sf::RenderWindow window = sf::RenderWindow{ sf::VideoMode{ 640, 480 }, "SFML window" };
  circle circle{ sf::Vector2f{ 100, 200 } };
  composite composite(sf::Vector2f{ 200, 200 }, circle);
  window.clear();   
  composite.draw(window);
  window.display();
  while (window.isOpen()) {
    sf::Event event;
    while (window.pollEvent(event)){
        if (event.type == sf::Event::Closed){
            window.close();
        }
    }
    sf::sleep(sf::milliseconds(20));
  }
  return 0;
}

Composite按值取drawable。这意味着在composite中,您只能得到drawable对象;关于混凝土类型的所有信息都将丢失。如果你想支持多态对象,你需要使用指针或引用。