SFML C++ 绘制形状向量
SFML C++ drawing a vector of shapes
我刚刚重新开始编码。尝试制作一个简单的闯关游戏,我确实开始只是制作一个简单的 'pong' 游戏,但发现它很容易,所以我试图将其扩展为一个闯关游戏(为那些不知道它是什么的人附上图片).
为了处理屏幕顶部的方块,我使用了方块向量,现在我正试图从中将它们绘制到屏幕上。我无法执行此操作,因为出现错误:
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);
}
blockContainer.cpp
#pragma once
class ContainerOfBlocks
{
public:
ContainerOfBlocks(int useless);
~ContainerOfBlocks();
std::vector<Block> getContainer();
void drawContainer(sf::RenderWindow& window);
private:
std::vector<Block> blockContainer;
};
blockContainer.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 成员)或者如果你想从其他地方绘制块 [=41] 通过引用传递 block
=]
无论如何,Block
应该继承自sf::Drawable
,使用它的功能来绘制。我认为这就是错误消息所说的内容。例如 class Block : public sf::Drawable { ... };
并且要绘制的函数在 header 中为 virtual void draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const;
,在您的 .cpp 中为 void draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const { renderTarget.draw(block); }
。然后你可以迭代你已经拥有的块向量并绘制每个块
函数 std::vector<Block> getContainer()
应该 return 对向量 (std::vector<Block> &getContainer()
)
的引用
这不是错误,但我更喜欢使用 #ifndef ... #define... #endif
header guard 而不是 #pragma once
编辑(关于您在下面的回复):
我做了一个快速项目,其中使用了您的大部分代码。
(同时请务必阅读我在代码下方的注释)
这是一张编译后的图片:
代码:
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);
}
blockContainer.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
blockContainer.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]);
}
}
main.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(方块)绘制。
BlockContainer
现在有两个不同的函数来绘制它的内容(这只是为了演示目的,你只需要一个函数来绘制就看你喜欢什么了)。如果想保留自己的画图功能,可以去掉BlockContainer
中的: public sf::Drawable
。
在 main()
中创建了两个块容器,一个 (testBlocks
) 将使用 BlockContainer
的 void drawContainer(sf::RenderWindow &window)
绘制函数从您的原始代码绘制,另一个(testBlocks2
) 使用 sf::Drawable
。
还要注意 &getContainer()
现在如何 return 引用块向量。如果您不 return 引用原始向量,则无论您想从外部对其进行何种操作都不会影响它。
我刚刚重新开始编码。尝试制作一个简单的闯关游戏,我确实开始只是制作一个简单的 'pong' 游戏,但发现它很容易,所以我试图将其扩展为一个闯关游戏(为那些不知道它是什么的人附上图片).
为了处理屏幕顶部的方块,我使用了方块向量,现在我正试图从中将它们绘制到屏幕上。我无法执行此操作,因为出现错误:
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);
}
blockContainer.cpp
#pragma once
class ContainerOfBlocks
{
public:
ContainerOfBlocks(int useless);
~ContainerOfBlocks();
std::vector<Block> getContainer();
void drawContainer(sf::RenderWindow& window);
private:
std::vector<Block> blockContainer;
};
blockContainer.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 成员)或者如果你想从其他地方绘制块 [=41] 通过引用传递block
=]无论如何,
Block
应该继承自sf::Drawable
,使用它的功能来绘制。我认为这就是错误消息所说的内容。例如class Block : public sf::Drawable { ... };
并且要绘制的函数在 header 中为virtual void draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const;
,在您的 .cpp 中为void draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const { renderTarget.draw(block); }
。然后你可以迭代你已经拥有的块向量并绘制每个块函数
std::vector<Block> getContainer()
应该 return 对向量 (std::vector<Block> &getContainer()
) 的引用
这不是错误,但我更喜欢使用
#ifndef ... #define... #endif
header guard 而不是#pragma once
编辑(关于您在下面的回复):
我做了一个快速项目,其中使用了您的大部分代码。
(同时请务必阅读我在代码下方的注释)
这是一张编译后的图片:
代码:
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);
}
blockContainer.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
blockContainer.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]);
}
}
main.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(方块)绘制。
BlockContainer
现在有两个不同的函数来绘制它的内容(这只是为了演示目的,你只需要一个函数来绘制就看你喜欢什么了)。如果想保留自己的画图功能,可以去掉BlockContainer
中的: public sf::Drawable
。
在 main()
中创建了两个块容器,一个 (testBlocks
) 将使用 BlockContainer
的 void drawContainer(sf::RenderWindow &window)
绘制函数从您的原始代码绘制,另一个(testBlocks2
) 使用 sf::Drawable
。
还要注意 &getContainer()
现在如何 return 引用块向量。如果您不 return 引用原始向量,则无论您想从外部对其进行何种操作都不会影响它。