渲染器和对象之间的C ++ SFML Segfault

时间:2015-01-26 06:33:01

标签: c++ pointers segmentation-fault sfml

在我开始之前,我会提前道歉,因为我可能犯过任何看似明显的错误。在这一点上我非常喜欢这里,这里可能有很多错误。 任何关于修复我所拥有的建议,或者更好的方法来设置我想要的东西都会受到赞赏。

我有两个类,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
}

就像我说的那样,我相对而言,仍处于学习的早期阶段。任何有关任何建议或建议都表示赞赏。

1 个答案:

答案 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)访问者。后者是范围检查的,当你传递无效范围的索引时,它会通过断言向你发出警告。

祝你好运。