Я хотел бы создать простую структуру для метания и ловушки событий в игре. События могут быть такими, как Collision
, которые (в соответствии с типом) могут принимать несколько аргументов (обратите внимание, что каждый тип события может принимать другое количество аргументов, а не только два, как в примере).Основанный на событиях игровой движок, основанный на полиморфизме сущностей
Я бы хотел реализовать функции/классы/... для работы с Collision
, основанный на полиморфизме. Этот пример иллюстрирует проблему:
#include <iostream>
#include <vector>
class Entity {};
class Player: public Entity {};
class Bomb: public Entity {
public:
bool exploded;
};
class MineSweeper: public Entity {};
// For now, I only included Collisions, but I eventually want to extend it to
// more types of Events too (base class Event, Collision is derived class)
void onCollision(Player* p, Bomb* b) {
if (! b->exploded) {
std::cout << "BOOM";
b->exploded = true;
}
}
void onCollision(Entity* e, Entity* f) {
std::cout << "Unhandled collision\n";
}
// Possibility for Collision between Minesweeper and Bomb later
class Game {
public:
std::vector<Entity*> board; // some kind of linear board
Game() {
board = {new Player, new Bomb, new MineSweeper};
}
void main_loop() {
onCollision(board[0], board[1]); // player and bomb!
onCollision(board[1], board[2]);
}
};
int main() {
Game g;
g.main_loop();
}
Обратите внимание, что я прекрасно понимаю, почему этот код не работает, как задумано, я включил этот пример только для иллюстрации моей проблемы лучше.
В приведенном выше примере используются функции для событий, но я отлично разбираюсь в классах или любом другом поддерживаемом решении.
Надеюсь, что я хотел бы, чтобы C++ решал, какой обработчик события использовать на основе типов аргументов (предположительно во время выполнения).
Мой вопрос: как я могу это сделать на C++? Пример был бы оценен.
(не мой вопрос: исправить мой код пожалуйста)
Похоже, вы ищете форму «множественной отправки». – user2864740
В чем смысл 'b-> exploded = true'? –
@NeilKirk, ах забыл '!' там. – evertheylen