Closed Moon-404 closed 1 year ago
之前的事件实现方式可能会出现事件的漏判,为了解决这一问题,我使用 hook 的方式来进行事件的判定。
这种实现方式经过排山倒海小游戏的测试,性能消耗不大,且不会出现误判;此外合适的 hook 位置可以提供先前的事件系统无法做到的功能。
请参照同一个 commit 中的 pvzclass.cpp 文件。
首先,编写一个 listener 函数,返回类型与参数类型需要与事件类中的模板类型对应。例如:
class ZombieHitEvent : public BaseEvent<std::function< int(std::shared_ptr<PVZ::Zombie>, DamageType::DamageType, int)>>
代表 listener 的返回类型为 int,参数类型依次为 std::shared_ptr<PVZ::Zombie> DamageType::DamageType int。那么我们就可以编写这样一个 listener:
int
std::shared_ptr<PVZ::Zombie>
DamageType::DamageType
int listener(shared_ptr<PVZ::Zombie> zombie, DamageType::DamageType type, int amount) { cout << ZombieType::ToString(zombie->Type) << " 受到了 " << amount << " 点伤害,类型为 " << DamageType::ToString(type) << endl; return amount; }
返回值可以用来修改僵尸受到的伤害,不同事件可能会有各自独特的 listener 类型,具体还请参照各个事件类的说明。
然后,就可以用以下方式使用事件了:
ZombieHitEvent e; e.start(); e.addListener(listener); e.addListener(listener); e.removeListener(1); while (true) { e.run(); } e.end();
说明几个注意点:
请参照同一个 commit 中的 ZombieHitEvent 相关文件。
首先,确认 listener 的返回类型与参数类型,然后继承 BaseEvent 基类。
之后,实现以下三个方法:
HookEvents 说明
之前的事件实现方式可能会出现事件的漏判,为了解决这一问题,我使用 hook 的方式来进行事件的判定。
这种实现方式经过排山倒海小游戏的测试,性能消耗不大,且不会出现误判;此外合适的 hook 位置可以提供先前的事件系统无法做到的功能。
使用说明
请参照同一个 commit 中的 pvzclass.cpp 文件。
首先,编写一个 listener 函数,返回类型与参数类型需要与事件类中的模板类型对应。例如:
代表 listener 的返回类型为
int
,参数类型依次为std::shared_ptr<PVZ::Zombie>
DamageType::DamageType
int
。那么我们就可以编写这样一个 listener:返回值可以用来修改僵尸受到的伤害,不同事件可能会有各自独特的 listener 类型,具体还请参照各个事件类的说明。
然后,就可以用以下方式使用事件了:
说明几个注意点:
开发说明
请参照同一个 commit 中的 ZombieHitEvent 相关文件。
首先,确认 listener 的返回类型与参数类型,然后继承 BaseEvent 基类。
之后,实现以下三个方法: