From 5b1bf05d1223e557dfb2c07d9159dd1076af3452 Mon Sep 17 00:00:00 2001 From: Trevor Slocum Date: Wed, 6 Oct 2021 07:18:38 -0700 Subject: [PATCH] Add gib and die sounds --- assets/audio/die.mp3 | Bin 0 -> 18888 bytes assets/audio/gib.mp3 | Bin 0 -> 19272 bytes creep.go | 21 +++++-- game.go | 129 ++++++++++++++++++++++++++++++++----------- level.go | 14 +++++ player.go | 2 +- 6 files changed, 129 insertions(+), 37 deletions(-) create mode 100644 assets/audio/die.mp3 create mode 100644 assets/audio/gib.mp3 diff --git a/assets/audio/die.mp3 b/assets/audio/die.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d23632d83266f9aaf39f81714aea141e4a4dfdf8 GIT binary patch literal 18888 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 literal 0 HcmV?d00001 diff --git a/assets/audio/gib.mp3 b/assets/audio/gib.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6fb1030b0867136c059459bfd5beaef543b1bf85 GIT binary patch literal 19272 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 literal 0 HcmV?d00001 diff --git a/creep.go b/creep.go index 0d2da28..56430fc 100644 --- a/creep.go +++ b/creep.go @@ -7,7 +7,7 @@ import ( "github.com/hajimehoshi/ebiten/v2" ) -type creep struct { +type gameCreep struct { x, y float64 sprite *ebiten.Image @@ -16,17 +16,28 @@ type creep struct { tick int nextAction int + level *Level + sync.Mutex } -func (c *creep) doNextAction() { +func NewCreep(sprite *ebiten.Image, level *Level) *gameCreep { + return &gameCreep{ + x: float64(1 + rand.Intn(64)), + y: float64(1 + rand.Intn(64)), + sprite: sprite, + level: level, + } +} + +func (c *gameCreep) doNextAction() { c.moveX = (rand.Float64() - 0.5) / 10 c.moveY = (rand.Float64() - 0.5) / 10 c.nextAction = 400 + rand.Intn(1000) } -func (c *creep) Update() { +func (c *gameCreep) Update() { c.Lock() defer c.Unlock() @@ -36,10 +47,10 @@ func (c *creep) Update() { c.tick = 0 } - c.x, c.y = c.x+c.moveX, c.y+c.moveY + c.x, c.y = c.level.Clamp(c.x+c.moveX, c.y+c.moveY) } -func (c *creep) Position() (float64, float64) { +func (c *gameCreep) Position() (float64, float64) { c.Lock() defer c.Unlock() return c.x, c.y diff --git a/game.go b/game.go index eca6fe5..9b35789 100644 --- a/game.go +++ b/game.go @@ -36,10 +36,14 @@ type game struct { w, h int currentLevel *Level - audioPlayer *audio.Player + audioPlayerGunshot *audio.Player + audioPlayerGib *audio.Player + audioPlayerDie *audio.Player player *gamePlayer + gameOverTime time.Time + camScale float64 camScaleTo float64 @@ -47,7 +51,7 @@ type game struct { spinnerIndex int - creeps []*creep + creeps []*gameCreep projectiles []*projectile @@ -114,20 +118,40 @@ func NewGame() (*game, error) { flashImage = ebiten.NewImageFromImage(img) - f, err = assetsFS.Open("assets/audio/gunshot.mp3") + loadSound := func(p string) (*audio.Player, error) { + f, err := assetsFS.Open(p) + if err != nil { + return nil, err + } + defer f.Close() + + gunshotSound, err := mp3.DecodeWithSampleRate(sampleRate, f) + if err != nil { + return nil, err + } + + return audioContext.NewPlayer(gunshotSound) + } + + g.audioPlayerGunshot, err = loadSound("assets/audio/gunshot.mp3") if err != nil { return nil, err } - gunshotSound, err := mp3.DecodeWithSampleRate(sampleRate, f) + g.audioPlayerGib, err = loadSound("assets/audio/gib.mp3") if err != nil { return nil, err } - g.audioPlayer, err = audioContext.NewPlayer(gunshotSound) + + g.audioPlayerDie, err = loadSound("assets/audio/die.mp3") if err != nil { return nil, err } + // The death sound will have a delay without this. + g.audioPlayerDie.SetVolume(0) + g.audioPlayerDie.Play() + f, err = assetsFS.Open("assets/creeps/vampire.png") if err != nil { return nil, err @@ -141,15 +165,18 @@ func NewGame() (*game, error) { addedCreeps := make(map[string]bool) for i := 0; i < 1000; i++ { - c := &creep{ - x: float64(1 + rand.Intn(64)), - y: float64(1 + rand.Intn(64)), - sprite: vampireImage, + c := NewCreep(vampireImage, g.currentLevel) + + safeSpace := 7.0 + dx, dy := deltaXY(g.player.x, g.player.y, c.x, c.y) + if dx <= safeSpace || dy <= safeSpace { + // Too close to the spawn point. + continue } addedCreep := fmt.Sprintf("%0.0f-%0.0f", c.x, c.y) if addedCreeps[addedCreep] { - // Already added a creep here + // Already added a gameCreep here. continue } @@ -159,6 +186,11 @@ func NewGame() (*game, error) { ebiten.SetCursorShape(ebiten.CursorShapeCrosshair) + // The death sound will have a delay without this. + g.audioPlayerDie.Pause() + g.audioPlayerDie.Rewind() + g.audioPlayerDie.SetVolume(1.6) + return g, nil } @@ -169,6 +201,11 @@ func (g *game) Update() error { return nil } + if g.player.health <= 0 { + // Game over. + return nil + } + for _, c := range g.creeps { c.Update() } @@ -239,21 +276,23 @@ func (g *game) Update() error { for _, c := range g.creeps { cx, cy := c.Position() - dx, dy := p.x-cx, p.y-cy - if dx < 0 { - dx *= -1 - } - if dy < 0 { - dy *= -1 - } + dx, dy := deltaXY(p.x, p.y, cx, cy) if dx <= bulletHitThreshold && dy <= bulletHitThreshold { - // Kill creep + // Kill gameCreep g.addBloodSplatter(cx, cy) c.x = 1000 c.y = 1000 + // Remove projectile g.projectiles = append(g.projectiles[:i-removed], g.projectiles[i-removed+1:]...) removed++ + + // Play gib sound. + g.audioPlayerGib.SetVolume(1.0) + g.audioPlayerGib.Pause() + g.audioPlayerGib.Rewind() + g.audioPlayerGib.Play() + break } } @@ -271,13 +310,15 @@ func (g *game) Update() error { g.projectiles = append(g.projectiles, p) v := 0.75 + (rand.Float64() / 4) - v = 1.0 // TODO + v = 0.6 // TODO g.player.weapon.lastFire = time.Now() - g.audioPlayer.SetVolume(v) - g.audioPlayer.Pause() - g.audioPlayer.Rewind() - g.audioPlayer.Play() + + // Play gunshot sound. + g.audioPlayerGunshot.SetVolume(v) + g.audioPlayerGunshot.Pause() + g.audioPlayerGunshot.Rewind() + g.audioPlayerGunshot.Play() } return nil @@ -321,8 +362,20 @@ func (g *game) addBloodSplatter(x, y float64) { // Draw draws the game on the screen. func (g *game) Draw(screen *ebiten.Image) { + // Game over. if g.player.health <= 0 { - screen.Fill(colornames.Red) + screen.Fill(color.RGBA{102, 0, 0, 255}) + + if time.Since(g.gameOverTime).Milliseconds()%2000 < 1500 { + g.overlayImg.Clear() + ebitenutil.DebugPrint(g.overlayImg, "GAME OVER") + g.op.GeoM.Reset() + g.op.GeoM.Translate(3, 0) + g.op.GeoM.Scale(16, 16) + g.op.GeoM.Translate(float64(g.w/2)-485, float64(g.h/2)-200) + screen.DrawImage(g.overlayImg, g.op) + } + return } @@ -415,15 +468,18 @@ func (g *game) renderLevel(screen *ebiten.Image) int { biteThreshold := 0.5 for _, c := range g.creeps { cx, cy := c.Position() - dx, dy := g.player.x-cx, g.player.y-cy - if dx < 0 { - dx *= -1 - } - if dy < 0 { - dy *= -1 - } + dx, dy := deltaXY(g.player.x, g.player.y, cx, cy) if dx <= biteThreshold && dy <= biteThreshold { g.player.health-- + + if g.player.health == 0 { + ebiten.SetCursorShape(ebiten.CursorShapeDefault) + + g.gameOverTime = time.Now() + + // Play die sound. + g.audioPlayerDie.Play() + } } drawn += g.renderSprite(c.x, c.y, 0, 0, 0, c.sprite, screen) @@ -459,3 +515,14 @@ func (g *game) renderLevel(screen *ebiten.Image) int { func (g *game) exit() { os.Exit(0) } + +func deltaXY(x1, y1, x2, y2 float64) (dx float64, dy float64) { + dx, dy = x1-x2, y1-y2 + if dx < 0 { + dx *= -1 + } + if dy < 0 { + dy *= -1 + } + return dx, dy +} diff --git a/level.go b/level.go index 5aad8e5..9a3dc29 100644 --- a/level.go +++ b/level.go @@ -27,6 +27,20 @@ func (l *Level) Size() (width, height int) { return l.w, l.h } +func (l *Level) Clamp(x, y float64) (float64, float64) { + if x < 0 { + x = 0 + } else if x > float64(l.w)-1 { + x = float64(l.w) + } + if y < 0 { + y = 0 + } else if y > float64(l.h)-1 { + y = float64(l.h) + } + return x, y +} + // NewLevel returns a new randomly generated Level. func NewLevel() (*Level, error) { // Create a 108x108 Level. diff --git a/player.go b/player.go index 29ec125..1edb258 100644 --- a/player.go +++ b/player.go @@ -34,7 +34,7 @@ func NewPlayer() (*gamePlayer, error) { sprite: uziSprite, cooldown: 100 * time.Millisecond, }, - health: 70, + health: 7, } return p, nil }