在我开始之前,我会提前道歉,因为我可能犯过任何看似明显的错误。在这一点上我非常喜欢这里,这里可能有很多错误。 任何关于修复我所拥有的建议,或者更好的方法来设置我想要的东西都会受到赞赏。
我有两个类,Renderer和FParticle。
我想要的是FParticle构造函数将自己的指针传递给Renderer。渲染器将各种FParticle指针存储在一个向量中,然后在调用DrawObjects()时,它将使用指针列表绘制所有对象。
这样我就不必担心在游戏循环的每一步都将每个粒子传递到渲染器,而只需从指针列表中绘制它们。
问题是该程序是segfaulting,我无法弄清楚如何处理它。
段错误发生在renderer.cpp
中文件在这里:
renderer.h
#pragma once
#ifndef RENDERER_H
#define RENDERER_H
#include <SFML/Graphics.hpp>
#include <vector>
class FParticle;
class Renderer {
private:
std::vector<const FParticle*> object_buffer_;
sf::RectangleShape rectangle_;
public:
Renderer();
void addObject(const FParticle &object);
void drawObjects(sf::RenderWindow &window);
};
#endif // RENDERER_H
renderer.cpp
#include "renderer.h"
#include "fparticle.h"
#include <iostream>
Renderer::Renderer() {}
void Renderer::addObject(const FParticle &object)
{
object_buffer_.push_back(&object);
}
void Renderer::drawObjects(sf::RenderWindow &window)
{
for (int i = object_buffer_.size(); i > 0; i--)
{
rectangle_.setSize(object_buffer_[i]->get_size()); // <------- SEGFAULT HERE
rectangle_.setPosition(object_buffer_[i]->get_position());
rectangle_.setFillColor(sf::Color::White);
std::cout << object_buffer_[i]->get_size().x << std::endl;
window.draw(rectangle_);
}
}
fparticle.h
#pragma once
#ifndef FPARTICLE_H
#define FPARTICLE_H
#include <SFML/Graphics.hpp>
class Renderer;
class FParticle
{
protected:
sf::Vector2f size_;
sf::Vector2f position_;
sf::Vector2f velocity_;
sf::Vector2f acceleration_;
float inverse_mass_;
float damping_;
public:
FParticle(Renderer &picasso);
sf::Vector2f get_size() const;
sf::Vector2f get_position() const;
void set_mass();
void set_inverse_mass();
};
#endif // FPARTICLE_H
fparticle.cpp
#include "fparticle.h"
#include "renderer.h"
#include <iostream>
FParticle::FParticle(Renderer &picasso)
{
size_.x = 5.f;
size_.y = 5.f;
position_.x = 10.f;
position_.y = 10.f;
picasso.addObject(*this);
}
sf::Vector2f FParticle::get_size() const
{
return size_;
}
sf::Vector2f FParticle::get_position() const
{
return position_;
}
伪main.cpp
int main()
{
Renderer picasso;
FParticle p1(picasso);
while(gamestate != Exiting)
{
window.clear(Black);
picasso.drawObjects(window_);
window.display();
}
return 0
}
就像我说的那样,我相对而言,仍处于学习的早期阶段。任何有关任何建议或建议都表示赞赏。
答案 0 :(得分:1)
您的矢量只能从0 ... size-1索引。你从size
开始,因此超出范围,从而调用未定义的行为,因此(因为你实际上是幸运的)你的崩溃。
为您的收藏品使用迭代器。如果你想反过来,请使用反向迭代器。
for (auto it = object_buffer.rbegin(); it != object_buffer.rend(); ++it)
{
rectangle_.setSize((*it)->get_size());
rectangle_.setPosition((*it)->get_position());
rectangle_.setFillColor(sf::Color::White);
std::cout << (*it)->get_size().x << std::endl;
window.draw(rectangle_);
}
或者那种效果。
注意:如有疑问,请将vector / deque operator[i]
替换为obj.at(i)
访问者。后者是范围检查的,当你传递无效范围的索引时,它会通过断言向你发出警告。
祝你好运。