Added music and sfx.
This commit is contained in:
118
screens/game.go
118
screens/game.go
@@ -11,9 +11,8 @@ import (
|
||||
"mover/fonts"
|
||||
"mover/gamedata"
|
||||
|
||||
_ "embed"
|
||||
|
||||
"github.com/hajimehoshi/ebiten/v2"
|
||||
"github.com/hajimehoshi/ebiten/v2/audio"
|
||||
"github.com/hajimehoshi/ebiten/v2/inpututil"
|
||||
"github.com/hajimehoshi/ebiten/v2/text"
|
||||
"github.com/hajimehoshi/ebiten/v2/vector"
|
||||
@@ -22,6 +21,7 @@ import (
|
||||
const (
|
||||
MOVER_WIDTH = 48
|
||||
MOVER_HEIGHT = 48
|
||||
sampleRate = 44100
|
||||
)
|
||||
|
||||
type Game struct {
|
||||
@@ -32,16 +32,19 @@ type Game struct {
|
||||
heroCollisionMask *ebiten.Image
|
||||
heroCollisionCpy *ebiten.Image
|
||||
|
||||
dimensions gamedata.Area
|
||||
Pos gamedata.Coordinates
|
||||
Paused bool
|
||||
initialized bool
|
||||
gameover bool
|
||||
reset bool
|
||||
runtime float64
|
||||
hero *elements.Hero
|
||||
projectiles map[int]*elements.Projectile
|
||||
explosion *elements.Explosion
|
||||
dimensions gamedata.Area
|
||||
Pos gamedata.Coordinates
|
||||
Paused bool
|
||||
initialized bool
|
||||
gameover bool
|
||||
reset bool
|
||||
musicInitialized bool
|
||||
runtime float64
|
||||
hero *elements.Hero
|
||||
projectiles map[int]*elements.Projectile
|
||||
explosion *elements.Explosion
|
||||
audioplayer *audio.Player
|
||||
sfxplayer []*audio.Player
|
||||
|
||||
score int
|
||||
counter int
|
||||
@@ -54,15 +57,39 @@ type Game struct {
|
||||
//pressedButtons map[ebiten.GamepadID][]string
|
||||
}
|
||||
|
||||
var (
|
||||
audioContext = audio.NewContext(sampleRate)
|
||||
)
|
||||
|
||||
func NewGame() *Game {
|
||||
g := &Game{
|
||||
events: make(map[ScreenManagerEvent]func()),
|
||||
events: make(map[ScreenManagerEvent]func()),
|
||||
musicInitialized: false,
|
||||
}
|
||||
return g
|
||||
}
|
||||
|
||||
func (g *Game) Initialize() {
|
||||
|
||||
if !g.musicInitialized {
|
||||
//s, _ := wav.DecodeWithSampleRate(sampleRate)
|
||||
//d, _ := wav.DecodeWithSampleRate(sampleRate, bytes.NewReader(loop_wav))
|
||||
|
||||
s := audio.NewInfiniteLoop(assets.SoundBank[assets.MainLoop], assets.SoundBank[assets.MainLoop].Length())
|
||||
|
||||
/*
|
||||
|
||||
reader := bytes.NewReader(loop_wav)
|
||||
|
||||
s := audio.NewInfiniteLoopF32(reader, reader.Length())
|
||||
*/
|
||||
g.audioplayer, _ = audioContext.NewPlayer(s)
|
||||
|
||||
g.audioplayer.Play()
|
||||
|
||||
g.musicInitialized = true
|
||||
}
|
||||
|
||||
origin := gamedata.Coordinates{X: 640 / 2, Y: 480 / 2}
|
||||
|
||||
g.ConstructBackground()
|
||||
@@ -143,17 +170,6 @@ func (g *Game) Draw(screen *ebiten.Image) {
|
||||
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)
|
||||
@@ -175,7 +191,15 @@ func (g *Game) Draw(screen *ebiten.Image) {
|
||||
op.GeoM.Rotate(g.hero.Angle + math.Pi)
|
||||
op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y)
|
||||
screen.DrawImage(weaponImage, op)
|
||||
}*/
|
||||
}
|
||||
*/
|
||||
|
||||
//draw shadows
|
||||
for _, target := range g.targets {
|
||||
op := &ebiten.DrawImageOptions{}
|
||||
op.GeoM.Translate(target.Pos.X-10, target.Pos.Y+10)
|
||||
screen.DrawImage(assets.ImageBank[assets.FlyEyeShadow], op)
|
||||
}
|
||||
|
||||
for _, target := range g.targets {
|
||||
target.Draw()
|
||||
@@ -201,6 +225,19 @@ func (g *Game) Draw(screen *ebiten.Image) {
|
||||
|
||||
/*for _, gamepad ebiten.StandardGamepadAxisValue(id, ebiten.StandardGamepadAxisRightStickHorizontal),
|
||||
ebiten.StandardGamepadAxisValue(id, ebiten.StandardGamepadAxisRightStickVertical))*/
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
text.Draw(screen, "PRESS START TO TRY AGAIN", fonts.SurviveFont.Arcade, 640/2-150, 480/2, color.White)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,6 +274,10 @@ func (g *Game) StepGame() {
|
||||
|
||||
if !g.Paused {
|
||||
|
||||
if !g.audioplayer.IsPlaying() {
|
||||
g.audioplayer.Play()
|
||||
}
|
||||
|
||||
g.hero.Update()
|
||||
g.explosion.Update()
|
||||
|
||||
@@ -255,6 +296,8 @@ func (g *Game) StepGame() {
|
||||
|
||||
g.CleanupTargets()
|
||||
g.counter++
|
||||
} else {
|
||||
g.audioplayer.Pause()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -351,6 +394,13 @@ func (g *Game) UpdateProjectiles() {
|
||||
target.SetHit()
|
||||
//target.SetOrigin(gamedata.Coordinates{X: rand.Float64() * 640, Y: rand.Float64() * 480})
|
||||
target.Hit = true
|
||||
|
||||
//var err error
|
||||
//player, err := audioContext.NewPlayer(assets.SoundBank[assets.Explode])
|
||||
|
||||
player := audioContext.NewPlayerFromBytes(assets.TargetHit)
|
||||
player.Play()
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -362,6 +412,12 @@ func (g *Game) UpdateProjectiles() {
|
||||
func (g *Game) UpdateTargets() {
|
||||
for _, target := range g.targets {
|
||||
|
||||
if target.Action == elements.MoverActionExploding && !target.SplodeInitiated {
|
||||
player := audioContext.NewPlayerFromBytes(assets.Splode)
|
||||
player.Play()
|
||||
target.SplodeInitiated = true
|
||||
}
|
||||
|
||||
if !target.Hit && g.hero.Action < elements.HeroActionDying {
|
||||
dx := g.hero.Pos.X - target.Pos.X
|
||||
dy := g.hero.Pos.Y - target.Pos.Y
|
||||
@@ -394,6 +450,9 @@ func (g *Game) UpdateTargets() {
|
||||
//fmt.Println("pixel death")
|
||||
g.hero.SetHit()
|
||||
g.gameover = true
|
||||
|
||||
player := audioContext.NewPlayerFromBytes(assets.HeroDeath)
|
||||
player.Play()
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -417,6 +476,9 @@ func (g *Game) AppendProjectiles() {
|
||||
if g.hero.Upgrade {
|
||||
g.projectiles[g.counter+1] = elements.NewProjectile(gamedata.Coordinates{X: g.hero.Pos.X, Y: g.hero.Pos.Y}, g.hero.Angle+math.Pi, 5.)
|
||||
}
|
||||
|
||||
player := audioContext.NewPlayerFromBytes(assets.Shot)
|
||||
player.Play()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -427,6 +489,8 @@ func (g *Game) HandleInput() {
|
||||
g.explosion.SetOrigin(g.hero.Pos)
|
||||
g.explosion.Reset()
|
||||
g.explosion.ToggleActivate()
|
||||
player := audioContext.NewPlayerFromBytes(assets.Magic)
|
||||
player.Play()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -453,6 +517,10 @@ func (g *Game) HandleInput() {
|
||||
inputangle := math.Atan2(yaxis, xaxis)
|
||||
g.hero.SetAngle(inputangle)
|
||||
}
|
||||
|
||||
if inpututil.IsKeyJustPressed(ebiten.KeyQ) {
|
||||
g.events[EventEndgame]()
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package screens
|
||||
import (
|
||||
"image/color"
|
||||
"math"
|
||||
"mover/assets"
|
||||
"mover/fonts"
|
||||
"mover/gamedata"
|
||||
|
||||
@@ -17,6 +18,8 @@ type StartScreen struct {
|
||||
target gamedata.Coordinates
|
||||
current gamedata.Coordinates
|
||||
targetreached bool
|
||||
audioplayed bool
|
||||
cycle int
|
||||
}
|
||||
|
||||
func NewStartScreen() *StartScreen {
|
||||
@@ -25,6 +28,8 @@ func NewStartScreen() *StartScreen {
|
||||
target: gamedata.Coordinates{X: 640/2 - 150, Y: 480 / 2},
|
||||
current: gamedata.Coordinates{X: 640/2 - 150, Y: -100},
|
||||
targetreached: false,
|
||||
cycle: 0,
|
||||
audioplayed: false,
|
||||
}
|
||||
return s
|
||||
}
|
||||
@@ -36,13 +41,24 @@ func (s *StartScreen) Update() error {
|
||||
s.eHandler[EventCompleted]()
|
||||
}
|
||||
|
||||
s.current.X += (s.target.X - s.current.X) / 8
|
||||
s.current.Y += (s.target.Y - s.current.Y) / 8
|
||||
if !s.audioplayed {
|
||||
player := audioContext.NewPlayerFromBytes(assets.Survive)
|
||||
player.Play()
|
||||
s.audioplayed = true
|
||||
}
|
||||
|
||||
if !s.targetreached {
|
||||
s.current.X += (s.target.X - s.current.X) / 8
|
||||
s.current.Y += (s.target.Y - s.current.Y) / 8
|
||||
} else {
|
||||
s.current.Y += 0.5 * math.Sin(float64(s.cycle)/(math.Pi*8))
|
||||
}
|
||||
|
||||
if math.Abs(s.current.Y-s.target.Y) < 1 && !s.targetreached {
|
||||
s.targetreached = true
|
||||
}
|
||||
|
||||
s.cycle++
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user