这是我在考虑封装和组合的情况下编写的代码示例:
class Bullet {
private:
Vector2 position;
Vector2 speed;
public:
void move(float time_delta) {
position += speed * time_delta;
}
};
基本上,只有一个弹丸在无处移动。然而,子弹实际上可以例如从墙上弹跳,其speed
发生显着变化。有没有考虑这种相互作用的好方法?我既不想让我Bullet
知道“高级”类(应该自己使用它),也不想写一个像这样的一次性解决方案:
template<typename F> void move(float time_delta, F collision_checker);
更新:如果你想缩小这个问题,值得一读。这是移动 s 的期望逻辑的简化示例Bullet
(我并不是指Bullet::move()
成员函数!)以及它们与其他实体的交互:
Vector2 destination = bullet.position + bullet.speed * time_delta;
if (std::optional<Creature> target = get_first_creature(bullet.position, destination)) {
// decrease Bullet::speed depending on the target (and calculate the damage)
} else if (std::optional<Wall> obstacle = get_first_wall(bullet.position, destination)) {
// calculate the ricochet changing Bullet::position and Bullet::speed
}
Creature
所有由注释表示的代码都应该使用和Wall
class
es的一些属性。