游戏玩法初步实现

This commit is contained in:
kercylan98 2023-04-27 10:48:47 +08:00
parent b5a75220ff
commit 09268e00f7
2 changed files with 97 additions and 0 deletions

67
game/builtin/gameplay.go Normal file
View File

@ -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)
}
}

30
game/gameplay.go Normal file
View File

@ -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)
)