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) {
|
func loadScreens(m *screenmanager.Manager) {
|
||||||
assets.LoadImages()
|
assets.LoadImages()
|
||||||
m.AddScene(&screens.Game{})
|
m.AddScene(screens.NewStartScreen())
|
||||||
|
m.AddScene(screens.NewGame())
|
||||||
m.ResetScenes()
|
m.ResetScenes()
|
||||||
}
|
}
|
||||||
|
|||||||
128
screens/game.go
128
screens/game.go
@@ -26,6 +26,7 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Game struct {
|
type Game struct {
|
||||||
|
events map[ScreenManagerEvent]func()
|
||||||
background *ebiten.Image
|
background *ebiten.Image
|
||||||
collisionMask *ebiten.Image
|
collisionMask *ebiten.Image
|
||||||
projectileMask *ebiten.Image
|
projectileMask *ebiten.Image
|
||||||
@@ -54,6 +55,13 @@ type Game struct {
|
|||||||
//pressedButtons map[ebiten.GamepadID][]string
|
//pressedButtons map[ebiten.GamepadID][]string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewGame() *Game {
|
||||||
|
g := &Game{
|
||||||
|
events: make(map[ScreenManagerEvent]func()),
|
||||||
|
}
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
func (g *Game) Initialize() {
|
func (g *Game) Initialize() {
|
||||||
|
|
||||||
origin := gamedata.Coordinates{X: 640 / 2, Y: 480 / 2}
|
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) {
|
func (g *Game) Draw(screen *ebiten.Image) {
|
||||||
|
|
||||||
screen.Clear()
|
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 {
|
op := &ebiten.DrawImageOptions{}
|
||||||
g.runtime = float64(g.counter) / 60.
|
|
||||||
}
|
|
||||||
|
|
||||||
s := fmt.Sprintf("%02.3f", g.runtime)
|
if !g.gameover {
|
||||||
if !g.gameover {
|
g.runtime = float64(g.counter) / 60.
|
||||||
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 {
|
s := fmt.Sprintf("%02.3f", g.runtime)
|
||||||
if (g.counter/30)%2 == 0 {
|
if !g.gameover {
|
||||||
text.Draw(screen, "TIME: "+s, fonts.SurviveFont.Arcade, 640/2-250, 25, color.White)
|
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)
|
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.Translate(-MOVER_WIDTH/2, -MOVER_HEIGHT/2)
|
||||||
//op.GeoM.Rotate(g.hero.Angle)
|
//op.GeoM.Rotate(g.hero.Angle)
|
||||||
op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y)
|
op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y)
|
||||||
screen.DrawImage(g.hero.Sprite, op)
|
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.Reset()
|
op.GeoM.Reset()
|
||||||
op.GeoM.Translate(-MOVER_WIDTH/2, -MOVER_HEIGHT/2)
|
op.GeoM.Translate(0, -16)
|
||||||
op.GeoM.Rotate(target.Angle)
|
op.GeoM.Rotate(g.hero.Angle)
|
||||||
op.GeoM.Translate(target.Pos.X, target.Pos.Y)
|
op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y)
|
||||||
screen.DrawImage(target.Sprite, op)
|
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) {
|
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()) {
|
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