From 2e78093ab065deb499eeb0a7f39b34a2709e3731 Mon Sep 17 00:00:00 2001 From: qlli Date: Fri, 20 Sep 2024 15:50:17 +0800 Subject: [PATCH] fix: Avoid panic when "auto-binding" failed #330 (#336) * fix: Avoid panic when "auto-binding" failed #330 * Remove unused parameter --- game.go | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/game.go b/game.go index 7de12cf..407cbb4 100644 --- a/game.go +++ b/game.go @@ -257,14 +257,18 @@ func Gopt_Game_Run(game Gamer, resource interface{}, gameConf ...*Config) { name, val := getFieldPtrOrAlloc(v, i) switch fld := val.(type) { case *Sound: - media, err := g.loadSound(name) - if err != nil { - panic(err) + if g.canBindSound(name) { + media, err := g.loadSound(name) + if err != nil { + panic(err) + } + *fld = media } - *fld = media case Spriter: - if err := g.loadSprite(fld, name, v); err != nil { - panic(err) + if g.canBindSprite(name) { + if err := g.loadSprite(fld, name, v); err != nil { + panic(err) + } } // p.sprs[name] = fld (has been set by loadSprite) } @@ -354,6 +358,17 @@ func (p *Game) startLoad(fs spxfs.Dir, cfg *Config) { p.windowHeight_ = cfg.Height } +func (p *Game) canBindSprite(name string) bool { + // auto bind the sprite, if assets/sprites/{name}/index.json exists. + var baseDir = "sprites/" + name + "/" + f, err := p.fs.Open(baseDir + "index.json") + if err != nil { + return false + } + defer f.Close() + return true +} + func (p *Game) loadSprite(sprite Spriter, name string, gamer reflect.Value) error { if debugLoad { log.Println("==> LoadSprite", name) @@ -1225,6 +1240,17 @@ func (p *Game) ClearSoundEffects() { type Sound *soundConfig +func (p *Game) canBindSound(name string) bool { + // auto bind the sound, if assets/sounds/{name}/index.json exists. + prefix := "sounds/" + name + f, err := p.fs.Open(prefix + "/index.json") + if err != nil { + return false + } + defer f.Close() + return true +} + func (p *Game) loadSound(name string) (media Sound, err error) { if media, ok := p.sounds.audios[name]; ok { return media, nil