如何在C++中管理一个类的多个示例,给它们所有信息,然后删除它们?

z9smfwbn  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(93)

我为我的语言的不精确道歉,我对编程相当陌生。
假设我想在SFML中创建一个粒子效果。我目前的解决方案是创建我的粒子类的多个示例,然后使用类中的一个方法更新它们,每个帧将虚拟“相机”的更新位置作为输入,一次一个效果很好。不过,我一次制作几个有困难,因为在我目前的实现中,我必须手动创建每个粒子,然后在计数器达到足够高的值时覆盖每个粒子。我如何创建,更新,绘制,以及总体上,一次跟踪许多示例?这可能做到吗?或者我应该重新考虑我的实现?
我目前拥有的,用英语伪代码表示:

Create a particle object()
while true{

    Update the particle instance's position(given camera position)
    Draw the particle instance

}

我想做的(在伪代码中),但我不确定如何在C++中实现:

while true{

    Create a new particle object() // note: the particle objects already delete themselves after they have been updated a certain number of times, so creating new objects does not pose a threat to memory
    Update ALL particle instances' positions(given the camera's updated position)
    Draw ALL particle instances 

}

我在C++中有:

RenderWindow window(windowSize);
SmokeParticle smokeParticleInstance(cameraX, cameraY);
while true{

    window.draw(smokeParticleInstance.update(cameraX, cameraY)); // the update method returns a sprite object that the RenderWindow object knows how to draw

}
osh3o9ms

osh3o9ms1#

要同时创建、更新、绘制和跟踪多个粒子示例,可以使用vector或列表等容器来保存所有粒子对象。然后,在主循环中,可以遍历容器,更新每个粒子的位置,并将其绘制在屏幕上。

// create an empty vector to hold particle objects
std::vector<SmokeParticle> particles;

// add some initial particles to the vector
//This will add 10 particles to the vector
for (int i = 0; i < 10; i++) 
    particles.push_back(SmokeParticle());

while (window.isOpen()) {

    sf::Event event;
    ...

    ...

    //update all particles
    for (auto& particle : particles) {
        window.update(time.asSeconds());
    }

    window.clear();
    //draw all particles
    for (auto& particle : particles) {
        window.draw(particle.sprite);
    }

    // display the window
    window.display();
}

相关问题