2017-01-30 89 views
0

我刚回到编码。试图做一个简单的突破游戏,我开始做一个简单的“乒乓”游戏,但发现它很容易,所以我试图将其扩展到一个突破游戏(图片附加为那些谁不知道它是什么)。SFML C++绘制形状矢量

要处理屏幕顶部的块,我使用了一个块向量,现在我正试图将它们绘制到屏幕上。我不能这样做,因为我得到了一个错误:

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; 
}; 

感谢您的帮助:)

回答

2

(我会hav E要放在这里,因为我没有足够的声誉尚未就此发表评论)

一些事情

  • 我不明白为什么你有这样的代码void Block::draw(Block block, sf::RenderWindow &window)。它应该是void Block::draw(sf::RenderWindow &window),然后就画block(这是一个类成员),或者如果你想从别的

  • 地方在任何情况下绘制块,Blocksf::Drawable继承并使用其功能,通过引用传递block画。我认为这就是错误信息所说的。例如class Block : public sf::Drawable { ... };,并且在您的.cpp中将绘制的函数为virtual void draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const;void draw(sf::RenderTarget &renderTarget, sf::RenderStates renderStates) const { renderTarget.draw(block); }。然后你可以遍历块的矢量你已经有了和绘制每块

  • 功能std::vector<Block> getContainer()应该返回到矢量(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); 
} 

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; 
} 

正如你可以看到现在Blocksf::Drawable继承并可以得出与xxx.d原始(块)。

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

main()两种嵌段容器创建,一个(testBlocks)将使用S BlockContainer“从原始代码中使用sf::Drawable小号void drawContainer(sf::RenderWindow &window)绘制函数,其他(testBlocks2)”绘制。

另请注意&getContainer()现在如何返回对块向量的引用。如果你没有返回一个参考,那么原始向量不会受到你想从外面做的任何事情的影响。

+0

好的我编辑了我的代码,包括sf :: Drawable。我添加了在.h和.cpp中绘制的函数。我无法弄清楚如何让它返回对矢量的引用,我现在将研究它。但是当我调用draw函数时。我实际上在参数中放置了什么?因为它需要(sf :: RenderTarget&renderTarget,sf :: RenderStates状态)被覆盖? –

+0

我已经想出了如何在没有整个'sf :: Drawable'的情况下做到这一点。所以我的旧功能很好,我只是犯了一些简单的错误(像平常一样)。谢谢你的回答tho :) –

+0

@ D.Morgan查看我编辑的例子代码 – user3881815