From c450f046e0e09f8eb1a93f5f29278044dd0131b4 Mon Sep 17 00:00:00 2001 From: qlli Date: Thu, 12 Sep 2024 11:08:27 +0800 Subject: [PATCH 1/2] fix: Die behavior with animation #315 --- sprite.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sprite.go b/sprite.go index 4e32b1e..0021137 100644 --- a/sprite.go +++ b/sprite.go @@ -492,6 +492,7 @@ func (p *Sprite) Die() { p.goAnimate(aniName, ani) } + p.Stop(OtherScriptsInSprite) p.Destroy() } From fc2d31c3dec71f62799818b6566f267c684dfcd1 Mon Sep 17 00:00:00 2001 From: qlli Date: Fri, 20 Sep 2024 10:51:58 +0800 Subject: [PATCH 2/2] fix: Avoid panic when "auto-binding" failed #330 --- game.go | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/game.go b/game.go index 7de12cf..0a3bc6b 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(fld, 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(sprite Spriter, 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