boxbrawl/system/player.go

106 lines
2.1 KiB
Go
Raw Permalink Normal View History

2023-01-05 20:16:01 +00:00
package system
import (
"image"
"code.rocketnine.space/tslocum/boxbrawl/component"
"code.rocketnine.space/tslocum/boxbrawl/world"
"code.rocketnine.space/tslocum/gohan"
"github.com/hajimehoshi/ebiten/v2"
2023-01-05 22:28:24 +00:00
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
2023-01-05 20:16:01 +00:00
)
type PlayerSystem struct {
*component.Once
initialized bool
debugImg *ebiten.Image
}
func (s *PlayerSystem) initialize() {
}
func (s *PlayerSystem) Update(e gohan.Entity) error {
if !s.initialized {
s.initialize()
}
if world.ConnectPromptVisible {
return nil
}
return nil
}
func (s *PlayerSystem) Draw(e gohan.Entity, screen *ebiten.Image) error {
if world.ConnectPromptVisible {
return nil
}
size := 20
2023-01-24 06:29:04 +00:00
var p, o *component.Player
2023-01-05 20:16:01 +00:00
for i := 0; i < 2; i++ {
if i == 0 {
p = &world.Player1
2023-01-24 06:29:04 +00:00
o = &world.Player2
2023-01-05 20:16:01 +00:00
} else {
p = &world.Player2
2023-01-24 06:29:04 +00:00
o = &world.Player1
}
var sprite *ebiten.Image
frameData := component.FrameDataForActionTick(p.Action, p.ActionTicksLeft)
for _, frame := range frameData {
if frame.S == nil {
continue
}
sprite = frame.S
break
}
2023-02-01 01:29:47 +00:00
drawCrouch := p.Crouching || (p.Action == component.ActionIdle && p.CrouchFrame != 0)
2023-02-01 00:45:20 +00:00
if p.Walking() {
2023-02-01 01:29:47 +00:00
if drawCrouch {
if p.CrouchFrame == 9 {
sprite = component.CrouchWalkFrames[p.WalkFrame]
} else {
sprite = component.CrouchFrames[p.CrouchFrame]
}
} else {
sprite = component.WalkFrames[p.WalkFrame]
}
} else if drawCrouch {
sprite = component.CrouchFrames[p.CrouchFrame]
2023-02-01 00:45:20 +00:00
}
2023-01-24 06:29:04 +00:00
if sprite != nil {
x, y := world.GameCoordsToScreen(p.X-24, p.Y+64)
op := &ebiten.DrawImageOptions{}
if component.PlayerOnRightSide(*p, *o) {
op.GeoM.Scale(-1, 1)
op.GeoM.Translate(64, 0)
}
op.GeoM.Translate(float64(x), float64(y))
op.ColorM.ScaleWithColor(p.Color)
screen.DrawImage(sprite, op)
continue // TODO
2023-01-05 20:16:01 +00:00
}
2023-01-19 00:41:13 +00:00
r := image.Rect(int(p.X), int(p.Y), int(p.X)+size, int(p.Y)+size)
2023-01-13 23:31:17 +00:00
screen.SubImage(world.GameRectToScreen(r)).(*ebiten.Image).Fill(p.Color)
2023-01-05 22:28:24 +00:00
2023-01-10 07:10:33 +00:00
// TODO animate
2023-01-05 22:28:24 +00:00
switch p.Action {
case component.ActionPunch:
ebitenutil.DebugPrintAt(screen, "PUNCH", int(p.X), int(p.Y))
}
2023-01-05 20:16:01 +00:00
}
return nil
}