在开始之前,我将为可能犯的任何看似明显的错误提前道歉。这时我很忙,这里可能有很多错误。
任何有关修复我所拥有的建议或设置我所需的更好方法的建议都将受到赞赏。

我有两个类,Renderer和FParticle。

我想要的是让FParticle构造函数将自身的指针传递给Renderer。渲染器会将各种FParticle指针存储在一个 vector 中,然后在调用DrawObjects()时,它将使用指针列表绘制所有对象。

这样,我不必担心在游戏循环的每个步骤中将每个粒子传递到渲染器中,而只需从指针列表中绘制它们即可。

问题在于该程序存在段错误,我不知道该如何处理。

段错误发生在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
}

就像我说过的那样,我的头脑相对较轻,仍然处于学习的早期阶段。任何建议或意见的任何事物,表示赞赏。

最佳答案

您的 vector 只能从0 ... size-1索引。您从size开始,因此超出范围,因此调用了 undefined 的行为,因此(因为您确实很幸运)崩溃了。

为您的集合使用迭代器。如果您想要反向操作,请使用反向迭代器。

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_);
}

或类似的东西。

注意:如有疑问,请使用operator[i]访问器代替vector / deque obj.at(i)用法。后者经过范围检查,当您传递无效范围索引时,将通过断言对您咆哮。

祝你好运。

09-30 13:37