From bc66aa740eaaab9061d866f30361d22f8bba4c09 Mon Sep 17 00:00:00 2001 From: iegod Date: Fri, 28 Nov 2025 18:10:37 -0500 Subject: [PATCH] Alertbox added. --- elements/alert.go | 49 ++++++++++++++++++++++++++++++++++++++++ fonts/Rockboxcond12.ttf | Bin 0 -> 11212 bytes fonts/fonts.go | 25 ++++++++++++++++++++ game/game.go | 32 ++++++++++++++++++-------- go.mod | 4 ++++ 5 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 elements/alert.go create mode 100644 fonts/Rockboxcond12.ttf create mode 100644 fonts/fonts.go diff --git a/elements/alert.go b/elements/alert.go new file mode 100644 index 0000000..ec16f40 --- /dev/null +++ b/elements/alert.go @@ -0,0 +1,49 @@ +package elements + +import ( + "fluids/fonts" + + "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/text/v2" +) + +const ( + AlertWidth = 50 + AlertHeight = 150 +) + +type Alert struct { + Sprite *ebiten.Image + text string + textfacesource *text.GoTextFaceSource +} + +func NewAlert() *Alert { + a := &Alert{ + Sprite: ebiten.NewImage(AlertWidth, AlertHeight), + textfacesource: fonts.PixelFont, + } + return a +} + +func (a *Alert) Draw() { + a.Sprite.Clear() + + fnt := &text.GoTextFace{ + Source: a.textfacesource, + Size: 20, + } + + _, h := text.Measure(a.text, fnt, 0) + top := &text.DrawOptions{} + top.GeoM.Translate(0, h) + text.Draw(a.Sprite, a.text, fnt, top) +} + +func (a *Alert) Update() { + +} + +func (a *Alert) SetText(t string) { + a.text = t +} diff --git a/fonts/Rockboxcond12.ttf b/fonts/Rockboxcond12.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ac8aaa54696985b6e2cf507c2b5ea5e28f7d1a2e GIT binary patch literal 11212 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 F{Xb^vdtd+n literal 0 HcmV?d00001 diff --git a/fonts/fonts.go b/fonts/fonts.go new file mode 100644 index 0000000..146aad0 --- /dev/null +++ b/fonts/fonts.go @@ -0,0 +1,25 @@ +package fonts + +import ( + "bytes" + _ "embed" + "log" + + "github.com/hajimehoshi/ebiten/v2/text/v2" +) + +const () + +var ( + PixelFont *text.GoTextFaceSource + //go:embed Rockboxcond12.ttf + pixel_fnt []byte +) + +func init() { + s, err := text.NewGoTextFaceSource(bytes.NewReader(pixel_fnt)) + if err != nil { + log.Fatal(err) + } + PixelFont = s +} diff --git a/game/game.go b/game/game.go index 7a5cb0b..68bea44 100644 --- a/game/game.go +++ b/game/game.go @@ -15,14 +15,13 @@ import ( ) const ( - GameWidth = 640 - GameHeight = 360 - GameParticleCount = 2000 - GameGravity = 2 - GameParticleRadius = 5 - GameDamping = .7 - GameDeltaTimeStep = 0.5 - + GameWidth = 640 + GameHeight = 360 + GameParticleCount = 2000 + GameGravity = 2 + GameParticleRadius = 5 + GameDamping = .7 + GameDeltaTimeStep = 0.5 GameInfluenceRadius = 30 ) @@ -38,6 +37,7 @@ type Game struct { resolvecollisions bool resolvers []func(particle *elements.Particle) resolveridx int + alertbox *elements.Alert } func NewGame() *Game { @@ -47,6 +47,7 @@ func NewGame() *Game { renderquads: false, resolvecollisions: false, resolveridx: 0, + alertbox: elements.NewAlert(), } g.particlebox = &gamedata.Vector{ @@ -104,6 +105,12 @@ func (g *Game) Draw(screen *ebiten.Image) { if g.renderquads { g.RenderQuadrants(screen) } + + if g.paused { + op := &ebiten.DrawImageOptions{} + op.GeoM.Translate(50, 50) + screen.DrawImage(g.alertbox.Sprite, op) + } } func (g *Game) Layout(x, y int) (int, int) { @@ -279,22 +286,30 @@ func (g *Game) RenderQuadrants(img *ebiten.Image) { } func (g *Game) ParseInputs() { + + //refresh particles if inpututil.IsKeyJustPressed(ebiten.KeyR) { g.InitializeParticles() } + //pause simulation if inpututil.IsKeyJustPressed(ebiten.KeyP) { g.paused = !g.paused + g.alertbox.SetText("PAUSED") + g.alertbox.Draw() } + //show quadtree quadrants if inpututil.IsKeyJustPressed(ebiten.KeyQ) { g.renderquads = !g.renderquads } + //enable collision resolution if inpututil.IsKeyJustPressed(ebiten.KeyC) { g.resolvecollisions = !g.resolvecollisions } + //switch between collision resolvers if inpututil.IsKeyJustPressed(ebiten.KeyLeft) { g.resolveridx = g.resolveridx - 1 if g.resolveridx < 0 { @@ -305,7 +320,6 @@ func (g *Game) ParseInputs() { if inpututil.IsKeyJustPressed(ebiten.KeyRight) { g.resolveridx = (g.resolveridx + 1) % len(g.resolvers) } - } func (g *Game) RebuildQuadtree() { diff --git a/go.mod b/go.mod index 9a2c6df..2d80046 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,11 @@ require ( github.com/ebitengine/gomobile v0.0.0-20250923094054-ea854a63cce1 // indirect github.com/ebitengine/hideconsole v1.0.0 // indirect github.com/ebitengine/purego v0.9.0 // indirect + github.com/go-text/typesetting v0.3.0 // indirect github.com/jezek/xgb v1.1.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + golang.org/x/image v0.31.0 // indirect golang.org/x/sync v0.17.0 // indirect golang.org/x/sys v0.36.0 // indirect + golang.org/x/text v0.29.0 // indirect )