From 1e2e6ec8e56b6a0eb912afed749a0495fded83fa Mon Sep 17 00:00:00 2001 From: Unbewohnte Date: Fri, 31 May 2024 11:58:44 +0300 Subject: [PATCH] BUGFIX: Fixed memory leak caused by endless font allocation --- src/main.go | 79 +++++++++++++++++++++++--------------- src/resources/levelup.wav | Bin 0 -> 28810 bytes 2 files changed, 47 insertions(+), 32 deletions(-) create mode 100644 src/resources/levelup.wav diff --git a/src/main.go b/src/main.go index 9ed7ef5..f443c64 100644 --- a/src/main.go +++ b/src/main.go @@ -11,6 +11,7 @@ import ( "io" "os" "path/filepath" + "strings" "time" "github.com/hajimehoshi/ebiten/v2" @@ -19,7 +20,8 @@ import ( "github.com/hajimehoshi/ebiten/v2/text" "golang.org/x/image/font" "golang.org/x/image/font/opentype" - "golang.org/x/image/font/sfnt" + + _ "net/http/pprof" ) const Version string = "v0.1" @@ -42,11 +44,13 @@ type Game struct { AudioContext *audio.Context AudioPlayers map[string]*audio.Player ImageResources map[string]*ebiten.Image - Font *sfnt.Font + Font font.Face } func NewGame() *Game { - audioCtx := audio.NewContext(48000) + audioCtx := audio.NewContext(44000) + fnt := ResourceGetFont("PixeloidSans-Bold.otf") + return &Game{ WorkingDir: ".", Config: conf.Default(), @@ -56,20 +60,27 @@ func NewGame() *Game { "boop": GetAudioPlayer(audioCtx, "boop.wav"), "woop": GetAudioPlayer(audioCtx, "woop.wav"), "menu_switch": GetAudioPlayer(audioCtx, "menu_switch.wav"), + "levelup": GetAudioPlayer(audioCtx, "levelup.wav"), }, ImageResources: map[string]*ebiten.Image{ "capybara1": ebiten.NewImageFromImage(ImageFromFile("capybara_1.png")), "capybara2": ebiten.NewImageFromImage(ImageFromFile("capybara_2.png")), "capybara3": ebiten.NewImageFromImage(ImageFromFile("capybara_3.png")), }, - Font: ResourceGetFont("PixeloidSans-Bold.otf"), + Font: util.NewFont(fnt, &opentype.FaceOptions{ + Size: 24, + DPI: 72, + Hinting: font.HintingVertical, + }), } } // Plays sound and rewinds the player func (g *Game) PlaySound(soundKey string) { - g.AudioPlayers[soundKey].Play() - g.AudioPlayers[soundKey].Rewind() + if strings.TrimSpace(soundKey) != "" { + g.AudioPlayers[soundKey].Play() + g.AudioPlayers[soundKey].Rewind() + } } // Saves configuration information and game data @@ -142,6 +153,14 @@ func (g *Game) Update() error { go g.PlaySound("boop") } + if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) && + g.Save.Points > 0 && + g.Save.Points%100 == 0 { + // Level progression + g.Save.Level++ + go g.PlaySound("levelup") + } + return nil } @@ -150,27 +169,35 @@ func (g *Game) Draw(screen *ebiten.Image) { screen.Fill(color.Black) // Capybara - scale := 15.0 + var capybaraKey string + switch g.Save.Level { + case 1: + capybaraKey = "capybara1" + case 2: + capybaraKey = "capybara2" + case 3: + capybaraKey = "capybara3" + default: + capybaraKey = "capybara3" + } + + scale := 10.0 op := &ebiten.DrawImageOptions{} op.GeoM.Scale(scale, scale) - width := g.ImageResources["capybara1"].Bounds().Dx() * int(scale) - height := g.ImageResources["capybara1"].Bounds().Dy() * int(scale) + width := g.ImageResources[capybaraKey].Bounds().Dx() * int(scale) + height := g.ImageResources[capybaraKey].Bounds().Dy() * int(scale) op.GeoM.Translate( float64(screen.Bounds().Dx()/2)-float64(width/2), float64(screen.Bounds().Dy()/2)-float64(height/2), ) - screen.DrawImage(g.ImageResources["capybara1"], op) + screen.DrawImage(g.ImageResources[capybaraKey], op) // Points msg := fmt.Sprintf("Points: %d", g.Save.Points) text.Draw( screen, msg, - util.NewFont(g.Font, &opentype.FaceOptions{ - Size: 24, - DPI: 72, - Hinting: font.HintingVertical, - }), + g.Font, 10, 30, color.White, @@ -181,26 +208,18 @@ func (g *Game) Draw(screen *ebiten.Image) { text.Draw( screen, msg, - util.NewFont(g.Font, &opentype.FaceOptions{ - Size: 24, - DPI: 72, - Hinting: font.HintingVertical, - }), + g.Font, screen.Bounds().Dx()-len(msg)*24, 30, color.White, ) // Times Clicked - msg = fmt.Sprintf("Times Clicked: %d", g.Save.TimesClicked) + msg = fmt.Sprintf("Clicks: %d", g.Save.TimesClicked) text.Draw( screen, msg, - util.NewFont(g.Font, &opentype.FaceOptions{ - Size: 24, - DPI: 72, - Hinting: font.HintingVertical, - }), + g.Font, 10, screen.Bounds().Dy()-30, color.White, @@ -211,12 +230,8 @@ func (g *Game) Draw(screen *ebiten.Image) { text.Draw( screen, msg, - util.NewFont(g.Font, &opentype.FaceOptions{ - Size: 24, - DPI: 72, - Hinting: font.HintingVertical, - }), - screen.Bounds().Dx()-len(msg)*24, + g.Font, + screen.Bounds().Dx()-len(msg)*19, screen.Bounds().Dy()-30, color.White, ) diff --git a/src/resources/levelup.wav b/src/resources/levelup.wav new file mode 100644 index 0000000000000000000000000000000000000000..a66eaa9f5ea68a26ae2b9e7b1db54fd407c7cde6 GIT binary patch literal 28810 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 H-x2sfB0~Ct literal 0 HcmV?d00001