73 lines
1.2 KiB
Go
73 lines
1.2 KiB
Go
package lib
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type IScene interface {
|
|
Run(robot IRobot) error
|
|
Info() SceneInfo
|
|
}
|
|
|
|
type scene struct {
|
|
ai *MyAI
|
|
Name string
|
|
Desc string
|
|
callerQueue *Queue[ICaller] //确定运行的caller队列
|
|
|
|
status uint32 //场景状态
|
|
lock sync.Mutex
|
|
}
|
|
|
|
// 创建场景
|
|
func NewScene(ai *MyAI, param SceneParam) *scene {
|
|
s := &scene{
|
|
ai: ai,
|
|
Name: param.Name,
|
|
Desc: param.Desc,
|
|
callerQueue: NewQueue[ICaller](),
|
|
}
|
|
|
|
ai.scenes = append(ai.scenes, s)
|
|
return s
|
|
}
|
|
|
|
// 给场景添加调用器
|
|
func (s *scene) AddCaller(caller ICaller) {
|
|
s.callerQueue.Add(caller)
|
|
}
|
|
|
|
// 列表
|
|
func (s *scene) CallerList() []ICaller {
|
|
return s.callerQueue.List()
|
|
}
|
|
|
|
// 取出
|
|
func (s *scene) PopCaller() ICaller {
|
|
action, err := s.callerQueue.Pop()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return action
|
|
}
|
|
|
|
// 启用场景
|
|
func (s *scene) Enable(name string) {
|
|
for _, v := range s.ai.scenes {
|
|
if v.Name == name {
|
|
v.status = STATUS_ENABLE
|
|
} else {
|
|
v.status = STATUS_DISENABLE
|
|
}
|
|
}
|
|
}
|
|
|
|
//禁用场景
|
|
func (s *scene) Disable(name string) {
|
|
for _, v := range s.ai.scenes {
|
|
if v.Name == name {
|
|
v.status = STATUS_DISENABLE
|
|
}
|
|
}
|
|
}
|