Skip to content

Commit

Permalink
simplify Gopt_Game_Gopx_GetWidget
Browse files Browse the repository at this point in the history
  • Loading branch information
nighca committed Aug 22, 2024
1 parent 3df776b commit f0c9ace
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 15 deletions.
26 changes: 11 additions & 15 deletions game.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ type Spriter interface {
}
type Gamer interface {
initGame(sprites []Spriter) *Game
getGame() *Game
}

func (p *Game) IsRunned() bool {
Expand Down Expand Up @@ -1351,30 +1350,27 @@ func (p *Game) ShowVar(name string) {
p.setStageMonitor("", getVarPrefix+name, true)
}

func (p *Game) GetAllShapes() []Shape {
return p.items
}

// -----------------------------------------------------------------------------
// Widget

type ShapeGetter interface {
GetAllShapes() []Shape
}

// GetWidget returns the widget instance with given name. It panics if not found.
func Gopt_Game_Gopx_GetWidget[T any](game interface{}, name string) *T {
var gamePtr *Game
switch ptr := game.(type) {
case *Game:
gamePtr = ptr
case interface{ Parent() *Game }:
gamePtr = ptr.Parent()
case Gamer:
gamePtr = ptr.getGame()
default:
panic("GetWidget: unexpected game type" + reflect.TypeOf(game).String())
}
items := gamePtr.items
func Gopt_Game_Gopx_GetWidget[T any](sg ShapeGetter, name string) *T {
items := sg.GetAllShapes()
for _, item := range items {
widget, ok := item.(Widget)
if ok && widget.GetName() == name {
if result, ok := widget.(interface{}).(*T); ok {
return result
} else {
panic("GetWidget: type mismatch - expected " + reflect.TypeOf((*T)(nil)).Elem().String() + ", got " + reflect.TypeOf(widget).String())
panic("GetWidget: type mismatch")
}
}
}
Expand Down
4 changes: 4 additions & 0 deletions sprite.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@ func (p *Sprite) Parent() *Game {
return p.g
}

func (p *Sprite) GetAllShapes() []Shape {
return p.g.GetAllShapes()
}

func (p *Sprite) init(
base string, g *Game, name string, sprite *spriteConfig, gamer reflect.Value, shared *sharedImages) {
if sprite.Costumes != nil {
Expand Down

0 comments on commit f0c9ace

Please sign in to comment.