虚拟方法和覆盖
Virtual methods and overriding
我在做什么?
我正在尝试为我正在开发的游戏做一些基本的继承。这个想法是拥有一个玩家将从中继承的基础实体 class。实体 class 有一个虚拟更新或思考方法,每个 child 都会覆盖它以满足它的需要。
这是引擎处理更新循环的方式:
void Engine::update() {
for (Entity entity : entities) {
entity.update(deltaTime);
}
}
代码:
Entity.hpp
#pragma once
#include "Position.hpp"
#include "AssetManager.hpp"
#include "Logger.hpp"
#define SPATIAL 1
#define VISUAL 1 << 1
class Entity {
public:
Entity(Position *position, const char *visualPath);
int flags;
const char *visualPath;
Position position;
virtual void update(float deltaTime);
};
Entity.cpp
#include "Entity.hpp"
Entity::Entity(Position *position, const char *visualPath) {
flags = 0;
if (position) {
flags |= SPATIAL;
this->position = *position;
}
if (visualPath) {
flags |= VISUAL;
this->visualPath = visualPath;
}
}
void Entity::update(float deltaTime){
Logger::log("No update method");
};
Player.hpp
#pragma once
#include "../Entity.hpp"
#include "../Logger.hpp"
class Player : public Entity {
public:
Player();
void update(float deltaTime) override;
};
Player.cpp
#include "Player.hpp"
Player::Player() : Entity(new Position(0, 0), "assets/player.png") {}
void Player::update(float deltaTime) {
this->position.x += 10;
Logger::log("Player says hi");
}
有什么问题?
即使我在 Player
中覆盖了 Entity
上的更新方法,Player
仍然打印 “无更新方法”。覆盖似乎没有做任何事情。
改变这个:
void Engine::update() {
for (Entity entity : entities) {
entity.update(deltaTime);
}
}
为此:
void Engine::update() {
for (Entity& entity : entities) {
entity.update(deltaTime);
}
}
在最初的实现中,您的 for
循环对实体中的项目进行 复制。您可能不希望这样,但更重要的是,entity
只是基础 class 的副本,因此派生的 class 信息会丢失。通过引用传递以避免此问题和其他错误。
我在做什么?
我正在尝试为我正在开发的游戏做一些基本的继承。这个想法是拥有一个玩家将从中继承的基础实体 class。实体 class 有一个虚拟更新或思考方法,每个 child 都会覆盖它以满足它的需要。
这是引擎处理更新循环的方式:
void Engine::update() {
for (Entity entity : entities) {
entity.update(deltaTime);
}
}
代码:
Entity.hpp
#pragma once
#include "Position.hpp"
#include "AssetManager.hpp"
#include "Logger.hpp"
#define SPATIAL 1
#define VISUAL 1 << 1
class Entity {
public:
Entity(Position *position, const char *visualPath);
int flags;
const char *visualPath;
Position position;
virtual void update(float deltaTime);
};
Entity.cpp
#include "Entity.hpp"
Entity::Entity(Position *position, const char *visualPath) {
flags = 0;
if (position) {
flags |= SPATIAL;
this->position = *position;
}
if (visualPath) {
flags |= VISUAL;
this->visualPath = visualPath;
}
}
void Entity::update(float deltaTime){
Logger::log("No update method");
};
Player.hpp
#pragma once
#include "../Entity.hpp"
#include "../Logger.hpp"
class Player : public Entity {
public:
Player();
void update(float deltaTime) override;
};
Player.cpp
#include "Player.hpp"
Player::Player() : Entity(new Position(0, 0), "assets/player.png") {}
void Player::update(float deltaTime) {
this->position.x += 10;
Logger::log("Player says hi");
}
有什么问题?
即使我在 Player
中覆盖了 Entity
上的更新方法,Player
仍然打印 “无更新方法”。覆盖似乎没有做任何事情。
改变这个:
void Engine::update() {
for (Entity entity : entities) {
entity.update(deltaTime);
}
}
为此:
void Engine::update() {
for (Entity& entity : entities) {
entity.update(deltaTime);
}
}
在最初的实现中,您的 for
循环对实体中的项目进行 复制。您可能不希望这样,但更重要的是,entity
只是基础 class 的副本,因此派生的 class 信息会丢失。通过引用传递以避免此问题和其他错误。