Вот пример кода, который я написал с учетом инкапсуляции и композиции:
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);
UPDATE: стоит прочитать, если вы хотите сузить этот вопрос. Вот упрощенный пример желаемых logi c для перемещения Bullet
s (я не имею в виду функцию-член 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.