移除face_system
This commit is contained in:
parent
4f1cd84ef4
commit
84fc264d62
@ -1,102 +0,0 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/yohamta/donburi/filter"
|
||||
"joylink.club/ecs"
|
||||
"joylink.club/rtsssimulation/components"
|
||||
)
|
||||
|
||||
// 外界与world交互请求定义
|
||||
type FaceRequest func(w ecs.World) any
|
||||
type faceOutcome struct {
|
||||
outcome any
|
||||
ok bool
|
||||
}
|
||||
|
||||
// 外界与world的交互
|
||||
type FaceSystem struct {
|
||||
req chan FaceRequest
|
||||
rsp chan *faceOutcome
|
||||
world ecs.World
|
||||
//保证与world的交互串行
|
||||
locker *sync.Mutex
|
||||
}
|
||||
|
||||
func NewFaceSystem(w ecs.World) *FaceSystem {
|
||||
return &FaceSystem{req: make(chan FaceRequest), rsp: make(chan *faceOutcome), locker: &sync.Mutex{}, world: w}
|
||||
}
|
||||
|
||||
// world 执行
|
||||
func (me *FaceSystem) Update(world ecs.World) {
|
||||
select {
|
||||
case reqFunc := <-me.req:
|
||||
{
|
||||
response := reqFunc(world)
|
||||
if nil != response {
|
||||
me.rsp <- &faceOutcome{outcome: response, ok: true}
|
||||
} else {
|
||||
me.rsp <- &faceOutcome{outcome: nil, ok: false}
|
||||
}
|
||||
}
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
// 外界调用此方法与world交互
|
||||
func (me *FaceSystem) Call(request FaceRequest) (any, bool) {
|
||||
if !me.world.Running() {
|
||||
return nil, false
|
||||
}
|
||||
//
|
||||
me.locker.Lock()
|
||||
defer me.locker.Unlock()
|
||||
//
|
||||
me.req <- request
|
||||
//
|
||||
result := <-me.rsp
|
||||
return result.outcome, result.ok
|
||||
}
|
||||
|
||||
// 根据id获取实体
|
||||
func (me *FaceSystem) FindEntity(id string) *ecs.Entry {
|
||||
return FindEntityById(me.world, id)
|
||||
}
|
||||
|
||||
// 获取world当前时间
|
||||
func (me *FaceSystem) WorldTime() *time.Time {
|
||||
now, ok := me.Call(func(w ecs.World) any {
|
||||
return GetWorldNow(w)
|
||||
})
|
||||
if ok {
|
||||
return now.(*time.Time)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
func FindEntityById(world ecs.World, id string) *ecs.Entry {
|
||||
query := ecs.NewQuery(filter.Contains(components.DeviceIdentityComponent))
|
||||
return QueryEntityById(world, query, id)
|
||||
}
|
||||
func QueryEntityById(world ecs.World, q *ecs.Query, id string) *ecs.Entry {
|
||||
var entry *ecs.Entry = nil
|
||||
func() {
|
||||
defer simpleRecover()
|
||||
q.Each(world, func(e *ecs.Entry) {
|
||||
if id == components.DeviceIdentityComponent.Get(e).Id {
|
||||
entry = e
|
||||
panic(fmt.Sprintf("找到实体[%s],结束查找", id))
|
||||
}
|
||||
})
|
||||
}()
|
||||
//
|
||||
return entry
|
||||
}
|
||||
|
||||
// 捕获panic并恢复执行
|
||||
func simpleRecover() {
|
||||
recover()
|
||||
}
|
33
system/system.go
Normal file
33
system/system.go
Normal file
@ -0,0 +1,33 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/yohamta/donburi/filter"
|
||||
"joylink.club/ecs"
|
||||
"joylink.club/rtsssimulation/components"
|
||||
)
|
||||
|
||||
func FindEntityById(world ecs.World, id string) *ecs.Entry {
|
||||
query := ecs.NewQuery(filter.Contains(components.DeviceIdentityComponent))
|
||||
return QueryEntityById(world, query, id)
|
||||
}
|
||||
func QueryEntityById(world ecs.World, q *ecs.Query, id string) *ecs.Entry {
|
||||
var entry *ecs.Entry = nil
|
||||
func() {
|
||||
defer simpleRecover()
|
||||
q.Each(world, func(e *ecs.Entry) {
|
||||
if id == components.DeviceIdentityComponent.Get(e).Id {
|
||||
entry = e
|
||||
panic(fmt.Sprintf("找到实体[%s],结束查找", id))
|
||||
}
|
||||
})
|
||||
}()
|
||||
//
|
||||
return entry
|
||||
}
|
||||
|
||||
// 捕获panic并恢复执行
|
||||
func simpleRecover() {
|
||||
recover()
|
||||
}
|
Loading…
Reference in New Issue
Block a user