2017-01-30 5 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 е поставить его здесь, потому что не хватает репутации еще комментарий)

некоторые вещи

  • я не понимаю, почему у вас есть этот код void Block::draw(Block block, sf::RenderWindow &window). Она должна быть void Block::draw(sf::RenderWindow &window), а затем просто нарисовать 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. После этого вы можете перебрать вектор блоков у вас уже есть и рисовать каждый блок

  • функция 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 теперь имеет две различные функции для рисования его содержимого (это только для демонстрации целей, вам нужна только одна функция для рисования в зависимости от того, что вам больше нравится). Если вы хотите сохранить свою собственную функцию рисования, вы можете удалить : public sf::Drawable от BlockContainer.

В main() два блок контейнеры созданы, один (testBlocks) будет нарисованы с использованием BlockContainer «s void drawContainer(sf::RenderWindow &window) раздаточной функции из исходного кода, а другие (testBlocks2) с помощью sf::Drawable» с.

Также обратите внимание, как &getContainer() теперь возвращает ссылку на вектор блоков. Если вы не вернете ссылку, исходный вектор не будет зависеть от того, что вы хотите сделать с ним извне.

+0

ОК Я отредактировал свой код, чтобы включить sf :: Drawable. Я добавил функцию для рисования как .h, так и .cpp. Я не могу понять, как заставить его вернуть ссылку на вектор, я сейчас рассмотрю это. Но когда я вызываю функцию draw. Что я действительно вставляю в параметры? как это требует (sf :: RenderTarget & renderTarget, sf :: RenderStates состояния), которые должны быть покрыты? –

+0

Я выяснил, как это сделать без всякой «sf :: Drawable». Поэтому мои старые функции были прекрасны, я просто сделал несколько простых ошибок (как обычно). Спасибо за ответ tho :) –

+0

@ D.Morgan См. Мое редактирование, например, код – user3881815