package system import ( "github.com/yohamta/donburi/filter" "joylink.club/ecs" "joylink.club/rtsssimulation/components" ) // 按钮系统 type ButtonSystem struct { } // 按钮组件 var btnIdCom, btnStaCom, btnPreOperCom, btnConOperCom = components.DeviceIdentityComponent, components.ButtonStateComponent, components.ButtonPressOperatingComponent, components.ButtonConfirmOperatingComponent // 查询 var btnIdQuery = ecs.NewQuery(filter.Contains(btnIdCom)) var btnUpdateQuery = ecs.NewQuery(filter.Contains(btnStaCom, btnPreOperCom, btnConOperCom)) func NewButtonSystem() *ButtonSystem { return &ButtonSystem{} } // 按钮操作 func PressDownAndUpButton(w ecs.World, btnId string, down bool) bool { buttonEntry := queryButton(w, btnId) if buttonEntry == nil { return false } t, b := getButtonBaseInfo(btnId) if !buttonEntry.HasComponent(btnPreOperCom) { // 操作组件 buttonEntry.AddComponent(btnPreOperCom) } preOper := btnPreOperCom.Get(buttonEntry) preOper.Start, preOper.Down, preOper.NeedConfirm, preOper.OperateTime = true, down, b, t return true } // 确认操作 func ConfirmButton(w ecs.World, btnId string, confirm bool) bool { buttonEntry := queryButton(w, btnId) if buttonEntry == nil { return false } if !buttonEntry.HasComponent(btnConOperCom) { // 确认组件 buttonEntry.AddComponent(btnConOperCom) } conOper := btnConOperCom.Get(buttonEntry) conOper.Confirm, conOper.Cancel = confirm, !confirm return true } // 更新按钮状态 func (bs *ButtonSystem) Update(w ecs.World) { btnUpdateQuery.Each(w, func(e *ecs.Entry) { if e.HasComponent(btnPreOperCom) { btnPreOper := btnPreOperCom.Get(e) if btnPreOper.Start { // 按钮开始操作 if btnPreOper.OperateTime <= 0 { // 按钮操作时间大于0 btnPreOper.Start, btnPreOper.OperateTime = false, 0 } else { btnPreOper.OperateTime -= int64(w.Tick()) if btnPreOper.NeedConfirm { conOper := btnConOperCom.Get(e) if e.HasComponent(btnConOperCom) && (conOper.Cancel || conOper.Confirm) { if conOper.Confirm { btnSta := btnStaCom.Get(e) btnSta.PressDown = btnPreOper.Down } btnPreOper.Start, btnPreOper.OperateTime = false, 0 conOper.Cancel, conOper.Confirm = false, false e.RemoveComponent(btnPreOperCom) e.RemoveComponent(btnConOperCom) } } else { btnSta := btnStaCom.Get(e) btnSta.PressDown = btnPreOper.Down btnPreOper.Start, btnPreOper.OperateTime = false, 0 e.RemoveComponent(btnPreOperCom) } } } else { e.RemoveComponent(btnPreOperCom) } } }) } // 查找按钮 func queryButton(w ecs.World, btnId string) *ecs.Entry { var buttonEntry *ecs.Entry = nil btnIdQuery.Each(w, func(e *ecs.Entry) { if id := btnIdCom.Get(e).Id; id == btnId { buttonEntry = e } }) return buttonEntry } // 获取按钮设置信息 func getButtonBaseInfo(btnId string) (int64, bool) { return 15, false }