Files
armorpaint/base/sources/ts/tilesheet.ts
T
luboslenco 3faf6b3d73 Cleanup
2025-09-01 21:31:59 +02:00

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;
};