-2

首先,虽然我对编程并不陌生,但我对 C++ 很陌生,所以请多多包涵。我正在使用Raylib库尝试为游戏制作粒子系统。

这由一个带有一些私有成员和公共函数的结构组成:

struct Particle {

Particle() {
    mPosVector = {(float)GetMouseX(), (float)GetMouseY()};
    mVelVector = {(float)GetRandomValue(15, 70)/100, (float)GetRandomValue(15, 70)/100};
    mSize = GetRandomValue(5, 15);
}

void update(double deltaTime) {
    mPosVector.x += mVelVector.x;
    mPosVector.y += mVelVector.y;
}

void draw() {
    DrawRectangleV(mPosVector, {(float)mSize, (float)mSize}, WHITE);
}

private:
    Vector2 mPosVector;
    Vector2 mVelVector;
    int mSize;
};

Vector2 类型由 Raylib 定义:

struct Vector2 {
    float x;
    float y;
};

在我的主要功能中,我有一个 std::vector 存储粒子。按下鼠标左键时会添加一个粒子。我循环遍历粒子矢量两次,一次用于根据速度更新位置,一次用于绘图。我最初是在一个循环中做这两个,但仍然遇到我将要解决的问题,所以尝试了这种方式。这是当前代码:

std::vector<Particle> particles = {Particle()};

while (!WindowShouldClose()) {

    deltaTime = GetFrameTime();

    if (IsMouseButtonDown(0)) {
        particles.push_back(Particle());
    }

    for (Particle part : particles) {
        part.update(deltaTime);
    }

    BeginDrawing();

        ClearBackground(BLACK);

        DrawFPS(10, 10);

        DrawText((numToString<double>(deltaTime*1000).substr(0, 5) + "ms").c_str(), 10, 40, 20, WHITE);

        for (Particle part : particles) {
            part.draw();
        }

    EndDrawing();

所以,我的问题:虽然粒子在按下鼠标左键并被绘制时按预期被实例化,但由于某种原因,它们的位置没有被它们的速度更新。我已经尝试将调试信息打印到控制台,例如速度,这是预期的,但由于某些未知的原因(可能只是我很愚蠢),他们的位置没有被更新。

任何帮助将不胜感激。

4

1 回答 1

2
   for (Particle part : particles) {
        part.update(deltaTime);
    }

这是制作每个条目的副本,你需要

   for (Particle &part : particles) {
        part.update(deltaTime);
    }

获取对向量中对象的引用以将其更新到位

要理解,认为 ranged for 只是这个的简写

for(int i = 0; i < particles.size(); i++)
{
     // this line copies the value
     particle p = particles[i];
}

而其中有 & 的那个

for(int i = 0; i < particles.size9); i++)
{
     // this line gets a reference to the ith entry
     particle &p = particles[i];
}

它与 ranged for 循环没有什么特别的关系。

于 2022-02-08T01:20:55.027 回答