From 09268e00f72c845f41ca3227a61526fc89b6b969 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Thu, 27 Apr 2023 10:48:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=B8=E6=88=8F=E7=8E=A9=E6=B3=95=E5=88=9D?= =?UTF-8?q?=E6=AD=A5=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/builtin/gameplay.go | 67 ++++++++++++++++++++++++++++++++++++++++ game/gameplay.go | 30 ++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 game/builtin/gameplay.go create mode 100644 game/gameplay.go diff --git a/game/builtin/gameplay.go b/game/builtin/gameplay.go new file mode 100644 index 0000000..3329467 --- /dev/null +++ b/game/builtin/gameplay.go @@ -0,0 +1,67 @@ +package builtin + +import ( + "minotaur/game" + "minotaur/utils/offset" + "time" +) + +func NewGameplay() *Gameplay { + return &Gameplay{ + Time: offset.NewTime(0), + } +} + +type Gameplay struct { + *offset.Time + startTime time.Time + + gameplayStartEventHandles []game.GameplayStartEventHandle + gameplayTimeChangeEventHandles []game.GameplayTimeChangeEventHandle +} + +func (slf *Gameplay) GameStart(handle func() error) error { + if err := handle(); err != nil { + return err + } + slf.startTime = slf.Time.Now() + slf.OnGameplayStartEvent() + return nil +} + +func (slf *Gameplay) GetTime() *offset.Time { + return slf.Time +} + +func (slf *Gameplay) GetCurrentTime() time.Time { + return slf.Time.Now() +} + +func (slf *Gameplay) SetTimeOffset(offset time.Duration) { + slf.Time.SetOffset(offset) + slf.OnGameplayTimeChangeEvent() +} + +func (slf *Gameplay) RegGameplayStartEvent(handle game.GameplayStartEventHandle) { + slf.gameplayStartEventHandles = append(slf.gameplayStartEventHandles, handle) +} + +func (slf *Gameplay) OnGameplayStartEvent() { + for _, handle := range slf.gameplayStartEventHandles { + handle(slf.startTime) + } +} + +func (slf *Gameplay) RegGameplayTimeChangeEvent(handle game.GameplayTimeChangeEventHandle) { + slf.gameplayTimeChangeEventHandles = append(slf.gameplayTimeChangeEventHandles, handle) +} + +func (slf *Gameplay) OnGameplayTimeChangeEvent() { + if len(slf.gameplayTimeChangeEventHandles) == 0 { + return + } + current := slf.Time.Now() + for _, handle := range slf.gameplayTimeChangeEventHandles { + handle(current) + } +} diff --git a/game/gameplay.go b/game/gameplay.go new file mode 100644 index 0000000..7d04559 --- /dev/null +++ b/game/gameplay.go @@ -0,0 +1,30 @@ +package game + +import ( + "minotaur/utils/offset" + "time" +) + +// Gameplay 游戏玩法 +type Gameplay interface { + // GameStart 游戏玩法开始 + GameStart(handle func() error) error + // GetTime 获取游戏玩法的时间偏移 + GetTime() *offset.Time + // GetCurrentTime 获取玩法当前存在偏移的时间 + GetCurrentTime() time.Time + // SetTimeOffset 设置玩法时间偏移 + SetTimeOffset(offset time.Duration) + + // RegGameplayStartEvent 在游戏玩法开始时将立即执行被注册的事件处理函数 + RegGameplayStartEvent(handle GameplayStartEventHandle) + OnGameplayStartEvent() + // RegGameplayTimeChangeEvent 游戏玩法的时间被改变(非自然流逝)时将立刻执行被注册的事件处理函数 + RegGameplayTimeChangeEvent(handle GameplayTimeChangeEventHandle) + OnGameplayTimeChangeEvent() +} + +type ( + GameplayStartEventHandle func(startTime time.Time) + GameplayTimeChangeEventHandle func(current time.Time) +)