gpt4 book ai didi

c++ - SFML - 粒子系统 vector 超出范围

转载 作者:行者123 更新时间:2023-11-28 07:20:12 24 4
gpt4 key购买 nike

我正在使用 SFML 设计粒子系统。问题是游戏变慢了,而且我一直在获取 vector subscript out of range

这是我的代码:

    #pragma once
#include<SFML\Graphics.hpp>
#include"stdafx.h"

struct particle
{
sf::Vector2<float> pos;
sf::Vector2<float> vel;
sf::Color color;
};

class pengine

{
private:
std::list<particle*> hitspark;
std::list<particle*>::iterator it;
int size;
sf::Image img;
sf::Texture text;
sf::Sprite sp;
public:
pengine();
void fuel(sf::Vector2f);
void update();
void render(sf::RenderWindow &name);
void cleanup();
};
pengine::pengine()
{
img.create(with,heit,sf::Color::Transparent);
hitspark.clear();
text.create(with,heit);
sp.setTexture(text);
}
void pengine::fuel(sf::Vector2f v1)
{
for(int i=0;i<10;i++)
{
particle* p;
p->color=sf::Color(rand()%255,rand()%255,rand()%255);
p->pos=v1;
float r1 = (float)rand()/((float)RAND_MAX/6.238);
float r2 = (float)rand()/((float)RAND_MAX/6.238);
p->vel.x=cos(r1);
p->vel.y=cos(r2);
if(p->vel.x!=0.0f&&p->vel.y!=0.0f)
{
hitspark.push_back(p);
delete p;
continue;
}
else {
delete p;
continue;}
}
}
void pengine::update()
{
for(it=hitspark.begin();it!=hitspark.end();it++)
{
(*it)->pos.x+=(*it)->vel.x;
(*it)->pos.y+=(*it)->vel.y;
(*it)->vel.x-=0.005;
(*it)->vel.y-=0.005;
}
cleanup();
}
void pengine::cleanup()
{
for(std::list<particle*>::iterator t=hitspark.begin();t!=hitspark.end();t++)
{
if((*t)->vel.x==0.0f && (*t)->vel.y==0.0f)
{
std::list<particle*>::iterator it=hitspark.end() ;
it--;
std::swap(*t,*it);
delete (*it);
hitspark.pop_back();
}
if((*t)->pos.x<=0||(*t)->pos.x>=with||(*t)->pos.y<=0||(*t)->pos.y>=heit)
{
std::list<particle*>::iterator it=hitspark.end() ;
it--;
std::swap(*t,*it);
delete (*it);
hitspark.pop_back();
}

}
}
void pengine::render(sf::RenderWindow &name)
{
for(std::list<particle*>::iterator s=hitspark.begin();s!=hitspark.end();s++)
{
img.setPixel((int)((*s)->pos.x),(int)((*s)->pos.y),(*s)->color);
}
const sf::Uint8*piarray=img.getPixelsPtr();
text.update(piarray);
name.draw(sp);

}

最佳答案

particle* p;

应该是

particle* p = new particle();

另一个提示是

typedef std::list<particle*> Particles;

所以你可以使用 Particles::iterator。更干净一些。

最后我想说你做的事情都是错的。粒子系统应该具有恒定大小,如果你懒惰的话,可能有一个数组或一个 std::vector。不是带有指针的链表。

所以要么

std::vector<particle>

template<int MAX_PARTICLES>
class ParticleSystem
{ Particle particles[MAX_PARTICLES]; };

我希望你明白了,如果没有缓存未命中,它会快得多。我更喜欢后者,但可能只是我。

关于c++ - SFML - 粒子系统 vector 超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19611631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com