类变量在游戏循环中只更新一次



我在更新游戏循环的每一帧上的类变量的值时遇到了问题。

我使用wxWidgets创建一个跨平台窗口,用于图形和游戏循环。这是我的主要Window类,它实现了渲染和游戏循环。

#include <wx/wx.h>
#include "window.h"
#include "../entity/entity.h"
#include "../../configuration.h"
Window::Window(const wxString & title, const wxPoint & position, const wxSize & size): wxFrame(nullptr, wxID_ANY, title, position, size) {
timer = new wxTimer(this, 1);
Entity entity((width / 2) - 50, 100, 100, 100, wxColour(255, 0, 0));
AddEntity(entity);
Connect(wxEVT_PAINT, wxPaintEventHandler(Window::OnPaint));
Connect(wxEVT_TIMER, wxCommandEventHandler(Window::OnTimer));
Start();
}
void Window::Render(wxPaintEvent & event) {
wxPaintDC dc(this);
for (Entity entity : entities) {
entity.Render(dc);
}
}
void Window::Update(wxCommandEvent & event) {
for (Entity entity : entities) {
entity.Update();
}
}
void Window::AddEntity(Entity & entity) {
entities.push_back(entity);
}
void Window::OnTimer(wxCommandEvent & event) {
Update(event);
}
void Window::OnPaint(wxPaintEvent & event) {
Render(event);
}
void Window::Start() {
isStarted = true;
timer->Start(10);
}
void Window::Stop() {
isPaused = !isPaused;
if (isPaused) {
timer->Stop();
} else {
timer->Start(10);
}
}

这里是Entity类,它表示可以绘制在窗口上的矩形。

#include <wx/wx.h>
#include <stdlib.h>
#include "entity.h"
#include "../gravity/gravity.h"
Entity::Entity(int _x, int _y, int _width, int _height, wxColour _color) : x( _x ), y( _y ), width( _width ), height( _height ), color( _color ) {

}
void Entity::Render(wxPaintDC & dc) {
wxPen pen(color);
dc.SetPen(pen);
dc.DrawLine(x, y, x + width, y);
dc.DrawLine(x, y + height, x + width, y + height);
dc.DrawLine(x, y, x, y + height);
dc.DrawLine(x + width, y, x + width, y + height);
}
void Entity::Update() {
y += 1;
std::cout << y << std::endl;
}

在每次调用Entity::Update()方法时,我都希望增加y的位置并重新发送实体。然而,y的值只增加一次,并且在应用程序的剩余生命周期中保持不变,我似乎不明白为什么。我将感谢任何帮助。

当您像这样循环entities时(在Window::RenderWindow::Update中):

for (Entity entity : entities) {

在每次迭代中,CCD_ 9将获得CCD_。

为了通过参考对您的实际entities进行操作,您需要将其更改为:

//----------v---------------------
for (Entity & entity : entities) {

另一种选择是使用auto &(auto本身包括"引用性",因此将再次强制执行代码中的副本):

//---vvvvvv---------------------
for (auto & entity : entities) {

请注意,即使您只从元素中读取数据(而不修改它),也可以将循环更改为使用const &来保存副本。

最新更新