diff --git a/assets/audiobank.go b/assets/audiobank.go index 33c51e6..3f8ecb3 100644 --- a/assets/audiobank.go +++ b/assets/audiobank.go @@ -41,6 +41,8 @@ var ( PauseIn []byte //go:embed pauseout.wav PauseOut []byte + //go:embed flare.wav + Flare []byte ) func LoadSounds() { diff --git a/assets/flare.wav b/assets/flare.wav new file mode 100644 index 0000000..3f2bc42 Binary files /dev/null and b/assets/flare.wav differ diff --git a/elements/flyeye.go b/elements/flyeye.go index cf67901..cb27522 100644 --- a/elements/flyeye.go +++ b/elements/flyeye.go @@ -19,6 +19,7 @@ type FlyEye struct { state gamedata.EnemyState cycle int dyingcount int + health int hit bool touched bool toggle bool @@ -30,6 +31,7 @@ func NewFlyEye() *FlyEye { Sprite: ebiten.NewImage(46, 46), Maks: ebiten.NewImage(48, 48), MaksDest: ebiten.NewImage(48, 48), + health: 0, cycle: 0, dyingcount: 0, hit: false, @@ -124,6 +126,7 @@ func (f *FlyEye) SetHit() { f.hit = true f.state = gamedata.EnemyStateDying f.cycle = 0 + f.health-- } func (f *FlyEye) IsTouched() bool { @@ -165,7 +168,7 @@ func (f *FlyEye) SetExplosionInitiated() { func (f *FlyEye) Health() int { //health bars reserved for special enemies, flyeye is a one //hitter so returning zero ensure no health bar is rendered - return 0 + return f.health } func (f *FlyEye) MaxHealth() int { diff --git a/gamedata/gameevents.go b/gamedata/gameevents.go index 2b0e0b0..f35acd5 100644 --- a/gamedata/gameevents.go +++ b/gamedata/gameevents.go @@ -8,4 +8,5 @@ const ( GameEventNewShot GameEventTargetHit GameEventExplosion + GameEventFireball ) diff --git a/gameelement/canvas.go b/gameelement/canvas.go index 0fdb30d..4daccaa 100644 --- a/gameelement/canvas.go +++ b/gameelement/canvas.go @@ -68,12 +68,11 @@ func (c *Canvas) Update() error { if !c.initialized { c.Initialize() } else { - //update positions() - //hero first c.UpdateHero() c.UpdateProjectiles() c.UpdateCharge() c.UpdateEnemies() + c.SpawnEnemies() c.CleanupTargets() c.counter++ } @@ -100,6 +99,7 @@ func (c *Canvas) Draw(drawimg *ebiten.Image) { c.Sprite.DrawImage(assets.ImageBank[assets.Weapon], op) } + //draw enemy shadows for _, es := range c.enemies { if es.GetEnemyState() < gamedata.EnemyStateExploding { @@ -116,6 +116,7 @@ func (c *Canvas) Draw(drawimg *ebiten.Image) { } } + //draw enemies for _, e := range c.enemies { e.Draw() @@ -127,13 +128,15 @@ func (c *Canvas) Draw(drawimg *ebiten.Image) { op.GeoM.Rotate(e.GetAngle()) op.GeoM.Translate(e.GetPosition().X, e.GetPosition().Y) - //op := &ebiten.DrawImageOptions{} - //op.GeoM.Translate(e.GetPosition().X-float64(e.GetSprite().Bounds().Dx())/2, e.GetPosition().Y-float64(e.GetSprite().Bounds().Dy())/2) c.Sprite.DrawImage(e.GetSprite(), op) //do we need a health bar for this enemy? if e.Health() > 0 { - x0 := e.GetPosition().X - float64(e.GetSprite().Bounds().Dx()) + + hbWidth := float64(e.MaxHealth())*2 + 4 + p1 := float64(e.GetSprite().Bounds().Dx()) + p0 := e.GetPosition().X - p1/2 + x0 := p0 - (hbWidth-p1)/2 y0 := e.GetPosition().Y - 2/3.*float64(e.GetSprite().Bounds().Dy()) vector.DrawFilledRect(c.Sprite, float32(x0), float32(y0), float32(e.MaxHealth())*2+4, 12, color.Black, true) vector.DrawFilledRect(c.Sprite, float32(x0+2), float32(y0+2), float32(e.Health())*2, 8, color.RGBA{R: 0xff, G: 0x00, B: 0x00, A: 0xff}, true) @@ -165,7 +168,6 @@ func (c *Canvas) Draw(drawimg *ebiten.Image) { text.Draw(c.Sprite, "PRESS START TO TRY AGAIN", fonts.SurviveFont.Arcade, 640/2-150, 480/2, color.White) } - //op := &ebiten.DrawImageOptions{} op.GeoM.Reset() drawimg.DrawImage(c.Sprite, op) } @@ -293,16 +295,9 @@ func (c *Canvas) UpdateProjectiles() { c.collisionMask.DrawImage(e.GetSprite(), op) if c.HasCollided(c.collisionMask, 640*480*4) { - //fmt.Println("pixel collision") - //delete(g.projectiles, k) projectilevalid = false - //target.ToggleColor() e.SetHit() - //target.SetOrigin(gamedata.Coordinates{X: rand.Float64() * 640, Y: rand.Float64() * 480}) - //target.Hit = true - /*player := audioContext.NewPlayerFromBytes(assets.TargetHit) - player.Play()*/ if c.eventmap[gamedata.GameEventTargetHit] != nil { c.eventmap[gamedata.GameEventTargetHit]() } @@ -381,13 +376,17 @@ func (c *Canvas) UpdateEnemies() { e.Update() } + +} + +func (c *Canvas) SpawnEnemies() { if !c.gameover { if !c.goblinspawned || c.goblindead { c.SpawnFlyEyes() } - if !c.goblinspawned { //&& c.counter > 1200 && !c.goblindead { + if !c.goblinspawned && c.counter > 2400 && !c.goblindead { c.SpawnGoblin() } @@ -508,5 +507,9 @@ func (c *Canvas) GoblinFireballEvent() { newfb.SetPosition(c.goblin.GetPosition()) c.enemies = append(c.enemies, newfb) + if c.eventmap[gamedata.GameEventFireball] != nil { + c.eventmap[gamedata.GameEventFireball]() + } + } } diff --git a/screens/primary.go b/screens/primary.go index 8175caf..9acee33 100644 --- a/screens/primary.go +++ b/screens/primary.go @@ -47,6 +47,7 @@ func NewPrimary() *Primary { canvas.RegisterEvents(gamedata.GameEventNewShot, p.EventHandlerNewShot) canvas.RegisterEvents(gamedata.GameEventTargetHit, p.EventHandlerTargetHit) canvas.RegisterEvents(gamedata.GameEventExplosion, p.EventHandlerExplosion) + canvas.RegisterEvents(gamedata.GameEventFireball, p.EventHandlerFireball) p.elements = append(p.elements, canvas) //create foreground cloud layer @@ -211,6 +212,9 @@ func (p *Primary) PlayAudio(e gamedata.GameEvent) { case gamedata.GameEventExplosion: player := audioContext.NewPlayerFromBytes(assets.Splode) player.Play() + case gamedata.GameEventFireball: + player := audioContext.NewPlayerFromBytes(assets.Flare) + player.Play() } } @@ -234,3 +238,7 @@ func (p *Primary) EventHandlerTargetHit() { func (p *Primary) EventHandlerExplosion() { p.gameevents[gamedata.GameEventExplosion] = true } + +func (p *Primary) EventHandlerFireball() { + p.gameevents[gamedata.GameEventFireball] = true +}