c++ - 为什么我的程序崩溃并给出“分段错误(核心转储)”,但前提是我有太多对象?
问题描述
我正在用 SFML 制作烟花节目。在我制作太多烟花(粒子)之前,它看起来不错并且有效。当烟花爆炸并产生粒子时,程序崩溃并给出“分段错误(核心转储)”错误。该程序在崩溃之前根本没有减速。当它发生时,总是有 1025 个粒子。烟花也是粒子。我认为它没有帮助,但我在 linux 上。
我的代码:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <cmath>
sf::RenderWindow window;
class Particle;
std::vector<Particle> particles;
float gravity = 0.5;
class Particle
{
public:
sf::Vector2f pos = sf::Vector2f(0, 0);
sf::Vector2f vel = sf::Vector2f(0, 0);
sf::Vector2f acc = sf::Vector2f(0, 0);
sf::CircleShape renderer = sf::CircleShape(2.5);
bool isRocket = false;
bool hasExploded = false;
int lifetime = 255;
Particle(sf::Vector2f position)
{
pos = position;
}
void ApplyForce(sf::Vector2f force)
{
acc += force;
}
void Update(int i)
{
if(!particles[i].isRocket)
{
vel.x *= 0.9;
vel.y *= 0.9;
lifetime -= 8;
renderer.setRadius(renderer.getRadius() - 0.2);
renderer.setFillColor(sf::Color(renderer.getFillColor().r, renderer.getFillColor().g, renderer.getFillColor().b, lifetime));
}
//Gravity
ApplyForce(sf::Vector2f(0, gravity));
vel += acc;
pos += vel;
acc.x = 0;
acc.y = 0;
if (particles[i].isRocket && !particles[i].hasExploded && particles[i].vel.y > 0)
{
particles[i].Explode(i);
}
if(lifetime < 0)
{
particles.erase(particles.begin() + i);
}
}
void Render()
{
renderer.setPosition(pos);
window.draw(renderer);
}
void Explode(int i)
{
particles[i].hasExploded = true;
sf::Color color = sf::Color(rand() % 255, rand() % 255, rand() % 255);
int explosionSize = rand() % 3 + 1;
for (int i = 0; i < explosionSize * 100; i++)
{
Particle fire(pos);
fire.renderer.setFillColor(sf::Color(color.r + (rand() % 32 - 16), color.g + (rand() % 32 - 16), color.b + (rand() % 32 - 16)));
fire.renderer.setRadius(rand() % 5 + 2);
particles.push_back(fire);
//color.r + (rand() % 32 - 16), color.g + (rand() % 32 - 16), color.b + (rand() % 32 - 16)
float angle = (float(rand())/float((RAND_MAX)) * 2 * M_PI);
float velocity = (float(rand())/float((RAND_MAX)) * 8 * explosionSize);
particles[particles.size() - 1].ApplyForce(sf::Vector2f(velocity * cos(angle), velocity * sin(angle)));
}
particles.erase(particles.begin() + i);
}
};
void sendRocket()
{
Particle firework(sf::Vector2f(rand() % window.getSize().x, window.getSize().y));
firework.isRocket = true;
particles.push_back(firework);
particles[particles.size() - 1].ApplyForce(sf::Vector2f(0, -((window.getSize().y * 0.025) + rand() % 8 - 4) ));
}
int main()
{
window.create(sf::VideoMode::getDesktopMode(), "Fireworks", sf::Style::Fullscreen);
window.setFramerateLimit(60);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
window.close();
}
}
if(rand() % 10 == 0)
{
sendRocket();
}
std::cout<<particles.size()<<std::endl;
for (int i = 0; i < particles.size(); i++)
{
particles[i].Update(i);
}
window.clear(sf::Color::Black);
for (int i = 0; i < particles.size(); i++)
{
particles[i].Render();
}
window.display();
}
return 0;
}
我不是超级擅长编程,所以任何其他提示也将不胜感激。
解决方案
推荐阅读
- python - Python RandomForest 分类器(如何测试它)
- ruby-on-rails - 地理编码器给出证书验证失败错误
- bash - Bash - 从打印的 ls 创建一个变量
- php - 如何使用 number_format 从价格中删除小数
- python - Pandas 创建时间序列并将其提取到新数据帧
- php - 我可以忽略模拟方法中的参数类型检查吗?
- node.js - 字符串列表变量“$_v0_data”的突变得到无效值Graphql Node.js
- python - AWS、Ansible 和 Terraform 的关键问题
- javascript - 单击分页按钮并滚动顶部仅第一次工作(数据表)
- c# - 如何从 C# 上的 DataGrid 更新 MySql 数据库?