Skip to content

Commit 9e0bb7b

Browse files
committed
Separate pawn animation from the PawnActor into a PawnAnim scene
Just like BattlerAnim before it, we have pawns that are reusable character controllers, that apply to NPCs and to the playable character. And these pawns could be any character in the game, so we need to be able to change the skin on them. Having separate scenes for animation is also essential for animators to be able to do their job properly, while the devs can keep working on the Pawn scenes
1 parent 3d8f3b5 commit 9e0bb7b

File tree

7 files changed

+106
-176
lines changed

7 files changed

+106
-176
lines changed

godot/animation/PawnAnim.gd

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
extends Position2D
2+
3+
class_name PawnAnim
4+
5+
onready var anim = $AnimationPlayer
6+
7+
func play_walk():
8+
anim.play("walk")
9+
yield(anim, "animation_finished")
10+
11+
func play_bump():
12+
anim.play("bump")
13+
yield(anim, "animation_finished")
14+
15+
func get_current_animation_length():
16+
return anim.current_animation_length

godot/animation/PawnAnim.tscn

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
[gd_scene load_steps=5 format=2]
2+
3+
[ext_resource path="res://animation/PawnAnim.gd" type="Script" id=1]
4+
[ext_resource path="res://assets/sprites/local_map/characters/robi_pawn.png" type="Texture" id=2]
5+
6+
[sub_resource type="Animation" id=1]
7+
8+
resource_name = "bump"
9+
length = 0.1
10+
step = 0.01
11+
tracks/0/type = "value"
12+
tracks/0/path = NodePath("Root:position")
13+
tracks/0/interp = 1
14+
tracks/0/loop_wrap = true
15+
tracks/0/imported = false
16+
tracks/0/enabled = true
17+
tracks/0/keys = {
18+
"times": PoolRealArray( 0, 0.02, 0.04, 0.06, 0.08, 0.1 ),
19+
"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ),
20+
"update": 0,
21+
"values": [ Vector2( 0, 0 ), Vector2( -1.5, -9 ), Vector2( 6.5, 2.5 ), Vector2( -11.5, 8.5 ), Vector2( 4, -5 ), Vector2( 0, 0 ) ]
22+
}
23+
24+
[sub_resource type="Animation" id=2]
25+
26+
resource_name = "walk"
27+
length = 0.25
28+
step = 0.05
29+
tracks/0/type = "value"
30+
tracks/0/path = NodePath("Root:position")
31+
tracks/0/interp = 1
32+
tracks/0/loop_wrap = true
33+
tracks/0/imported = false
34+
tracks/0/enabled = true
35+
tracks/0/keys = {
36+
"times": PoolRealArray( 0, 0.1, 0.15, 0.25 ),
37+
"transitions": PoolRealArray( 1, 0.303143, 2.61003, 1 ),
38+
"update": 0,
39+
"values": [ Vector2( 1.43051e-06, -1.90735e-06 ), Vector2( 1.43051e-06, -1.90735e-06 ), Vector2( 0, -20 ), Vector2( 1.43051e-06, -1.90735e-06 ) ]
40+
}
41+
tracks/1/type = "value"
42+
tracks/1/path = NodePath("Root:scale")
43+
tracks/1/interp = 1
44+
tracks/1/loop_wrap = true
45+
tracks/1/imported = false
46+
tracks/1/enabled = true
47+
tracks/1/keys = {
48+
"times": PoolRealArray( 0, 0.05, 0.15, 0.25 ),
49+
"transitions": PoolRealArray( 1, 0.354553, 1, 1 ),
50+
"update": 0,
51+
"values": [ Vector2( 1, 1 ), Vector2( 1.20007, 0.917384 ), Vector2( 0.916712, 1.13495 ), Vector2( 1, 1 ) ]
52+
}
53+
54+
[node name="PawnAnim" type="Position2D"]
55+
scale = Vector2( 0.328641, 0.328641 )
56+
script = ExtResource( 1 )
57+
58+
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
59+
anims/bump = SubResource( 1 )
60+
anims/walk = SubResource( 2 )
61+
62+
[node name="Root" type="Position2D" parent="."]
63+
position = Vector2( 1.43051e-06, -1.90735e-06 )
64+
65+
[node name="Body" type="Sprite" parent="Root"]
66+
position = Vector2( 0, -170.399 )
67+
texture = ExtResource( 2 )
68+

godot/local_map/pawns/PawnActor.gd

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var game_board
66
signal moved(last_position, current_position)
77

88
onready var pivot = $Pivot
9-
onready var anim_player = $AnimationPlayer
9+
onready var anim : PawnAnim = $Pivot/PawnAnim
1010
onready var tween = $Tween
1111

1212
func _ready():
@@ -27,15 +27,12 @@ func move_to(target_position):
2727
var move_direction = (target_position - position).normalized()
2828
position = target_position
2929
pivot.position = - move_direction * 40.0
30-
tween.interpolate_property($Pivot, "position", pivot.position, Vector2(), anim_player.current_animation_length, Tween.TRANS_LINEAR, Tween.EASE_IN)
31-
anim_player.play("walk")
32-
30+
tween.interpolate_property($Pivot, "position", pivot.position, Vector2(), anim.get_current_animation_length(), Tween.TRANS_LINEAR, Tween.EASE_IN)
3331
tween.start()
34-
yield($AnimationPlayer, "animation_finished")
32+
yield(anim.play_walk(), "completed")
3533
set_process(true)
3634

3735
func bump():
3836
set_process(false)
39-
anim_player.play("bump")
40-
yield(anim_player, "animation_finished")
37+
yield(anim.play_bump(), "completed")
4138
set_process(true)
Lines changed: 5 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,22 @@
1-
[gd_scene load_steps=6 format=2]
1+
[gd_scene load_steps=4 format=2]
22

33
[ext_resource path="res://local_map/pawns/PawnFollower.gd" type="Script" id=1]
4-
[ext_resource path="res://local_map/pawns/sprites/character.png" type="Texture" id=2]
4+
[ext_resource path="res://animation/PawnAnim.tscn" type="PackedScene" id=2]
55

6-
[sub_resource type="Animation" id=1]
6+
[sub_resource type="RectangleShape2D" id=1]
77

8-
resource_name = "bump"
9-
length = 0.1
10-
loop = false
11-
step = 0.01
12-
tracks/0/type = "value"
13-
tracks/0/path = NodePath("Pivot/Sprite:position")
14-
tracks/0/interp = 1
15-
tracks/0/loop_wrap = true
16-
tracks/0/imported = false
17-
tracks/0/enabled = true
18-
tracks/0/keys = {
19-
"times": PoolRealArray( 0, 0.02, 0.04, 0.06, 0.08, 0.1 ),
20-
"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ),
21-
"update": 0,
22-
"values": [ Vector2( 0, 0 ), Vector2( -1.5, -9 ), Vector2( 6.5, 2.5 ), Vector2( -11.5, 8.5 ), Vector2( 4, -5 ), Vector2( 0, 0 ) ]
23-
}
24-
25-
[sub_resource type="Animation" id=2]
26-
27-
resource_name = "walk"
28-
length = 0.25
29-
loop = false
30-
step = 0.05
31-
tracks/0/type = "value"
32-
tracks/0/path = NodePath("Pivot/Sprite:self_modulate")
33-
tracks/0/interp = 1
34-
tracks/0/loop_wrap = true
35-
tracks/0/imported = false
36-
tracks/0/enabled = false
37-
tracks/0/keys = {
38-
"times": PoolRealArray( 0, 0.1, 0.25 ),
39-
"transitions": PoolRealArray( 1, 1, 1 ),
40-
"update": 0,
41-
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 0.9375, 0, 1 ), Color( 1, 1, 1, 1 ) ]
42-
}
43-
tracks/1/type = "value"
44-
tracks/1/path = NodePath("Pivot/Sprite:position")
45-
tracks/1/interp = 1
46-
tracks/1/loop_wrap = true
47-
tracks/1/imported = false
48-
tracks/1/enabled = true
49-
tracks/1/keys = {
50-
"times": PoolRealArray( 0, 0.1, 0.15, 0.25 ),
51-
"transitions": PoolRealArray( 1, 0.303143, 2.61003, 1 ),
52-
"update": 0,
53-
"values": [ Vector2( 1.43051e-006, -1.90735e-006 ), Vector2( 1.43051e-006, -1.90735e-006 ), Vector2( 0, -20 ), Vector2( 1.43051e-006, -1.90735e-006 ) ]
54-
}
55-
tracks/2/type = "value"
56-
tracks/2/path = NodePath("Pivot/Sprite:scale")
57-
tracks/2/interp = 1
58-
tracks/2/loop_wrap = true
59-
tracks/2/imported = false
60-
tracks/2/enabled = true
61-
tracks/2/keys = {
62-
"times": PoolRealArray( 0, 0.05, 0.15, 0.25 ),
63-
"transitions": PoolRealArray( 1, 0.354553, 1, 1 ),
64-
"update": 0,
65-
"values": [ Vector2( 1, 1 ), Vector2( 1.20007, 0.917384 ), Vector2( 0.916712, 1.13495 ), Vector2( 1, 1 ) ]
66-
}
67-
68-
[sub_resource type="RectangleShape2D" id=3]
69-
70-
custom_solver_bias = 0.0
718
extents = Vector2( 30, 30 )
729

7310
[node name="Follower" type="KinematicBody2D"]
74-
position = Vector2( 32, 32 )
7511
z_index = 1
76-
input_pickable = false
77-
collision_layer = 1
78-
collision_mask = 1
79-
collision/safe_margin = 0.08
80-
motion/sync_to_physics = false
8112
script = ExtResource( 1 )
8213

83-
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
84-
root_node = NodePath("..")
85-
autoplay = ""
86-
playback_process_mode = 1
87-
playback_default_blend_time = 0.0
88-
playback_speed = 1.0
89-
anims/bump = SubResource( 1 )
90-
anims/walk = SubResource( 2 )
91-
blend_times = [ ]
92-
9314
[node name="Tween" type="Tween" parent="."]
94-
repeat = false
95-
playback_process_mode = 1
96-
playback_speed = 1.0
97-
playback/active = false
98-
playback/repeat = false
99-
playback/speed = 1.0
10015

10116
[node name="Pivot" type="Position2D" parent="."]
10217

103-
[node name="Sprite" type="Sprite" parent="Pivot"]
104-
position = Vector2( 1.43051e-006, -1.90735e-006 )
105-
texture = ExtResource( 2 )
106-
centered = false
107-
offset = Vector2( -32, -32 )
18+
[node name="PawnAnim" parent="Pivot" instance=ExtResource( 2 )]
10819

10920
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
110-
shape = SubResource( 3 )
21+
shape = SubResource( 1 )
11122

godot/local_map/pawns/PawnInteractive.tscn

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[gd_scene load_steps=5 format=2]
22

33
[ext_resource path="res://local_map/pawns/PawnInteractive.gd" type="Script" id=1]
4-
[ext_resource path="res://local_map/pawns/sprites/star.png" type="Texture" id=2]
4+
[ext_resource path="res://animation/PawnAnim.tscn" type="PackedScene" id=2]
55
[ext_resource path="res://assets/sprites/dialogue_balloon.png" type="Texture" id=3]
66

77
[sub_resource type="RectangleShape2D" id=1]
@@ -23,8 +23,9 @@ facing = {
2323
"up": true
2424
}
2525

26-
[node name="Sprite" type="Sprite" parent="."]
27-
texture = ExtResource( 2 )
26+
[node name="Pivot" type="Position2D" parent="."]
27+
28+
[node name="PawnAnim" parent="Pivot" instance=ExtResource( 2 )]
2829

2930
[node name="DialogueBalloon" type="Sprite" parent="."]
3031
visible = false

godot/local_map/pawns/PawnLeader.tscn

Lines changed: 3 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,9 @@
1-
[gd_scene load_steps=7 format=2]
1+
[gd_scene load_steps=5 format=2]
22

33
[ext_resource path="res://local_map/pawns/PawnLeader.gd" type="Script" id=1]
4-
[ext_resource path="res://assets/sprites/local_map/characters/robi_pawn.png" type="Texture" id=2]
4+
[ext_resource path="res://animation/PawnAnim.tscn" type="PackedScene" id=2]
55
[ext_resource path="res://local_map/DestinationPoint.tscn" type="PackedScene" id=3]
66

7-
[sub_resource type="Animation" id=1]
8-
9-
resource_name = "bump"
10-
length = 0.1
11-
step = 0.01
12-
tracks/0/type = "value"
13-
tracks/0/path = NodePath("Pivot/Sprite:position")
14-
tracks/0/interp = 1
15-
tracks/0/loop_wrap = true
16-
tracks/0/imported = false
17-
tracks/0/enabled = true
18-
tracks/0/keys = {
19-
"times": PoolRealArray( 0, 0.02, 0.04, 0.06, 0.08, 0.1 ),
20-
"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ),
21-
"update": 0,
22-
"values": [ Vector2( 0, 0 ), Vector2( -1.5, -9 ), Vector2( 6.5, 2.5 ), Vector2( -11.5, 8.5 ), Vector2( 4, -5 ), Vector2( 0, 0 ) ]
23-
}
24-
25-
[sub_resource type="Animation" id=2]
26-
27-
resource_name = "walk"
28-
length = 0.25
29-
step = 0.05
30-
tracks/0/type = "value"
31-
tracks/0/path = NodePath("Pivot/Sprite:self_modulate")
32-
tracks/0/interp = 1
33-
tracks/0/loop_wrap = true
34-
tracks/0/imported = false
35-
tracks/0/enabled = false
36-
tracks/0/keys = {
37-
"times": PoolRealArray( 0, 0.1, 0.25 ),
38-
"transitions": PoolRealArray( 1, 1, 1 ),
39-
"update": 0,
40-
"values": [ Color( 1, 1, 1, 1 ), Color( 1, 0.9375, 0, 1 ), Color( 1, 1, 1, 1 ) ]
41-
}
42-
tracks/1/type = "value"
43-
tracks/1/path = NodePath("Pivot/Sprite:position")
44-
tracks/1/interp = 1
45-
tracks/1/loop_wrap = true
46-
tracks/1/imported = false
47-
tracks/1/enabled = false
48-
tracks/1/keys = {
49-
"times": PoolRealArray( 0, 0.1, 0.15, 0.25 ),
50-
"transitions": PoolRealArray( 1, 0.303143, 2.61003, 1 ),
51-
"update": 0,
52-
"values": [ Vector2( 1.43051e-006, -1.90735e-006 ), Vector2( 1.43051e-006, -1.90735e-006 ), Vector2( 0, -20 ), Vector2( 1.43051e-006, -1.90735e-006 ) ]
53-
}
54-
tracks/2/type = "value"
55-
tracks/2/path = NodePath("Pivot/Sprite:scale")
56-
tracks/2/interp = 1
57-
tracks/2/loop_wrap = true
58-
tracks/2/imported = false
59-
tracks/2/enabled = false
60-
tracks/2/keys = {
61-
"times": PoolRealArray( 0, 0.05, 0.15, 0.25 ),
62-
"transitions": PoolRealArray( 1, 0.354553, 1, 1 ),
63-
"update": 0,
64-
"values": [ Vector2( 1, 1 ), Vector2( 1.20007, 0.917384 ), Vector2( 0.916712, 1.13495 ), Vector2( 1, 1 ) ]
65-
}
66-
677
[sub_resource type="RectangleShape2D" id=3]
688

699
extents = Vector2( 30, 30 )
@@ -74,20 +14,11 @@ collision_layer = 2
7414
collision_mask = 4
7515
script = ExtResource( 1 )
7616

77-
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
78-
anims/bump = SubResource( 1 )
79-
anims/walk = SubResource( 2 )
80-
8117
[node name="Tween" type="Tween" parent="."]
8218

8319
[node name="Pivot" type="Position2D" parent="."]
8420

85-
[node name="Sprite" type="Sprite" parent="Pivot"]
86-
position = Vector2( -3.8147e-006, 20 )
87-
scale = Vector2( 0.33389, 0.33389 )
88-
texture = ExtResource( 2 )
89-
centered = false
90-
offset = Vector2( -175, -388 )
21+
[node name="PawnAnim" parent="Pivot" instance=ExtResource( 2 )]
9122

9223
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
9324
shape = SubResource( 3 )

godot/project.godot

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,11 @@ _global_script_classes=[ {
164164
"language": "GDScript",
165165
"path": "res://local_map/pawns/PawnActor.gd"
166166
}, {
167+
"base": "Position2D",
168+
"class": "PawnAnim",
169+
"language": "GDScript",
170+
"path": "res://animation/PawnAnim.gd"
171+
}, {
167172
"base": "Node2D",
168173
"class": "PawnFollower",
169174
"language": "GDScript",
@@ -236,6 +241,7 @@ _global_script_class_icons={
236241
"Pathfinder": "",
237242
"Pawn": "",
238243
"PawnActor": "",
244+
"PawnAnim": "",
239245
"PawnFollower": "",
240246
"PawnLeader": "",
241247
"RectExtents": "",

0 commit comments

Comments
 (0)