Adding splash screen.
This commit is contained in:
3
main.go
3
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()
|
||||
}
|
||||
|
||||
128
screens/game.go
128
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
|
||||
}
|
||||
|
||||
45
screens/start.go
Normal file
45
screens/start.go
Normal file
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user