c++ - SFML C++ 绘制形状 vector

标签 c++ sfml

我刚刚重新开始编码。尝试制作一个简单的闯关游戏,我确实开始只是制作一个简单的“乒乓球”游戏,但发现它很容易,所以我试图将其扩展为一个闯关游戏(为那些不知道它是什么的人附上图片)。

为了处理屏幕顶部的方 block ,我使用了方 block vector ,现在我正试图从中将它们绘制到屏幕上。我无法执行此操作,因为出现错误:

error C2664: 'void sf::RenderTarget::draw(const sf::Vertex *,size_t,sf::PrimitiveType,const sf::RenderStates &)' : cannot convert argument 1 from 'Block' to 'const sf::Drawable &'

在 block.cpp 文件中

这里是相关的代码,还有更多的功能,但它们并不适用于此。抱歉其中有任何错误代码:)

block .cpp

Block::Block(float startX, float startY)
{
    position.x = startX;
    position.y = startY;

    colour = sf::Color::White;

    block.setSize(sf::Vector2f(width, height));
    block.setFillColor(colour);
    block.setPosition(position);
}

void Block::draw(Block block, sf::RenderWindow& window)
{
    window.draw(block);
}

block 容器.cpp

#pragma once

class ContainerOfBlocks
{
public:
    ContainerOfBlocks(int useless);
    ~ContainerOfBlocks();

    std::vector<Block> getContainer();

    void drawContainer(sf::RenderWindow& window);

private:
    std::vector<Block> blockContainer;
};

block 容器.h

#pragma once

class ContainerOfBlocks
{
public:
    ContainerOfBlocks(int useless);
    ~ContainerOfBlocks();

    std::vector<Block> getContainer();

    void drawContainer(sf::RenderWindow& window);

private:
    std::vector<Block> blockContainer;
};

感谢您的帮助:)

最佳答案

(我不得不把它放在这里,因为我还没有足够的声誉来发表评论)

一些东西

  • 我不明白为什么你有这个代码void Block::draw(Block block, sf::RenderWindow &window) .应该是void Block::draw(sf::RenderWindow &window)然后画block (这是类(class)成员)或通过 block如果您想从其他地方绘制 block ,则通过引用

  • 无论如何,Block应该继承自 sf::Drawable并使用它的功能来绘制。我认为这就是错误消息所说的内容。例如class Block : public sf::Drawable { ... };绘制函数为 virtual void draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const;在标题和 void draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const { renderTarget.draw(block); }在你的 .cpp 中。然后你可以迭代你已经拥有的 block vector 并绘制每个 block

  • 函数 std::vector<Block> getContainer()应返回对 vector (std::vector<Block> &getContainer()) 的引用

  • 这不是错误,但我更喜欢使用 #ifndef ... #define... #endif头部防护而不是 #pragma once

编辑(关于您在下面的回复):

我做了一个快速项目,其中使用了您的大部分代码。

(还要确保阅读我在代码下方的注释)

这是编译后的图片:

enter image description here

代码:

block .h

#ifndef BLOCK_H_INCLUDED
#define BLOCK_H_INCLUDED

#include <SFML/Graphics.hpp>

class Block : public sf::Drawable {
 public:
  Block();
  Block::Block(float startX, float startY);
  virtual ~Block();

 private:
  virtual void draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const;

  sf::RectangleShape block;
  sf::Vector2f position;
  float width;
  float height;
  sf::Color colour;
};

#endif

block .cpp

#include "block.h"

Block::Block() :
  position(sf::Vector2f()),
  width(40.0f),
  height(20.0f),
  colour(sf::Color())
{
}

Block::Block(float startX, float startY) :
  width(40.0f),
  height(20.0f)
{
  position.x = startX;
  position.y = startY;

  colour = sf::Color::White;

  block.setSize(sf::Vector2f(width, height));
  block.setFillColor(colour);
  block.setPosition(position);
}

Block::~Block() {
}

void Block::draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const {
  renderTarget.draw(block);
}

block 容器.h

#ifndef BLOCKCONTAINER_H_INCLUDED
#define BLOCKCONTAINER_H_INCLUDED

#include "block.h"

class ContainerOfBlocks : public sf::Drawable {
 public:
  ContainerOfBlocks();
  ContainerOfBlocks(int useless, const sf::Vector2f pos);
  ~ContainerOfBlocks();

  std::vector<Block> &getContainer();
  void drawContainer(sf::RenderWindow &window);

 private:
  virtual void draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const;

  std::vector<Block> blockContainer;
};

#endif

block 容器.cpp

#include "blockContainer.h"

ContainerOfBlocks::ContainerOfBlocks() {
}

ContainerOfBlocks::ContainerOfBlocks(int useless, const sf::Vector2f pos) {
  if (useless > 0) {
    float x = pos.x;
    float y = pos.y;
    for (std::size_t i = 0; i < static_cast<std::size_t>(useless); ++i) {
      blockContainer.push_back(Block(x, y));
      x += 50.0f;
    }
  }
}

ContainerOfBlocks::~ContainerOfBlocks() {
}

std::vector<Block> &ContainerOfBlocks::getContainer() {
  return blockContainer;
}

void ContainerOfBlocks::drawContainer(sf::RenderWindow &window) {
  for (std::size_t i = 0; i < blockContainer.size(); ++i) {
    window.draw(blockContainer[i]);
  }
}

void ContainerOfBlocks::draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const {
  for (std::size_t i = 0; i < blockContainer.size(); ++i) {
    renderTarget.draw(blockContainer[i]);
  }
}

主要.cpp

#include <SFML/Graphics.hpp>

#include "block.h"
#include "blockContainer.h"

int main() {
  sf::RenderWindow window(sf::VideoMode(400, 200), "SFML works!");
  window.setFramerateLimit(30);
  window.setVerticalSyncEnabled(false);

  // create container with 5 blocks in it, starting at pos 10/10
  // this container will be drawn using ContainerOfBlocks' void drawContainer(sf::RenderWindow &window)
  ContainerOfBlocks testBlocks(5, sf::Vector2f(10.0f, 10.0f)); 

  // create another container, starting at pos 10/50
  // this one will be drawn using sf::Drawable's function to draw
  ContainerOfBlocks testBlocks2(5, sf::Vector2f(10.0f, 50.0f)); 

  while (window.isOpen()) {
    sf::Event evt;
    while (window.pollEvent(evt)) {
      if (evt.type == sf::Event::Closed) {
        window.close();
      }
    }
    window.clear();
    testBlocks.drawContainer(window);
    window.draw(testBlocks2);
    window.display();
  }

  return 0;
}

如你所见Block现在继承自 sf::Drawable并且可以用 xxx.draw(block) 绘制。

BlockContainer现在有两个不同的函数来绘制它的内容(这只是为了演示目的,你只需要一个函数来绘制,这取决于你更喜欢什么)。如果想保留自己的绘图功能,可以去掉: public sf::Drawable来自 BlockContainer .

main()创建了两个 block 容器,其中一个 ( testBlocks ) 将使用 BlockContainer 绘制的 void drawContainer(sf::RenderWindow &window)从您的原始代码中绘制函数,另一个( testBlocks2 )使用 sf::Drawable的。

还要注意如何 &getContainer()现在返回对 block vector 的引用。如果您不返回引用,原始 vector 将不会受到您想从外部对其执行的任何操作的影响。

关于c++ - SFML C++ 绘制形状 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41943069/

相关文章:

xcode - 在 Visual Studio 2013 上使用 std::function<void>

c++ - 应用程序崩溃并同时运行

c++ - 如何将文件夹设置为 Xcode 中的全局包含,类似于 Visual Studio?

c++ - 在哪里可以找到有关 D_GLIBCXX_DEBUG 和 DNDEBUG 标志的更多信息?

c++ - 如何让纹理在 OpenGL 中工作?

c++ - 如何为生成艺术目的在单个缓冲区上绘制

c++ - MSXML DOM : Add namespace declaration to an existing node in a tree

c++ - 更新 OSX 命令行工具 6.3 后缺少 C++ header <__debug>

c++ - 当我尝试绘制 sf::Text 对象时 SFML 中的段错误

c++ - SFML - 将 RenderTexture 保存到图像 0xC0000005 时访问冲突读取位置