From e10bf4742743fd6d8cbef84f2cdaca10dc714ad5 Mon Sep 17 00:00:00 2001 From: iegod Date: Mon, 11 Nov 2024 10:25:02 -0500 Subject: [PATCH] Adding splash screen. --- main.go | 3 +- screens/game.go | 128 +++++++++++++++++++++++++---------------------- screens/start.go | 45 +++++++++++++++++ 3 files changed, 116 insertions(+), 60 deletions(-) create mode 100644 screens/start.go diff --git a/main.go b/main.go index f7fa00d..aa0582d 100644 --- a/main.go +++ b/main.go @@ -33,6 +33,7 @@ func main() { func loadScreens(m *screenmanager.Manager) { assets.LoadImages() - m.AddScene(&screens.Game{}) + m.AddScene(screens.NewStartScreen()) + m.AddScene(screens.NewGame()) m.ResetScenes() } diff --git a/screens/game.go b/screens/game.go index 85dc746..380cba7 100644 --- a/screens/game.go +++ b/screens/game.go @@ -26,6 +26,7 @@ const ( ) type Game struct { + events map[ScreenManagerEvent]func() background *ebiten.Image collisionMask *ebiten.Image projectileMask *ebiten.Image @@ -54,6 +55,13 @@ type Game struct { //pressedButtons map[ebiten.GamepadID][]string } +func NewGame() *Game { + g := &Game{ + events: make(map[ScreenManagerEvent]func()), + } + return g +} + func (g *Game) Initialize() { origin := gamedata.Coordinates{X: 640 / 2, Y: 480 / 2} @@ -124,75 +132,77 @@ func (g *Game) Update() error { func (g *Game) Draw(screen *ebiten.Image) { screen.Clear() - screen.DrawImage(g.background, nil) - g.hero.Draw() + if g.initialized { + screen.DrawImage(g.background, nil) - op := &ebiten.DrawImageOptions{} + g.hero.Draw() - if !g.gameover { - g.runtime = float64(g.counter) / 60. - } + op := &ebiten.DrawImageOptions{} - s := fmt.Sprintf("%02.3f", g.runtime) - if !g.gameover { - text.Draw(screen, "TIME: "+s, fonts.SurviveFont.Arcade, 640/2-250, 25, color.White) - text.Draw(screen, fmt.Sprintf("SCORE: %d", g.score*10), fonts.SurviveFont.Arcade, 640/2+100, 25, color.White) - } else { - if (g.counter/30)%2 == 0 { + if !g.gameover { + g.runtime = float64(g.counter) / 60. + } + + s := fmt.Sprintf("%02.3f", g.runtime) + if !g.gameover { text.Draw(screen, "TIME: "+s, fonts.SurviveFont.Arcade, 640/2-250, 25, color.White) text.Draw(screen, fmt.Sprintf("SCORE: %d", g.score*10), fonts.SurviveFont.Arcade, 640/2+100, 25, color.White) + } else { + if (g.counter/30)%2 == 0 { + text.Draw(screen, "TIME: "+s, fonts.SurviveFont.Arcade, 640/2-250, 25, color.White) + text.Draw(screen, fmt.Sprintf("SCORE: %d", g.score*10), fonts.SurviveFont.Arcade, 640/2+100, 25, color.White) + } } - } - op.GeoM.Translate(-MOVER_WIDTH/2, -MOVER_HEIGHT/2) - //op.GeoM.Rotate(g.hero.Angle) - op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y) - screen.DrawImage(g.hero.Sprite, op) - - op.GeoM.Reset() - op.GeoM.Translate(0, -16) - op.GeoM.Rotate(g.hero.Angle) - op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y) - screen.DrawImage(assets.ImageBank[assets.Weapon], op) - - //secondary/upgraded weapon sprite; in testing proves sort of distracting - /* - if g.hero.Upgrade { - op.GeoM.Reset() - op.GeoM.Translate(-16, -16) - op.GeoM.Scale(0.75, 0.75) - op.GeoM.Translate(16, 0) - op.GeoM.Rotate(g.hero.Angle + math.Pi) - op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y) - screen.DrawImage(weaponImage, op) - }*/ - - for _, target := range g.targets { - target.Draw() + op.GeoM.Translate(-MOVER_WIDTH/2, -MOVER_HEIGHT/2) + //op.GeoM.Rotate(g.hero.Angle) + op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y) + screen.DrawImage(g.hero.Sprite, op) op.GeoM.Reset() - op.GeoM.Translate(-MOVER_WIDTH/2, -MOVER_HEIGHT/2) - op.GeoM.Rotate(target.Angle) - op.GeoM.Translate(target.Pos.X, target.Pos.Y) - screen.DrawImage(target.Sprite, op) + op.GeoM.Translate(0, -16) + op.GeoM.Rotate(g.hero.Angle) + op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y) + screen.DrawImage(assets.ImageBank[assets.Weapon], op) + + //secondary/upgraded weapon sprite; in testing proves sort of distracting + /* + if g.hero.Upgrade { + op.GeoM.Reset() + op.GeoM.Translate(-16, -16) + op.GeoM.Scale(0.75, 0.75) + op.GeoM.Translate(16, 0) + op.GeoM.Rotate(g.hero.Angle + math.Pi) + op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y) + screen.DrawImage(weaponImage, op) + }*/ + + for _, target := range g.targets { + target.Draw() + + op.GeoM.Reset() + op.GeoM.Translate(-MOVER_WIDTH/2, -MOVER_HEIGHT/2) + op.GeoM.Rotate(target.Angle) + op.GeoM.Translate(target.Pos.X, target.Pos.Y) + screen.DrawImage(target.Sprite, op) + } + + g.projectileMask.Clear() + + //ebitenutil.DrawCircle() + for _, p := range g.projectiles { + //vector.DrawFilledCircle(screen, float32(p.Pos.X), float32(p.Pos.Y), 3, color.White, true) + vector.DrawFilledCircle(g.projectileMask, float32(p.Pos.X), float32(p.Pos.Y), 3, color.White, true) + } + + screen.DrawImage(g.projectileMask, nil) + + vector.StrokeCircle(screen, float32(g.explosion.Origin.X), float32(g.explosion.Origin.Y), float32(g.explosion.Radius), 3, color.White, true) + + /*for _, gamepad ebiten.StandardGamepadAxisValue(id, ebiten.StandardGamepadAxisRightStickHorizontal), + ebiten.StandardGamepadAxisValue(id, ebiten.StandardGamepadAxisRightStickVertical))*/ } - - g.projectileMask.Clear() - - //ebitenutil.DrawCircle() - for _, p := range g.projectiles { - //vector.DrawFilledCircle(screen, float32(p.Pos.X), float32(p.Pos.Y), 3, color.White, true) - vector.DrawFilledCircle(g.projectileMask, float32(p.Pos.X), float32(p.Pos.Y), 3, color.White, true) - } - - screen.DrawImage(g.projectileMask, nil) - - vector.StrokeCircle(screen, float32(g.explosion.Origin.X), float32(g.explosion.Origin.Y), float32(g.explosion.Radius), 3, color.White, true) - - /*for _, gamepad ebiten.StandardGamepadAxisValue(id, ebiten.StandardGamepadAxisRightStickHorizontal), - ebiten.StandardGamepadAxisValue(id, ebiten.StandardGamepadAxisRightStickVertical))*/ - } func (g *Game) Layout(width, height int) (int, int) { @@ -497,5 +507,5 @@ func (g *Game) SetDimensions(a gamedata.Area) { } func (g *Game) SetEventHandler(e ScreenManagerEvent, f func()) { - + g.events[e] = f } diff --git a/screens/start.go b/screens/start.go new file mode 100644 index 0000000..0ee7085 --- /dev/null +++ b/screens/start.go @@ -0,0 +1,45 @@ +package screens + +import ( + "image/color" + "mover/fonts" + "mover/gamedata" + + "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/inpututil" + "github.com/hajimehoshi/ebiten/v2/text" +) + +type StartScreen struct { + eHandler map[ScreenManagerEvent]func() + dimensions gamedata.Area +} + +func NewStartScreen() *StartScreen { + s := &StartScreen{ + eHandler: make(map[ScreenManagerEvent]func()), + } + return s +} + +func (s *StartScreen) Update() error { + + if inpututil.IsKeyJustPressed(ebiten.KeyEnter) { + s.eHandler[EventCompleted]() + } + + return nil +} + +func (s *StartScreen) Draw(screen *ebiten.Image) { + screen.Clear() + text.Draw(screen, "survive", fonts.SurviveFont.ArcadeLarge, 40, 80, color.White) +} + +func (s *StartScreen) SetEventHandler(e ScreenManagerEvent, f func()) { + s.eHandler[e] = f +} + +func (s *StartScreen) SetDimensions(a gamedata.Area) { + s.dimensions = a +}