|
|
|
@ -4,6 +4,10 @@ import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"image"
|
|
|
|
|
"image/color"
|
|
|
|
|
|
|
|
|
|
"code.rocketnine.space/tslocum/boxbrawl/asset"
|
|
|
|
|
|
|
|
|
|
"github.com/hajimehoshi/ebiten/v2"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type PlayerAction int
|
|
|
|
@ -18,7 +22,7 @@ const (
|
|
|
|
|
type HitboxType int
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
HitboxInvalid HitboxType = iota
|
|
|
|
|
HitboxNone HitboxType = iota
|
|
|
|
|
HitboxNormal
|
|
|
|
|
HitboxHurt
|
|
|
|
|
)
|
|
|
|
@ -26,22 +30,119 @@ const (
|
|
|
|
|
type FrameData struct {
|
|
|
|
|
T HitboxType
|
|
|
|
|
R image.Rectangle
|
|
|
|
|
S *ebiten.Image
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const PlayerSize = 20
|
|
|
|
|
const PlayerSize = 16
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
PlayerHeight = 48
|
|
|
|
|
PlayerWidth = 16
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// stdHit returns FrameData using a standard hitbox and the provided sprite.
|
|
|
|
|
func stdHit(sprite *ebiten.Image) FrameData {
|
|
|
|
|
return FrameData{
|
|
|
|
|
T: HitboxNormal,
|
|
|
|
|
R: image.Rect(0, 0, PlayerWidth, PlayerHeight),
|
|
|
|
|
S: sprite,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// AllPlayerFrames defines all frame data for the game. Frames are defined in reverse order.
|
|
|
|
|
var AllPlayerFrames = [][][]FrameData{
|
|
|
|
|
{ // ActionIdle
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
T: HitboxNormal,
|
|
|
|
|
R: image.Rect(0, 0, PlayerSize, PlayerSize),
|
|
|
|
|
},
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 0, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 1, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 2, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 3, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 4, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 5, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 6, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 7, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 8, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 9, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 10, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 11, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 12, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 13, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 14, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 15, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 16, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 17, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 18, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 19, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 20, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 21, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 22, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 23, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 24, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 25, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 26, 0)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 27, 0)),
|
|
|
|
|
},
|
|
|
|
|
}, { // ActionStunned
|
|
|
|
|
{
|
|
|
|
|
// No hitboxes or hurtboxes while stunned.
|
|
|
|
|
FrameData{
|
|
|
|
|
T: HitboxNone,
|
|
|
|
|
R: image.Rect(0, 0, 0, 0),
|
|
|
|
|
S: asset.FrameAt(asset.ImgPlayer, 0, 2),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}, { // ActionBlock
|
|
|
|
|
{
|
|
|
|
@ -52,6 +153,7 @@ var AllPlayerFrames = [][][]FrameData{
|
|
|
|
|
{
|
|
|
|
|
T: HitboxNormal,
|
|
|
|
|
R: image.Rect(0, 0, PlayerSize, PlayerSize),
|
|
|
|
|
S: asset.FrameAt(asset.ImgPlayer, 12, 1),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
T: HitboxHurt,
|
|
|
|
@ -59,34 +161,40 @@ var AllPlayerFrames = [][][]FrameData{
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
T: HitboxNormal,
|
|
|
|
|
R: image.Rect(0, 0, PlayerSize, PlayerSize),
|
|
|
|
|
},
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 11, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
T: HitboxNormal,
|
|
|
|
|
R: image.Rect(0, 0, PlayerSize, PlayerSize),
|
|
|
|
|
},
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 10, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
T: HitboxNormal,
|
|
|
|
|
R: image.Rect(0, 0, PlayerSize, PlayerSize),
|
|
|
|
|
},
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 9, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
T: HitboxNormal,
|
|
|
|
|
R: image.Rect(0, 0, PlayerSize, PlayerSize),
|
|
|
|
|
},
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 8, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
T: HitboxNormal,
|
|
|
|
|
R: image.Rect(0, 0, PlayerSize, PlayerSize),
|
|
|
|
|
},
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 7, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 6, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 5, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 4, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 3, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 2, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 1, 1)),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
stdHit(asset.FrameAt(asset.ImgPlayer, 0, 1)),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
@ -94,6 +202,10 @@ var AllPlayerFrames = [][][]FrameData{
|
|
|
|
|
func FrameDataForActionTick(a PlayerAction, tick int) []FrameData {
|
|
|
|
|
actionFrames := AllPlayerFrames[a]
|
|
|
|
|
if tick-1 >= len(actionFrames) {
|
|
|
|
|
// Handle
|
|
|
|
|
if a == ActionStunned {
|
|
|
|
|
return AllPlayerFrames[ActionStunned][0]
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return actionFrames[tick-1]
|
|
|
|
|