Files
survive/elements/flyeye.go

164 lines
3.3 KiB
Go

package elements
import (
"image"
"image/color"
"math"
"mover/assets"
"mover/gamedata"
"github.com/hajimehoshi/ebiten/v2"
)
type FlyEye struct {
Sprite *ebiten.Image
Maks *ebiten.Image
MaksDest *ebiten.Image
position gamedata.Coordinates
target gamedata.Coordinates
state gamedata.EnemyState
cycle int
dyingcount int
hit bool
touched bool
toggle bool
sploding bool
}
func NewFlyEye() *FlyEye {
f := &FlyEye{
Sprite: ebiten.NewImage(46, 46),
Maks: ebiten.NewImage(48, 48),
MaksDest: ebiten.NewImage(48, 48),
cycle: 0,
dyingcount: 0,
hit: false,
touched: false,
toggle: false,
sploding: false,
}
f.Maks.Fill(color.White)
return f
}
func (f *FlyEye) Update() error {
//close loop on target
if f.state <= gamedata.EnemyStateHit {
dx := f.target.X - f.position.X
dy := f.target.Y - f.position.Y
if math.Abs(dx) > 3 || math.Abs(dy) > 3 {
angle := math.Atan2(dy, dx)
f.position.X += math.Cos(angle) * 3
f.position.Y += math.Sin(angle) * 3
}
}
if f.state == gamedata.EnemyStateDying {
f.dyingcount++
}
f.cycle++
return nil
}
func (f *FlyEye) Draw() {
f.Sprite.Clear()
f.MaksDest.Clear()
idx := (f.cycle / 8) % 4
y0 := 0
y1 := 48
x0 := 48 * idx
x1 := x0 + 48
switch f.state {
case gamedata.EnemyStateDefault:
if !f.toggle {
f.Sprite.DrawImage(assets.ImageBank[assets.FlyEyeNormal].SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), nil)
} else {
f.Sprite.DrawImage(assets.ImageBank[assets.FlyEyeDamaged].SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), nil)
}
case gamedata.EnemyStateDying:
//after some condition, set to exploding
if (f.cycle/5)%2 == 0 {
f.MaksDest.DrawImage(assets.ImageBank[assets.FlyEyeDamaged].SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), nil)
op := &ebiten.DrawImageOptions{}
op.GeoM.Reset()
op.Blend = ebiten.BlendSourceAtop
f.MaksDest.DrawImage(f.Maks, op)
f.Sprite.DrawImage(f.MaksDest, nil)
} else {
f.Sprite.DrawImage(assets.ImageBank[assets.FlyEyeDamaged].SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), nil)
}
if f.dyingcount >= 31 {
f.cycle = 0
f.state = gamedata.EnemyStateExploding
}
case gamedata.EnemyStateExploding:
f.Sprite.DrawImage(assets.ImageBank[assets.FlyEyeDying].SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), nil)
if idx == 3 {
f.state = gamedata.EnemyStateDead
}
}
}
func (f *FlyEye) GetPosition() gamedata.Coordinates {
return f.position
}
func (f *FlyEye) SetTarget(p gamedata.Coordinates) {
f.target = p
}
func (f *FlyEye) GetSprite() *ebiten.Image {
return f.Sprite
}
func (f *FlyEye) SetHit() {
f.hit = true
f.state = gamedata.EnemyStateDying
f.cycle = 0
}
func (f *FlyEye) IsTouched() bool {
return f.touched
}
func (f *FlyEye) SetTouched() {
f.touched = true
}
func (f *FlyEye) ClearTouched() {
f.touched = false
}
func (f *FlyEye) SetToggle() {
f.toggle = !f.toggle
}
func (f *FlyEye) IsToggled() bool {
return f.toggle
}
func (f *FlyEye) GetEnemyState() gamedata.EnemyState {
return f.state
}
func (f *FlyEye) SetPosition(p gamedata.Coordinates) {
f.position = p
}
func (f *FlyEye) ExplosionInitiated() bool {
return f.sploding
}
func (f *FlyEye) SetExplosionInitiated() {
f.sploding = true
}