2023-05-22 20:31:55 +02:00
|
|
|
#region global
|
|
|
|
global.FLAG.keyframe_override = true;
|
2023-07-06 19:49:16 +02:00
|
|
|
|
|
|
|
enum ANIMATOR_END {
|
|
|
|
loop,
|
|
|
|
stop
|
|
|
|
}
|
2023-07-25 20:12:40 +02:00
|
|
|
|
|
|
|
#macro ANIMATION_STATIC !(PROJECT.animator.is_playing || PROJECT.animator.frame_progress)
|
2023-10-31 13:33:36 +01:00
|
|
|
#macro IS_PLAYING PROJECT.animator.is_playing
|
2023-10-09 16:07:33 +02:00
|
|
|
#macro CURRENT_FRAME PROJECT.animator.current_frame
|
2023-11-09 04:02:41 +01:00
|
|
|
#macro LAST_FRAME (CURRENT_FRAME == TOTAL_FRAMES - 1)
|
2023-10-09 16:07:33 +02:00
|
|
|
#macro TOTAL_FRAMES PROJECT.animator.frames_total
|
2023-11-03 14:43:28 +01:00
|
|
|
#macro RENDERING PROJECT.animator.rendering
|
2023-11-04 13:22:52 +01:00
|
|
|
#macro IS_RENDERING array_length(PROJECT.animator.rendering)
|
2023-05-22 20:31:55 +02:00
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region animation class
|
2022-12-10 05:06:01 +01:00
|
|
|
function AnimationManager() constructor {
|
2023-03-07 14:29:47 +01:00
|
|
|
frames_total = 30;
|
|
|
|
current_frame = 0;
|
|
|
|
real_frame = 0;
|
2023-01-01 02:06:02 +01:00
|
|
|
time_since_last_frame = 0;
|
2023-03-07 14:29:47 +01:00
|
|
|
framerate = 30;
|
|
|
|
is_playing = false;
|
|
|
|
frame_progress = false;
|
|
|
|
play_freeze = 0;
|
2023-11-08 13:05:24 +01:00
|
|
|
render_stop = false;
|
2022-12-10 05:06:01 +01:00
|
|
|
|
2023-11-04 13:22:52 +01:00
|
|
|
rendering = [];
|
2023-11-03 14:43:28 +01:00
|
|
|
playback = ANIMATOR_END.loop;
|
2022-12-10 05:06:01 +01:00
|
|
|
|
2023-08-11 21:08:02 +02:00
|
|
|
static setFrame = function(frame, resetTime = true) {
|
2023-04-10 20:02:59 +02:00
|
|
|
//if(frame == 0) resetAnimation();
|
|
|
|
|
2023-11-08 13:05:24 +01:00
|
|
|
var _c = current_frame;
|
|
|
|
frame = clamp(frame, 0, frames_total);
|
|
|
|
real_frame = frame;
|
2022-12-10 05:06:01 +01:00
|
|
|
current_frame = round(frame);
|
2022-12-12 09:08:03 +01:00
|
|
|
|
2023-02-14 02:51:14 +01:00
|
|
|
if(current_frame == frames_total) {
|
2023-11-08 13:05:24 +01:00
|
|
|
if(render_stop) {
|
2023-02-14 02:51:14 +01:00
|
|
|
is_playing = false;
|
2023-06-04 12:38:40 +02:00
|
|
|
setFrame(0);
|
2023-11-08 13:05:24 +01:00
|
|
|
render_stop = false;
|
|
|
|
} else if(playback == ANIMATOR_END.stop) {
|
2023-06-04 12:38:40 +02:00
|
|
|
is_playing = false;
|
2023-11-08 13:05:24 +01:00
|
|
|
} else {
|
2023-02-14 02:51:14 +01:00
|
|
|
setFrame(0);
|
2023-11-08 13:05:24 +01:00
|
|
|
}
|
2023-02-14 02:51:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if(_c != current_frame) {
|
2022-12-12 09:08:03 +01:00
|
|
|
frame_progress = true;
|
2023-08-11 21:08:02 +02:00
|
|
|
if(resetTime)
|
|
|
|
time_since_last_frame = 0;
|
2023-10-02 10:45:30 +02:00
|
|
|
RENDER_ALL
|
2023-03-02 07:59:14 +01:00
|
|
|
} else
|
|
|
|
frame_progress = false;
|
2023-11-08 13:05:24 +01:00
|
|
|
|
|
|
|
if(array_length(rendering)) render_stop = true;
|
2022-12-10 05:06:01 +01:00
|
|
|
}
|
2023-04-10 20:02:59 +02:00
|
|
|
|
|
|
|
static resetAnimation = function() {
|
2023-07-06 19:49:16 +02:00
|
|
|
var _key = ds_map_find_first(PROJECT.nodeMap);
|
|
|
|
var amo = ds_map_size(PROJECT.nodeMap);
|
2023-04-10 20:02:59 +02:00
|
|
|
|
|
|
|
repeat(amo) {
|
2023-07-06 19:49:16 +02:00
|
|
|
var _node = PROJECT.nodeMap[? _key];
|
2023-04-10 20:02:59 +02:00
|
|
|
_node.resetAnimation();
|
2023-07-06 19:49:16 +02:00
|
|
|
_key = ds_map_find_next(PROJECT.nodeMap, _key);
|
2023-04-10 20:02:59 +02:00
|
|
|
}
|
|
|
|
}
|
2023-05-16 21:28:16 +02:00
|
|
|
|
|
|
|
static render = function() {
|
2023-07-25 20:12:40 +02:00
|
|
|
setFrame(0);
|
2023-05-16 21:28:16 +02:00
|
|
|
is_playing = true;
|
|
|
|
frame_progress = true;
|
2023-07-25 20:12:40 +02:00
|
|
|
time_since_last_frame = 0;
|
2023-05-16 21:28:16 +02:00
|
|
|
}
|
|
|
|
|
2023-06-04 12:38:40 +02:00
|
|
|
static toggle = function() {
|
2023-07-06 19:49:16 +02:00
|
|
|
is_playing = !is_playing;
|
|
|
|
frame_progress = true;
|
2023-07-25 20:12:40 +02:00
|
|
|
time_since_last_frame = 0;
|
2023-06-04 12:38:40 +02:00
|
|
|
}
|
|
|
|
|
2023-05-16 21:28:16 +02:00
|
|
|
static pause = function() {
|
2023-07-06 19:49:16 +02:00
|
|
|
is_playing = false;
|
|
|
|
frame_progress = true;
|
2023-07-25 20:12:40 +02:00
|
|
|
time_since_last_frame = 0;
|
2023-05-16 21:28:16 +02:00
|
|
|
}
|
|
|
|
|
2023-05-22 20:31:55 +02:00
|
|
|
static play = function() {
|
2023-07-25 20:12:40 +02:00
|
|
|
setFrame(0);
|
2023-07-06 19:49:16 +02:00
|
|
|
is_playing = true;
|
|
|
|
frame_progress = true;
|
2023-07-25 20:12:40 +02:00
|
|
|
time_since_last_frame = 0;
|
2023-05-22 20:31:55 +02:00
|
|
|
}
|
|
|
|
|
2023-05-16 21:28:16 +02:00
|
|
|
static resume = function() {
|
2023-07-06 19:49:16 +02:00
|
|
|
is_playing = true;
|
|
|
|
frame_progress = true;
|
2023-07-25 20:12:40 +02:00
|
|
|
time_since_last_frame = 0;
|
2023-05-16 21:28:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
static stop = function() {
|
|
|
|
setFrame(0);
|
2023-07-25 20:12:40 +02:00
|
|
|
is_playing = false;
|
|
|
|
time_since_last_frame = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static step = function() {
|
|
|
|
if(is_playing && play_freeze == 0) {
|
|
|
|
time_since_last_frame += framerate * (delta_time / 1000000);
|
|
|
|
|
2023-08-11 21:08:02 +02:00
|
|
|
if(time_since_last_frame >= 1) {
|
|
|
|
setFrame(real_frame + 1, false);
|
|
|
|
time_since_last_frame -= 1;
|
|
|
|
}
|
2023-07-25 20:12:40 +02:00
|
|
|
} else {
|
|
|
|
frame_progress = false;
|
|
|
|
//setFrame(real_frame);
|
|
|
|
time_since_last_frame = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
play_freeze = max(0, play_freeze - 1);
|
2023-05-16 21:28:16 +02:00
|
|
|
}
|
2022-12-10 05:06:01 +01:00
|
|
|
}
|
|
|
|
#endregion
|