Minor tweaks to flygoblin.

This commit is contained in:
2024-11-15 18:40:08 -05:00
parent a4a532edec
commit fd46346346
4 changed files with 236 additions and 36 deletions

View File

@@ -4,7 +4,6 @@ import (
"fmt"
"image/color"
"math"
"math/rand/v2"
"mover/assets"
"mover/elements"
"mover/fonts"
@@ -24,16 +23,17 @@ type Canvas struct {
eventmap map[gamedata.GameEvent]func()
initialized bool
lastInputs gamedata.GameInputs
runtime float64
counter int
score int
hero *elements.Hero
charge *elements.Explosion
enemies []elements.Enemies
projectiles []*elements.Projectile
gameover bool
initialized bool
goblinspawned bool
lastInputs gamedata.GameInputs
runtime float64
counter int
score int
hero *elements.Hero
charge *elements.Explosion
enemies []elements.Enemies
projectiles []*elements.Projectile
gameover bool
}
func NewCanvas(a gamedata.Area) *Canvas {
@@ -41,12 +41,13 @@ func NewCanvas(a gamedata.Area) *Canvas {
Sprite: ebiten.NewImage(a.Width, a.Height),
projectileMask: ebiten.NewImage(a.Width, a.Height),
collisionMask: ebiten.NewImage(a.Width, a.Height),
heroCollisionMask: ebiten.NewImage(46, 46),
heroCollisionCpy: ebiten.NewImage(46, 46),
heroCollisionMask: ebiten.NewImage(48, 48),
heroCollisionCpy: ebiten.NewImage(48, 48),
hero: elements.NewHero(),
charge: elements.NewExplosion(),
initialized: false,
gameover: false,
goblinspawned: false,
score: 0,
runtime: 0.,
}
@@ -97,8 +98,16 @@ func (c *Canvas) Draw(drawimg *ebiten.Image) {
for _, e := range c.enemies {
e.Draw()
op := &ebiten.DrawImageOptions{}
op.GeoM.Translate(e.GetPosition().X-46/2, e.GetPosition().Y-46/2)
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())
y0 := e.GetPosition().Y - 2/3.*float64(e.GetSprite().Bounds().Dy())
vector.DrawFilledRect(c.Sprite, float32(x0), float32(y0), 204, 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)
}
}
for _, p := range c.projectiles {
@@ -140,6 +149,7 @@ func (c *Canvas) Initialize() {
c.score = 0
c.counter = 0
c.runtime = 0.
c.goblinspawned = false
//temporary
c.hero.Action = elements.HeroActionDefault
@@ -168,8 +178,8 @@ func (c *Canvas) UpdateHeroPosition() {
func (c *Canvas) ComputeHeroCollisions() {
for _, e := range c.enemies {
//compute collision with hero
if c.hero.Pos.X >= e.GetPosition().X-46/2 && c.hero.Pos.X <= e.GetPosition().X+46/2 &&
c.hero.Pos.Y >= e.GetPosition().Y-46/2 && c.hero.Pos.Y <= e.GetPosition().Y+46/2 &&
if c.hero.Pos.X >= e.GetPosition().X-float64(e.GetSprite().Bounds().Dx())/2 && c.hero.Pos.X <= e.GetPosition().X+float64(e.GetSprite().Bounds().Dx())/2 &&
c.hero.Pos.Y >= e.GetPosition().Y-float64(e.GetSprite().Bounds().Dy())/2 && c.hero.Pos.Y <= e.GetPosition().Y+float64(e.GetSprite().Bounds().Dy())/2 &&
e.GetEnemyState() < gamedata.EnemyStateDying {
// target.Action < elements.MoverActionDying && g.hero.Action < elements.HeroActionDying {
@@ -183,7 +193,7 @@ func (c *Canvas) ComputeHeroCollisions() {
op.GeoM.Translate((c.hero.Pos.X-e.GetPosition().X)-float64(e.GetSprite().Bounds().Dx())/2, (c.hero.Pos.Y-e.GetPosition().Y)-float64(e.GetSprite().Bounds().Dy())/2)
c.heroCollisionMask.DrawImage(e.GetSprite(), op)
if c.HasCollided(c.heroCollisionMask, 46*46*4) {
if c.HasCollided(c.heroCollisionMask, 48*48*4) {
c.hero.SetHit()
c.gameover = true
@@ -341,30 +351,37 @@ func (c *Canvas) UpdateEnemies() {
e.Update()
}
if !c.gameover {
//spawn new enemies
f := 40000 / (c.counter + 1)
/*
//spawn new enemies
f := 40000 / (c.counter + 1)
if c.counter%f == 0 {
newenemy := elements.NewFlyEye()
if c.counter%f == 0 {
newenemy := elements.NewFlyEye()
x0 := rand.Float64() * 640
y0 := rand.Float64() * 480
quadrant := rand.IntN(3)
x0 := rand.Float64() * 640
y0 := rand.Float64() * 480
quadrant := rand.IntN(3)
switch quadrant {
case 0:
newenemy.SetPosition(gamedata.Coordinates{X: x0, Y: -48})
case 1:
newenemy.SetPosition(gamedata.Coordinates{X: x0, Y: 480 + 48})
case 2:
newenemy.SetPosition(gamedata.Coordinates{X: -48, Y: y0})
case 3:
newenemy.SetPosition(gamedata.Coordinates{X: 640 + x0, Y: y0})
}
switch quadrant {
case 0:
newenemy.SetPosition(gamedata.Coordinates{X: x0, Y: -48})
case 1:
newenemy.SetPosition(gamedata.Coordinates{X: x0, Y: 480 + 48})
case 2:
newenemy.SetPosition(gamedata.Coordinates{X: -48, Y: y0})
case 3:
newenemy.SetPosition(gamedata.Coordinates{X: 640 + x0, Y: y0})
}
newenemy.SetTarget(c.hero.Pos)
newenemy.SetTarget(c.hero.Pos)
c.enemies = append(c.enemies, newenemy)
c.enemies = append(c.enemies, newenemy)
}*/
if !c.goblinspawned {
newfg := elements.NewFlyGoblin()
c.enemies = append(c.enemies, newfg)
c.goblinspawned = true
}
}
}