Skip to content

Commit 7c408bd

Browse files
authored
WIP: Add precompiled spritesheets with oversized weapons support (#21)
* added example project * added sprite type selection * Added animation selection * added spear to sprite parts * All animations visible * Partial oversized animation working on precompiled spritesheet * Updated animation data to static * Added longsword slash reverse for sprite parts * Added precompiled slash reverse * Added precompiled oversized thrust
1 parent e118d9a commit 7c408bd

22 files changed

+30702
-30
lines changed

addons/LPCAnimatedSprite/LPCAnimatedSprite2D.gd

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ enum LPCAnimation {
2323
SLASH_LEFT,
2424
SLASH_DOWN,
2525
SLASH_RIGHT,
26+
SLASH_REVERSE_UP,
27+
SLASH_REVERSE_LEFT,
28+
SLASH_REVERSE_DOWN,
29+
SLASH_REVERSE_RIGHT,
2630
SHOOT_UP,
2731
SHOOT_LEFT,
2832
SHOOT_DOWN,
@@ -86,21 +90,22 @@ func CreateSprites(spriteSheet:LPCSpriteSheet):
8690
for animationData in spriteSheet.AnimationData():
8791
AddAnimation(spriteSheet, spriteFrames, animationData)
8892
return spriteFrames
89-
93+
9094
func AddAnimation(spriteSheet:LPCSpriteSheet, spriteFrames:SpriteFrames, animationData:LPCAnimationData):
9195
if spriteSheet == null || spriteSheet.SpriteSheet == null:
9296
return
93-
if spriteFrames.has_animation(animationData.Name):
94-
spriteFrames.clear(animationData.Name)
9597

98+
if spriteFrames.has_animation(animationData.Name):
99+
spriteFrames.remove_animation(animationData.Name)
100+
96101
spriteFrames.add_animation(animationData.Name)
97-
for col in range(animationData.FrameCount):
98-
if "WALK" in animationData.Name && col == 0:
99-
continue
102+
var frameStart = animationData.FrameCount -1 if animationData.Reverse else animationData.Col
103+
var frameEnd = animationData.Col -1 if animationData.Reverse else animationData.FrameCount
104+
var reversed = -1 if animationData.Reverse else 1
105+
for frame in range(frameStart, frameEnd , reversed):
100106
var atlasTexture = AtlasTexture.new()
101107
atlasTexture.atlas = spriteSheet.SpriteSheet
102-
var spriteSize:int = spriteSheet.Size()
103-
atlasTexture.region = Rect2(spriteSize*(col+animationData.Col), spriteSize*animationData.Row, spriteSize, spriteSize)
108+
atlasTexture.region = spriteSheet.GetSpriteRect(animationData, frame)
104109
spriteFrames.add_frame(animationData.Name, atlasTexture, 0.5)
105110
spriteFrames.set_animation_loop(animationData.Name, animationData.Loop)
106111
return spriteFrames

addons/LPCAnimatedSprite/LPCSpriteData.gd

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@ var Name:String
55
var Row:int
66
var Col:int
77
var Loop:bool
8-
func _init(frameCount:int, name:String, row:int, col:int, loop:bool):
8+
var Size:int
9+
var Reverse:bool
10+
func _init(frameCount:int, name:String, row:int, col:int, loop:bool, size:int = 64, reverse:bool = false):
911
FrameCount = frameCount
1012
Name = name
1113
Row = row
1214
Col = col
1315
Loop = loop
16+
Size = size
17+
Reverse = reverse

addons/LPCAnimatedSprite/LPCSpriteSheet.gd

Lines changed: 89 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
extends Resource
33
class_name LPCSpriteSheet
44

5-
@export var SpriteSheet:Texture
5+
@export var SpriteSheet:Texture2D
66
@export var Name:String = ""
77

88
@export var SpriteType: SpriteTypeEnum
@@ -12,10 +12,11 @@ enum SpriteTypeEnum {
1212
OversizeRod,
1313
OversizeThrust,
1414
OversizeSlash,
15+
OversizeSlashReverse,
1516
OversizeWhip
1617
}
1718

18-
var NormalAnimationData:Array[LPCAnimationData] = [
19+
static var NormalAnimationData:Array[LPCAnimationData] = [
1920
LPCAnimationData.new(7,"CAST_UP",0, 0,false),
2021
LPCAnimationData.new(7,"CAST_LEFT",1, 0,false),
2122
LPCAnimationData.new(7,"CAST_DOWN",2, 0,false),
@@ -24,14 +25,18 @@ var NormalAnimationData:Array[LPCAnimationData] = [
2425
LPCAnimationData.new(8,"THRUST_LEFT",5, 0,false),
2526
LPCAnimationData.new(8,"THRUST_DOWN",6, 0,false),
2627
LPCAnimationData.new(8,"THRUST_RIGHT",7, 0,false),
27-
LPCAnimationData.new(8,"WALK_UP",8, 0,true),
28-
LPCAnimationData.new(8,"WALK_LEFT",9, 0,true),
29-
LPCAnimationData.new(8,"WALK_DOWN",10, 0,true),
30-
LPCAnimationData.new(8,"WALK_RIGHT",11, 0,true),
28+
LPCAnimationData.new(8,"WALK_UP",8, 1,true),
29+
LPCAnimationData.new(8,"WALK_LEFT",9, 1,true),
30+
LPCAnimationData.new(8,"WALK_DOWN",10, 1,true),
31+
LPCAnimationData.new(8,"WALK_RIGHT",11, 1,true),
3132
LPCAnimationData.new(6,"SLASH_UP",12, 0,false),
3233
LPCAnimationData.new(6,"SLASH_LEFT",13, 0,false),
3334
LPCAnimationData.new(6,"SLASH_DOWN",14, 0,false),
3435
LPCAnimationData.new(6,"SLASH_RIGHT",15, 0,false),
36+
LPCAnimationData.new(6,"SLASH_REVERSE_UP", 12, 0,false, 64, true),
37+
LPCAnimationData.new(6,"SLASH_REVERSE_LEFT", 13, 0,false, 64, true),
38+
LPCAnimationData.new(6,"SLASH_REVERSE_DOWN", 14, 0,false, 64, true),
39+
LPCAnimationData.new(6,"SLASH_REVERSE_RIGHT", 15, 0,false, 64, true),
3540
LPCAnimationData.new(6,"WHIP_UP",12, 0,false),
3641
LPCAnimationData.new(6,"WHIP_LEFT",13, 0,false),
3742
LPCAnimationData.new(6,"WHIP_DOWN",14, 0,false),
@@ -47,47 +52,110 @@ var NormalAnimationData:Array[LPCAnimationData] = [
4752
LPCAnimationData.new(1,"IDLE_RIGHT",11, 0,false),
4853
LPCAnimationData.new(1,"HURT_DOWN_LAST",20, 5,false),
4954
]
50-
var SlashAnimationData:Array[LPCAnimationData] = [
51-
LPCAnimationData.new(6,"SLASH_UP",0, 0,false),
52-
LPCAnimationData.new(6,"SLASH_LEFT",1, 0,false),
53-
LPCAnimationData.new(6,"SLASH_DOWN",2, 0,false),
54-
LPCAnimationData.new(6,"SLASH_RIGHT",3, 0,false),
55+
56+
static var SlashAnimationData:Array[LPCAnimationData] = [
57+
LPCAnimationData.new(6,"SLASH_UP",0, 0,false, 192),
58+
LPCAnimationData.new(6,"SLASH_LEFT",1, 0,false, 192),
59+
LPCAnimationData.new(6,"SLASH_DOWN",2, 0,false, 192),
60+
LPCAnimationData.new(6,"SLASH_RIGHT",3, 0,false, 192),
61+
]
62+
63+
static var SlashReverseAnimationData:Array[LPCAnimationData] = [
64+
LPCAnimationData.new(6,"SLASH_REVERSE_UP",0, 0,false, 192),
65+
LPCAnimationData.new(6,"SLASH_REVERSE_LEFT",1, 0,false, 192),
66+
LPCAnimationData.new(6,"SLASH_REVERSE_DOWN",2, 0,false, 192),
67+
LPCAnimationData.new(6,"SLASH_REVERSE_RIGHT",3, 0,false, 192),
68+
]
69+
70+
static var PrecompiledOversizedSlash:Array[LPCAnimationData] = [
71+
LPCAnimationData.new(6,"SLASH_UP",21, 0,false, 192),
72+
LPCAnimationData.new(6,"SLASH_LEFT",22, 0,false, 192),
73+
LPCAnimationData.new(6,"SLASH_DOWN",23, 0,false, 192),
74+
LPCAnimationData.new(6,"SLASH_RIGHT",24, 0,false, 192),
75+
]
76+
77+
static var PrecompiledOversizedSlashReverse:Array[LPCAnimationData] = [
78+
LPCAnimationData.new(6,"SLASH_REVERSE_UP",25, 0,false, 192),
79+
LPCAnimationData.new(6,"SLASH_REVERSE_LEFT",26, 0,false, 192),
80+
LPCAnimationData.new(6,"SLASH_REVERSE_DOWN",27, 0,false, 192),
81+
LPCAnimationData.new(6,"SLASH_REVERSE_RIGHT",28, 0,false, 192),
82+
]
83+
84+
static var PrecompiledOversizedThrust:Array[LPCAnimationData] = [
85+
LPCAnimationData.new(6,"THRUST_UP",29, 0,false, 192),
86+
LPCAnimationData.new(6,"THRUST_LEFT",30, 0,false, 192),
87+
LPCAnimationData.new(6,"THRUST_DOWN",31, 0,false, 192),
88+
LPCAnimationData.new(6,"THRUST_RIGHT",32, 0,false, 192),
5589
]
56-
var ThrustAnimationData:Array[LPCAnimationData] = [
90+
91+
static var ThrustAnimationData:Array[LPCAnimationData] = [
5792
LPCAnimationData.new(6,"THRUST_UP",0, 0,false),
5893
LPCAnimationData.new(6,"THRUST_LEFT",1, 0,false),
5994
LPCAnimationData.new(6,"THRUST_DOWN",2, 0,false),
6095
LPCAnimationData.new(6,"THRUST_RIGHT",3, 0,false),
6196
]
62-
var RodAnimationData:Array[LPCAnimationData] = [
97+
static var RodAnimationData:Array[LPCAnimationData] = [
6398
LPCAnimationData.new(6,"ROD_UP",0, 0,false),
6499
LPCAnimationData.new(6,"ROD_LEFT",1, 0,false),
65100
LPCAnimationData.new(6,"ROD_DOWN",2, 0,false),
66101
LPCAnimationData.new(6,"ROD_RIGHT",3, 0,false),
67102
]
68-
var WhipAnimationData:Array[LPCAnimationData] = [
103+
static var WhipAnimationData:Array[LPCAnimationData] = [
69104
LPCAnimationData.new(8,"WHIP_UP",0, 0,false),
70105
LPCAnimationData.new(8,"WHIP_LEFT",1, 0,false),
71106
LPCAnimationData.new(8,"WHIP_DOWN",2, 0,false),
72107
LPCAnimationData.new(8,"WHIP_RIGHT",3, 0,false),
73108
]
74109

75-
func Size() -> int:
76-
match SpriteType:
77-
SpriteTypeEnum.Normal:
78-
return 64
79-
_:
80-
return 192
110+
enum SpritesheetType
111+
{
112+
SizeNormal,
113+
Size_6_6_8
114+
}
115+
116+
func GetSpritesheetType():
117+
if SpriteSheet.get_height() == 3648:
118+
return SpritesheetType.Size_6_6_8
119+
return SpritesheetType.SizeNormal
120+
121+
func GetSpriteRect(animationData:LPCAnimationData, frame: int) -> Rect2:
122+
const startOfOversizedAnimation = 21;
123+
var spriteSize:int = animationData.Size
124+
match GetSpritesheetType():
125+
LPCSpriteSheet.SpritesheetType.SizeNormal:
126+
return Rect2(spriteSize*(frame+animationData.Col), spriteSize*animationData.Row, spriteSize, spriteSize)
127+
LPCSpriteSheet.SpritesheetType.Size_6_6_8:
128+
if animationData.Row < startOfOversizedAnimation:
129+
return Rect2(spriteSize*(frame+animationData.Col), spriteSize*animationData.Row, spriteSize, spriteSize)
130+
else:
131+
var startPosition:int = startOfOversizedAnimation * 64
132+
var row = animationData.Row - startOfOversizedAnimation
133+
return Rect2(spriteSize*(frame+animationData.Col), startPosition + spriteSize*row, spriteSize, spriteSize)
134+
return Rect2(spriteSize*(frame+animationData.Col), spriteSize*animationData.Row, spriteSize, spriteSize)
135+
81136
func AnimationData() -> Array[LPCAnimationData]:
82137
match SpriteType:
83138
SpriteTypeEnum.Normal:
84-
return NormalAnimationData
139+
match GetSpritesheetType():
140+
SpritesheetType.SizeNormal:
141+
return NormalAnimationData
142+
SpritesheetType.Size_6_6_8:
143+
var animationData:Array[LPCAnimationData] = []
144+
animationData.append_array(NormalAnimationData)
145+
animationData.append_array(PrecompiledOversizedSlash)
146+
animationData.append_array(PrecompiledOversizedSlashReverse)
147+
animationData.append_array(PrecompiledOversizedThrust)
148+
return animationData
149+
_:
150+
return NormalAnimationData
85151
SpriteTypeEnum.OversizeRod:
86152
return RodAnimationData
87153
SpriteTypeEnum.OversizeThrust:
88154
return ThrustAnimationData
89155
SpriteTypeEnum.OversizeSlash:
90156
return SlashAnimationData
157+
SpriteTypeEnum.OversizeSlashReverse:
158+
return SlashReverseAnimationData
91159
SpriteTypeEnum.OversizeWhip:
92160
return WhipAnimationData
93161
_:

example_assets/example.gd

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
extends Node2D
2+
3+
#precompile spritesheet definition
4+
#https://sanderfrenken.github.io/Universal-LPC-Spritesheet-Character-Generator/#?body=Body_color_light&head=Human_male_light&weapon=Dagger_dagger&sex=male&shadow=Shadow_shadow&wound_arm=none&prosthesis_hand=none&shoulders=Plate_steel&arms=Armour_steel&bauldron=Bauldron_tan&bracers=Bracers_steel&wrists=none&gloves=none&armour=Plate_steel&cape=Tattered_purple&belt=Leather_Belt_brown&legs=Armour_steel&shoes=Armour_steel&eyepatch=Eyepatch_eyepatch&hair=Plain_ash
5+
6+
@onready var SpriteParts:LPCAnimatedSprite2D = $"CanvasLayer/GridContainer/Control/SpriteParts"
7+
@onready var PrecompiledDagger:LPCAnimatedSprite2D = $CanvasLayer/GridContainer/Control2/PrecompiledDagger
8+
@onready var PrecompiledLongsword:LPCAnimatedSprite2D = $CanvasLayer/GridContainer/Control3/PrecompiledLongsword
9+
@onready var SpritePartsLongsword: LPCAnimatedSprite2D = $CanvasLayer/GridContainer/Control6/SpritePartsLongsword
10+
11+
@onready var AnimationList:OptionButton = $CanvasLayer/Control/VBoxContainer/Animation
12+
13+
func _ready() -> void:
14+
for value:String in LPCAnimatedSprite2D.LPCAnimation:
15+
AnimationList.add_item(value)
16+
AnimationList.select(LPCAnimatedSprite2D.LPCAnimation.WALK_DOWN)
17+
18+
func _on_animation_item_selected(index:int) -> void:
19+
var animation:LPCAnimatedSprite2D.LPCAnimation = index as LPCAnimatedSprite2D.LPCAnimation
20+
PrecompiledDagger.play(animation)
21+
SpriteParts.play(animation)
22+
PrecompiledLongsword.play(animation)
23+
SpritePartsLongsword.play(animation)

0 commit comments

Comments
 (0)