1
+ local dta = {}
2
+
3
+ ---- ------------------------------------------------------------------
4
+ -- PROPERTIES
5
+ ---- ------------------------------------------------------------------
6
+
7
+ dta .animation_groups = {}
8
+ dta .tilemap_relative_path = nil
9
+ dta .tilemap_layer_ids = {}
10
+ dta .tilemap_width = 0
11
+ dta .tilemap_height = 0
12
+
13
+ ---- ------------------------------------------------------------------
14
+ -- PLAYBACK FUNCTIONS
15
+ ---- ------------------------------------------------------------------
16
+
17
+ function dta .pb_func_loop_forward (key , value )
18
+ value [" frame" ] = value [" frame" ] + 1
19
+ if key + value [" frame" ] == value [" end_tile" ] + 1 then
20
+ value [" frame" ] = 0
21
+ end
22
+ end
23
+
24
+ function dta .pb_func_loop_pingpong (key , value )
25
+ if value [" extra" ] == 0 then
26
+ value [" frame" ] = value [" frame" ] + 1
27
+ if key + value [" frame" ] == value [" end_tile" ] then
28
+ value [" extra" ] = 1
29
+ end
30
+ elseif value [" extra" ] == 1 then
31
+ value [" frame" ] = value [" frame" ] - 1
32
+ if key + value [" frame" ] == key then
33
+ value [" extra" ] = 0
34
+ end
35
+ end
36
+ end
37
+
38
+ dta .playback_functions = {
39
+ loop_forward = dta .pb_func_loop_forward ,
40
+ loop_pingpong = dta .pb_func_loop_pingpong
41
+ }
42
+
43
+ ---- ------------------------------------------------------------------
44
+ -- HELPER FUNCTIONS
45
+ ---- ------------------------------------------------------------------
46
+
47
+ function dta .sweep_tile (prev_tile , new_tile )
48
+ for i = 1 , # dta .tilemap_layer_ids do
49
+ for j = 1 , dta .tilemap_height do
50
+ for k = 1 , dta .tilemap_width do
51
+ if tilemap .get_tile (dta .tilemap_relative_path , dta .tilemap_layer_ids [i ], k , j ) == prev_tile then
52
+ tilemap .set_tile (dta .tilemap_relative_path , dta .tilemap_layer_ids [i ], k , j , new_tile )
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ function dta .timer_callback (self , handle , time_elapsed )
60
+ for key , value in pairs (dta .animation_groups ) do
61
+ if value [" handle" ] == handle then
62
+ value [" elapsed" ] = value [" elapsed" ] + time_elapsed
63
+ if value [" elapsed" ] >= value [" step" ] then
64
+ local prev_tile = key + value [" frame" ]
65
+ dta .playback_functions [value [" playback" ]](key , value )
66
+ dta .sweep_tile (prev_tile , key + value [" frame" ])
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ function dta .extend_animation_groups ()
73
+ for key , value in pairs (dta .animation_groups ) do
74
+ value [" handle" ] = timer .delay (value [" step" ], true , dta .timer_callback )
75
+ value [" frame" ] = 0
76
+ value [" elapsed" ] = 0
77
+ value [" extra" ] = 0
78
+ end
79
+ end
80
+
81
+ ---- ------------------------------------------------------------------
82
+ -- USER FUNCTIONS
83
+ ---- ------------------------------------------------------------------
84
+
85
+ function dta .init (animation_groups , tilemap_relative_path , tilemap_layer_ids )
86
+ local x , y , w , h = tilemap .get_bounds (tilemap_relative_path )
87
+ dta .tilemap_relative_path = tilemap_relative_path
88
+ dta .animation_groups = animation_groups
89
+ dta .tilemap_layer_ids = tilemap_layer_ids
90
+ dta .tilemap_width = w
91
+ dta .tilemap_height = h
92
+ dta .extend_animation_groups (animation_groups )
93
+ end
94
+
95
+ return dta
0 commit comments