Added music and sfx.

This commit is contained in:
2024-11-11 14:07:02 -05:00
parent 56d1f62020
commit 658ae73c9b
15 changed files with 207 additions and 73 deletions

View File

@@ -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]()
}
//}
}