C++ 结构成员不在函数中更新
C++ Struct Members not Updating in Funtion
首先,虽然我不是编程新手,但我是 C++ 的新手,所以请多多包涵。
我正在使用 Raylib 库尝试为游戏制作粒子系统。
它由一个具有一些私有成员和 public 函数的结构组成:
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();
所以,我的问题是: 虽然在按下鼠标左键并绘制时按预期实例化了粒子,但由于某种原因 它们的位置没有被显示由他们的速度更新。我已经尝试将调试信息打印到控制台,例如速度,这是预期的结果,但是由于某些我不知道的原因(可能只是我太蠢了)他们的位置没有更新。
如有任何帮助,我们将不胜感激。
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];
}
它与范围 for 循环没什么特别的关系。
首先,虽然我不是编程新手,但我是 C++ 的新手,所以请多多包涵。 我正在使用 Raylib 库尝试为游戏制作粒子系统。
它由一个具有一些私有成员和 public 函数的结构组成:
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();
所以,我的问题是: 虽然在按下鼠标左键并绘制时按预期实例化了粒子,但由于某种原因 它们的位置没有被显示由他们的速度更新。我已经尝试将调试信息打印到控制台,例如速度,这是预期的结果,但是由于某些我不知道的原因(可能只是我太蠢了)他们的位置没有更新。
如有任何帮助,我们将不胜感激。
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];
}
它与范围 for 循环没什么特别的关系。