Files
survive/hero.go
2024-11-08 07:29:34 -05:00

156 lines
2.7 KiB
Go

package main
import (
"bytes"
"image"
"log"
_ "embed"
"image/color"
_ "image/png"
"github.com/hajimehoshi/ebiten/v2"
)
var (
heroImage *ebiten.Image
heroDeath *ebiten.Image
//go:embed hero.png
hero_img []byte
//go:embed herodeath.png
herodeath_img []byte
)
const (
HeroActionDefault = iota
HeroActionDamaged
HeroActionDying
HeroActionExploding
HeroActionDead
HeroActionMax
)
type HeroAction uint
func init() {
img, _, err := image.Decode(bytes.NewReader(hero_img))
if err != nil {
log.Fatal(err)
}
heroImage = ebiten.NewImageFromImage(img)
img, _, err = image.Decode(bytes.NewReader(herodeath_img))
if err != nil {
log.Fatal(err)
}
heroDeath = ebiten.NewImageFromImage(img)
}
type Hero struct {
Sprite *ebiten.Image
Maks *ebiten.Image
MaksDest *ebiten.Image
Angle float64
Pos Coordinates
Origin Coordinates
Lastpos Coordinates
Action HeroAction
cycles int
rotating bool
Toggled bool
Hit bool
Touched bool
Left bool
dyingcount int
}
func NewHero() *Hero {
m := &Hero{
Sprite: ebiten.NewImage(MOVER_WIDTH, MOVER_HEIGHT),
Maks: ebiten.NewImage(MOVER_WIDTH, MOVER_HEIGHT),
MaksDest: ebiten.NewImage(MOVER_WIDTH, MOVER_HEIGHT),
Action: HeroActionDefault,
cycles: 4,
Angle: 0,
rotating: false,
Toggled: false,
dyingcount: 0,
}
m.Maks.Fill(color.White)
return m
}
func (m *Hero) ToggleRotate() {
m.rotating = !m.rotating
}
func (m *Hero) SetAngle(a float64) {
m.Angle = a
}
func (m *Hero) SetOrigin(coords Coordinates) {
m.Origin = coords
m.Pos = coords
}
func (m *Hero) Draw() {
m.Sprite.Clear()
m.MaksDest.Clear()
idx := (m.cycles / 8) % 4
y0 := 0
y1 := 48
x0 := 48 * idx
x1 := x0 + 48
op := &ebiten.DrawImageOptions{}
if m.Left {
op.GeoM.Scale(-1, 1)
op.GeoM.Translate(MOVER_WIDTH, 0)
}
switch m.Action {
case HeroActionDefault:
m.Sprite.DrawImage(heroImage.SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), op)
case HeroActionDying:
m.Sprite.DrawImage(heroDeath.SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), op)
if m.dyingcount >= 31 {
m.cycles = 0
m.Action++
}
case HeroActionExploding:
m.Sprite.DrawImage(heroDeath.SubImage(image.Rect(48*3, 0, 48*4, 48)).(*ebiten.Image), op)
default:
}
}
func (m *Hero) Update() {
if m.Action == HeroActionDying {
m.dyingcount++
}
m.cycles++
}
// one hit death for the hero
func (m *Hero) SetHit() {
m.Action = HeroActionDying
m.dyingcount = 0
m.Angle = 0
m.cycles = 0
}
func (m *Hero) ToggleColor() {
//m.Toggled = !m.Toggled
if m.Action == HeroActionDefault {
m.Action = HeroActionDamaged
} else if m.Action == HeroActionDamaged {
m.Action = HeroActionDefault
}
}