(Я буду 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
редактировать (относительно ваших ответов ниже):
Я сделал быстрый проект, который использует большую часть вашего кода.
(Также не забудьте прочитать мои примечания ниже код)
Вот картина того, что она выглядит как скомпилирован:

Код:
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()
теперь возвращает ссылку на вектор блоков. Если вы не вернете ссылку, исходный вектор не будет зависеть от того, что вы хотите сделать с ним извне.
ОК Я отредактировал свой код, чтобы включить sf :: Drawable. Я добавил функцию для рисования как .h, так и .cpp. Я не могу понять, как заставить его вернуть ссылку на вектор, я сейчас рассмотрю это. Но когда я вызываю функцию draw. Что я действительно вставляю в параметры? как это требует (sf :: RenderTarget & renderTarget, sf :: RenderStates состояния), которые должны быть покрыты? –
Я выяснил, как это сделать без всякой «sf :: Drawable». Поэтому мои старые функции были прекрасны, я просто сделал несколько простых ошибок (как обычно). Спасибо за ответ tho :) –
@ D.Morgan См. Мое редактирование, например, код – user3881815