119 lines
2.6 KiB
TypeScript
119 lines
2.6 KiB
TypeScript
|
|
let tilesheet_datas: tilesheet_data_t[];
|
|
|
|
function tilesheet_create(scene_name: string, tilesheet_ref: string, tilesheet_action_ref: string): tilesheet_t {
|
|
let t: tilesheet_t = {};
|
|
t.ready = false;
|
|
for (let i: i32 = 0; i < tilesheet_datas.length; ++i) {
|
|
let ts: tilesheet_data_t = tilesheet_datas[i];
|
|
if (ts.name == tilesheet_ref) {
|
|
t.raw = ts;
|
|
tilesheet_play(t, tilesheet_action_ref);
|
|
t.ready = true;
|
|
break;
|
|
}
|
|
}
|
|
return t;
|
|
}
|
|
|
|
function tilesheet_play(self: tilesheet_t, action_ref: string, on_action_complete: ()=>void = null) {
|
|
self.on_action_complete = on_action_complete;
|
|
for (let i: i32 = 0; i < self.raw.actions.length; ++i) {
|
|
let a: tilesheet_action_t = self.raw.actions[i];
|
|
if (a.name == action_ref) {
|
|
self.action = a;
|
|
break;
|
|
}
|
|
}
|
|
tilesheet_set_frame(self, self.action.start);
|
|
self.paused = false;
|
|
self.time = 0.0;
|
|
}
|
|
|
|
function tilesheet_pause(self: tilesheet_t) {
|
|
self.paused = true;
|
|
}
|
|
|
|
function tilesheet_resume(self: tilesheet_t) {
|
|
self.paused = false;
|
|
}
|
|
|
|
function tilesheet_set_frame_offset(self: tilesheet_t, frame: i32) {
|
|
tilesheet_set_frame(self, self.action.start + frame);
|
|
self.paused = false;
|
|
}
|
|
|
|
function tilesheet_get_frame_offset(self: tilesheet_t): i32 {
|
|
return self.frame - self.action.start;
|
|
}
|
|
|
|
function tilesheet_update(self: tilesheet_t) {
|
|
if (!self.ready || self.paused) {
|
|
return;
|
|
}
|
|
|
|
self.time += sys_real_delta();
|
|
|
|
let frame_time: f32 = 1 / self.raw.framerate;
|
|
let frames_to_advance: i32 = 0;
|
|
|
|
while (self.time >= frame_time) {
|
|
self.time -= frame_time;
|
|
frames_to_advance++;
|
|
}
|
|
|
|
if (frames_to_advance != 0) {
|
|
tilesheet_set_frame(self, self.frame + frames_to_advance);
|
|
}
|
|
}
|
|
|
|
function tilesheet_set_frame(self: tilesheet_t, f: i32) {
|
|
self.frame = f;
|
|
|
|
// Action end
|
|
if (self.frame > self.action.end) {
|
|
if (self.on_action_complete != null) {
|
|
self.on_action_complete();
|
|
}
|
|
if (self.action.loop) {
|
|
tilesheet_set_frame(self, self.action.start);
|
|
}
|
|
else {
|
|
self.paused = true;
|
|
}
|
|
return;
|
|
}
|
|
|
|
let tx: i32 = self.frame % self.raw.tiles_x;
|
|
let ty: i32 = math_floor(self.frame / self.raw.tiles_x);
|
|
self.tile_x = tx * (1 / self.raw.tiles_x);
|
|
self.tile_y = ty * (1 / self.raw.tiles_y);
|
|
}
|
|
|
|
type tilesheet_data_t = {
|
|
name?: string;
|
|
tiles_x?: i32;
|
|
tiles_y?: i32;
|
|
framerate?: i32;
|
|
actions?: tilesheet_action_t[];
|
|
};
|
|
|
|
type tilesheet_action_t = {
|
|
name?: string;
|
|
start?: i32;
|
|
end?: i32;
|
|
loop?: bool;
|
|
};
|
|
|
|
type tilesheet_t = {
|
|
tile_x?: f32; // Tile offset on tilesheet texture 0-1
|
|
tile_y?: f32;
|
|
raw?: tilesheet_data_t;
|
|
action?: tilesheet_action_t;
|
|
ready?: bool;
|
|
paused?: bool;
|
|
frame?: i32;
|
|
time?: f32;
|
|
on_action_complete?: ()=>void;
|
|
};
|