2017-01-30 15 views
0

私はちょうどコーディングに戻りました。シンプルなブレイクアウトゲームをしようとすると、簡単な「ポン」ゲームを始めましたが、それはかなり簡単なので、ブレークアウトゲーム(それが分からない人のために添付された画像)に展開しようとしています。SFML C++は図形のベクトルを描画します

画面の上部にあるブロックを処理するために、私はブロックのベクトルを使用しました。ブロックのベクトルを使用しています。ここから、それらを画面に描画しようとしています。私はエラーを取得していますと、これを行うことができません:ここでblock.cppファイル内

ある

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::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

(I'll hav私はコメントすることはまだ十分な評判を持っていないので、ここでそれを置くためのe)の

いくつかのもの

  • あなたはこのコードvoid Block::draw(Block block, sf::RenderWindow &window)を持っている理由私は理解していません。それはvoid Block::draw(sf::RenderWindow &window)なり、その後、ちょうどあなたがどのような場合にはどこか別の場所から

  • をブロックを描きたい場合は、Blocksf::Drawableから継承するとし、その機能を使用する必要がありますblockを描く(クラスメンバーである)OR参照によってblockを渡す必要がありますドロー。私はそれがエラーメッセージが言っているものだと思う。たとえば、class Block : public sf::Drawable { ... };と描画する関数は、ヘッダに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()

  • への参照を返す必要があり、各ブロック

  • 機能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; 
} 

あなたはBlockが今sf::Drawableから継承して描画することができます見ることができるようにxxx.d生(ブロック)。

BlockContainerには、その内容を描画する2つの異なる関数があります(これは目的を示すためのもので、好きなものに応じて描画する関数が1つ必要です)。独自の描画機能を維持したい場合は: public sf::DrawableBlockContainerから削除することができます。

main() 2ブロックコンテナは1(testBlocksは)■BlockContainersf::Drawable使用して、元のコードからのvoid drawContainer(sf::RenderWindow &window)描画機能、その他(testBlocks2」)を使用して描画されます、作成されます。

&getContainer()がブロックのベクトルへの参照を返す方法にも注意してください。参照を返さないと、元のベクトルは外部から何をしたいかによって影響を受けません。

+0

大丈夫sf :: Drawableをインクルードするようにコードを編集しました。 .hと.cppの両方を描画する関数を追加しました。私はそれがベクトルへの参照を返す方法を理解できません、私は今それを調べます。しかし、私は描画関数を呼び出すとき。私は実際にパラメータに何を入れますか?それが必要なので(sf :: RenderTarget&renderTarget、sf :: RenderStatesの状態)はカバーされますか? –

+0

私は「sf :: Drawable」というものを使わずにそれを行う方法を考え出しました。だから私の古い機能はうまくいきました。ちょっとした間違いをしました(普通のように)。回答ありがとうございました:) –

+0

@ D.Morgan例コードの編集を参照してください – user3881815

関連する問題