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]()
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user