From ada9ada6f9f2f40ef2ea40fcb6481caf142b3a6e Mon Sep 17 00:00:00 2001 From: Trevor Slocum Date: Thu, 7 Oct 2021 19:36:24 -0700 Subject: [PATCH] Add hurt sound --- .gitignore | 1 + assets/audio/hurt.wav | Bin 0 -> 34108 bytes audio.go | 46 +++++++++++++++++++++ game.go | 93 ++++++++++++++++++++---------------------- go.mod | 4 +- go.sum | 8 ++-- 6 files changed, 97 insertions(+), 55 deletions(-) create mode 100644 assets/audio/hurt.wav create mode 100644 audio.go diff --git a/.gitignore b/.gitignore index ded7d35..1569417 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .idea carotidartillery +*.wasm diff --git a/assets/audio/hurt.wav b/assets/audio/hurt.wav new file mode 100644 index 0000000000000000000000000000000000000000..ccfd43883d374d59259b70b6b98ab8caaa11fc07 GIT binary patch literal 34108 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%0AuV+tS*=uMXh*6XCnraF06h%{gFaJZIx$3;ryj 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 wW=ij;Dc+cT5-8Li35Lt1H0pDcs{jB1 literal 0 HcmV?d00001 diff --git a/audio.go b/audio.go new file mode 100644 index 0000000..3ad9ef6 --- /dev/null +++ b/audio.go @@ -0,0 +1,46 @@ +package main + +import ( + "github.com/hajimehoshi/ebiten/v2/audio" + "github.com/hajimehoshi/ebiten/v2/audio/mp3" + "github.com/hajimehoshi/ebiten/v2/audio/wav" +) + +const ( + SoundGunshot = iota + SoundVampireDie1 + SoundVampireDie2 + SoundPlayerHurt + SoundPlayerDie + SoundGib +) + +func loadMP3(context *audio.Context, p string) (*audio.Player, error) { + f, err := assetsFS.Open(p) + if err != nil { + return nil, err + } + defer f.Close() + + stream, err := mp3.DecodeWithSampleRate(sampleRate, f) + if err != nil { + return nil, err + } + + return context.NewPlayer(stream) +} + +func loadWav(context *audio.Context, p string) (*audio.Player, error) { + f, err := assetsFS.Open(p) + if err != nil { + return nil, err + } + defer f.Close() + + stream, err := wav.DecodeWithSampleRate(sampleRate, f) + if err != nil { + return nil, err + } + + return context.NewPlayer(stream) +} diff --git a/game.go b/game.go index 601ed29..539de56 100644 --- a/game.go +++ b/game.go @@ -1,7 +1,6 @@ package main import ( - "bytes" "fmt" "image" "image/color" @@ -13,8 +12,6 @@ import ( "runtime/pprof" "time" - "github.com/hajimehoshi/ebiten/v2/audio/mp3" - "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/audio" "github.com/hajimehoshi/ebiten/v2/ebitenutil" @@ -43,12 +40,6 @@ type game struct { w, h int currentLevel *Level - soundGunshot []byte - soundVampireDie1 []byte - soundVampireDie2 []byte - soundGib []byte - soundDie []byte - player *gamePlayer gameOverTime time.Time @@ -70,6 +61,8 @@ type game struct { op *ebiten.DrawImageOptions audioContext *audio.Context + nextSound map[int]int + soundBuffer map[int][]*audio.Player godMode bool debugMode bool @@ -98,6 +91,9 @@ func NewGame() (*game, error) { mousePanY: math.MinInt32, player: p, op: &ebiten.DrawImageOptions{}, + + soundBuffer: make(map[int][]*audio.Player), + nextSound: make(map[int]int), } g.audioContext = audio.NewContext(sampleRate) @@ -133,39 +129,36 @@ func NewGame() (*game, error) { flashImage = ebiten.NewImageFromImage(img) - loadSound := func(p string) ([]byte, error) { - b, err := assetsFS.ReadFile(p) + for i := 0; i < 4; i++ { + stream, err := loadMP3(g.audioContext, "assets/audio/gunshot.mp3") if err != nil { return nil, err } - defer f.Close() + g.soundBuffer[SoundGunshot] = append(g.soundBuffer[SoundGunshot], stream) - return b, nil - } + stream, err = loadMP3(g.audioContext, "assets/audio/vampiredie1.mp3") + if err != nil { + return nil, err + } + g.soundBuffer[SoundVampireDie1] = append(g.soundBuffer[SoundVampireDie1], stream) - g.soundGunshot, err = loadSound("assets/audio/gunshot.mp3") - if err != nil { - return nil, err - } + stream, err = loadMP3(g.audioContext, "assets/audio/vampiredie2.mp3") + if err != nil { + return nil, err + } + g.soundBuffer[SoundVampireDie2] = append(g.soundBuffer[SoundVampireDie2], stream) - g.soundGib, err = loadSound("assets/audio/gib.mp3") - if err != nil { - return nil, err - } + stream, err = loadWav(g.audioContext, "assets/audio/hurt.wav") + if err != nil { + return nil, err + } + g.soundBuffer[SoundPlayerHurt] = append(g.soundBuffer[SoundPlayerHurt], stream) - g.soundVampireDie1, err = loadSound("assets/audio/vampiredie1.mp3") - if err != nil { - return nil, err - } - - g.soundVampireDie2, err = loadSound("assets/audio/vampiredie2.mp3") - if err != nil { - return nil, err - } - - g.soundDie, err = loadSound("assets/audio/die.mp3") - if err != nil { - return nil, err + stream, err = loadMP3(g.audioContext, "assets/audio/die.mp3") + if err != nil { + return nil, err + } + g.soundBuffer[SoundPlayerDie] = append(g.soundBuffer[SoundPlayerDie], stream) } f, err = assetsFS.Open("assets/creeps/vampire.png") @@ -205,16 +198,14 @@ func NewGame() (*game, error) { return g, nil } -func (g *game) playSound(sound []byte, volume float64) error { - stream, err := mp3.DecodeWithSampleRate(sampleRate, bytes.NewReader(sound)) - if err != nil { - return err - } - - player, err := g.audioContext.NewPlayer(stream) - if err != nil { - return err +func (g *game) playSound(sound int, volume float64) error { + player := g.soundBuffer[sound][g.nextSound[sound]] + g.nextSound[sound]++ + if g.nextSound[sound] > 3 { + g.nextSound[sound] = 0 } + player.Pause() + player.Rewind() player.SetVolume(volume) player.Play() return nil @@ -235,9 +226,9 @@ func (g *game) hurtCreep(c *gameCreep, damage int) error { g.player.score += c.killScore // Play vampire die sound. - dieSound := g.soundVampireDie1 + dieSound := SoundVampireDie1 if rand.Intn(2) == 1 { - dieSound = g.soundVampireDie2 + dieSound = SoundVampireDie2 } err := g.playSound(dieSound, 0.25) if err != nil { @@ -365,7 +356,7 @@ func (g *game) Update() error { g.player.weapon.lastFire = time.Now() // Play gunshot sound. - err := g.playSound(g.soundGunshot, 0.4) + err := g.playSound(SoundGunshot, 0.4) if err != nil { return err } @@ -587,7 +578,11 @@ func (g *game) renderLevel(screen *ebiten.Image) int { panic(err) } - // TODO play ouch sound + if g.player.health == 2 { + g.playSound(SoundPlayerHurt, 0.4) + } else if g.player.health == 1 { + g.playSound(SoundPlayerHurt, 0.8) + } g.addBloodSplatter(g.player.x, g.player.y) @@ -597,7 +592,7 @@ func (g *game) renderLevel(screen *ebiten.Image) int { g.gameOverTime = time.Now() // Play die sound. - err := g.playSound(g.soundDie, 1.6) + err := g.playSound(SoundPlayerDie, 1.6) if err != nil { // TODO return err panic(err) diff --git a/go.mod b/go.mod index 9b026f5..1bf6565 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module code.rocketnine.space/tslocum/carotidartillery go 1.17 require ( - github.com/hajimehoshi/ebiten/v2 v2.3.0-alpha.0.20211005153847-3f5d1762bb36 + github.com/hajimehoshi/ebiten/v2 v2.3.0-alpha.0.20211007133459-69087cdc4006 golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d golang.org/x/text v0.3.7 ) @@ -16,5 +16,5 @@ require ( golang.org/x/exp v0.0.0-20210916165020-5cb4fee858ee // indirect golang.org/x/mobile v0.0.0-20210924032853-1c027f395ef7 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20211006225509-1a26e0398eed // indirect + golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac // indirect ) diff --git a/go.sum b/go.sum index e4319c4..cccbb83 100644 --- a/go.sum +++ b/go.sum @@ -97,8 +97,8 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hajimehoshi/bitmapfont/v2 v2.1.3/go.mod h1:2BnYrkTQGThpr/CY6LorYtt/zEPNzvE/ND69CRTaHMs= -github.com/hajimehoshi/ebiten/v2 v2.3.0-alpha.0.20211005153847-3f5d1762bb36 h1:zp4kNpTpsWJ9OtUrbPkA9PCLUKk1Y1WHjpMLadVpwOI= -github.com/hajimehoshi/ebiten/v2 v2.3.0-alpha.0.20211005153847-3f5d1762bb36/go.mod h1:olKl/qqhMBBAm2oI7Zy292nCtE+nitlmYKNF3UpbFn0= +github.com/hajimehoshi/ebiten/v2 v2.3.0-alpha.0.20211007133459-69087cdc4006 h1:81tAk6qxukWmcaP7zURm7jiIQ8efdDms6oGYRTeWIA8= +github.com/hajimehoshi/ebiten/v2 v2.3.0-alpha.0.20211007133459-69087cdc4006/go.mod h1:olKl/qqhMBBAm2oI7Zy292nCtE+nitlmYKNF3UpbFn0= github.com/hajimehoshi/file2byteslice v0.0.0-20210813153925-5340248a8f41/go.mod h1:CqqAHp7Dk/AqQiwuhV1yT2334qbA/tFWQW0MD2dGqUE= github.com/hajimehoshi/go-mp3 v0.3.2 h1:xSYNE2F3lxtOu9BRjCWHHceg7S91IHfXfXp5+LYQI7s= github.com/hajimehoshi/go-mp3 v0.3.2/go.mod h1:qMJj/CSDxx6CGHiZeCgbiq2DSUkbK0UbtXShQcnfyMM= @@ -369,8 +369,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211006225509-1a26e0398eed h1:E159xujlywdAeN3FqsTBPzRKGUq/pDHolXbuttkC36E= -golang.org/x/sys v0.0.0-20211006225509-1a26e0398eed/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=