timers are better
This commit is contained in:
parent
a476562a9e
commit
b3b3aa9803
|
@ -132,33 +132,7 @@ actor.kill = function () {
|
||||||
|
|
||||||
actor.kill.doc = `Remove this actor and all its padawans from existence.`;
|
actor.kill.doc = `Remove this actor and all its padawans from existence.`;
|
||||||
|
|
||||||
actor.delay = function (fn, seconds) {
|
actor.delay = function (fn, seconds) { prosperon.add_timer(this, fn, seconds); }
|
||||||
var timers = this.timers;
|
|
||||||
|
|
||||||
var stop = function () {
|
|
||||||
timers.remove(stop);
|
|
||||||
stop.timer = undefined;
|
|
||||||
stop = undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
if (fn) fn();
|
|
||||||
if (stop && stop.then) stop.then();
|
|
||||||
stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
stop.remain = seconds;
|
|
||||||
stop.seconds = seconds;
|
|
||||||
stop.pct = function () {
|
|
||||||
return 1 - stop.remain / stop.seconds;
|
|
||||||
};
|
|
||||||
|
|
||||||
stop.timer = os.make_timer(execute);
|
|
||||||
stop.timer.remain = seconds;
|
|
||||||
|
|
||||||
timers.push(stop);
|
|
||||||
return stop;
|
|
||||||
};
|
|
||||||
actor.delay.doc = `Call 'fn' after 'seconds' with 'this' set to the actor.`;
|
actor.delay.doc = `Call 'fn' after 'seconds' with 'this' set to the actor.`;
|
||||||
|
|
||||||
actor.interval = function (fn, seconds) {
|
actor.interval = function (fn, seconds) {
|
||||||
|
|
|
@ -51,7 +51,7 @@ var sprite = {
|
||||||
|
|
||||||
self.path = playing.path;
|
self.path = playing.path;
|
||||||
|
|
||||||
function advance() {
|
function advance(time) {
|
||||||
if (!self) return;
|
if (!self) return;
|
||||||
if (!self.gameobject) return;
|
if (!self.gameobject) return;
|
||||||
self.frame = playing.frames[f].rect;
|
self.frame = playing.frames[f].rect;
|
||||||
|
@ -72,12 +72,11 @@ var sprite = {
|
||||||
self?.stop();
|
self?.stop();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// self?.anim_done?.();
|
|
||||||
// if (!self.loop) { self.stop(); return; }
|
|
||||||
}
|
}
|
||||||
if (self) stop = self.gameobject.delay(advance, playing.frames[f].time / self.anim_speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
return playing.frames[f].time/self.anim_speed;
|
||||||
|
}
|
||||||
|
stop = self.gameobject.delay(advance, playing.frames[f].time/self.anim_speed);
|
||||||
advance();
|
advance();
|
||||||
},
|
},
|
||||||
tex_sync() {
|
tex_sync() {
|
||||||
|
|
|
@ -1,8 +1,21 @@
|
||||||
globalThis.entityreport = {};
|
globalThis.entityreport = {};
|
||||||
|
|
||||||
var timer_update = function (dt) {
|
var timer_manager = {};
|
||||||
this.fn();
|
timer_manager.timers = new Map();
|
||||||
};
|
timer_manager.make_timer = function(obj, fn, seconds)
|
||||||
|
{
|
||||||
|
var timer = os.make_timer(_ => {
|
||||||
|
fn();
|
||||||
|
this.timers.delete(obj);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.timers.set(obj, timer);
|
||||||
|
return _ => {
|
||||||
|
if (this.timers.has(obj)) {
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function obj_unique_name(name, obj) {
|
function obj_unique_name(name, obj) {
|
||||||
name = name.replaceAll(".", "_");
|
name = name.replaceAll(".", "_");
|
||||||
|
@ -70,32 +83,7 @@ var entity = {
|
||||||
for (var o of Object.values(this.objects)) o.sync();
|
for (var o of Object.values(this.objects)) o.sync();
|
||||||
},
|
},
|
||||||
|
|
||||||
delay(fn, seconds) {
|
delay(fn, seconds) { prosperon.add_timer(this, fn, seconds); },
|
||||||
var timers = this.timers;
|
|
||||||
var stop = function () {
|
|
||||||
timers.remove(stop);
|
|
||||||
execute = undefined;
|
|
||||||
stop.timer = undefined;
|
|
||||||
stop = undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
function execute() {
|
|
||||||
fn();
|
|
||||||
stop?.();
|
|
||||||
}
|
|
||||||
|
|
||||||
stop.remain = seconds;
|
|
||||||
stop.seconds = seconds;
|
|
||||||
stop.pct = function () {
|
|
||||||
return 1 - stop.remain / stop.seconds;
|
|
||||||
};
|
|
||||||
|
|
||||||
stop.timer = os.make_timer(execute);
|
|
||||||
stop.timer.remain = seconds;
|
|
||||||
|
|
||||||
timers.push(stop);
|
|
||||||
return stop;
|
|
||||||
},
|
|
||||||
|
|
||||||
cry(file) {
|
cry(file) {
|
||||||
return audio.cry(file);
|
return audio.cry(file);
|
||||||
|
|
|
@ -418,6 +418,36 @@ var Event = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
prosperon.add_timer = function(obj, fn, seconds)
|
||||||
|
{
|
||||||
|
var timers = obj.timers;
|
||||||
|
|
||||||
|
var stop = function () {
|
||||||
|
timers.remove(stop);
|
||||||
|
timer.fn = undefined;
|
||||||
|
timer = undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
function execute() {
|
||||||
|
if (fn)
|
||||||
|
timer.remain = fn(stop.seconds);
|
||||||
|
|
||||||
|
if (!timer.remain)
|
||||||
|
stop();
|
||||||
|
else
|
||||||
|
stop.seconds = timer.remain;
|
||||||
|
}
|
||||||
|
|
||||||
|
var timer = os.make_timer(execute);
|
||||||
|
timer.remain = seconds;
|
||||||
|
|
||||||
|
stop.remain = seconds;
|
||||||
|
stop.seconds = seconds;
|
||||||
|
|
||||||
|
timers.push(stop);
|
||||||
|
return stop;
|
||||||
|
}
|
||||||
|
|
||||||
global.mixin("scripts/spline");
|
global.mixin("scripts/spline");
|
||||||
global.mixin("scripts/components");
|
global.mixin("scripts/components");
|
||||||
global.mixin("scripts/actor");
|
global.mixin("scripts/actor");
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
#include "jsffi.h"
|
#include "jsffi.h"
|
||||||
|
|
||||||
|
//#define STB_LEAKCHECK_IMPLEMENTATION
|
||||||
|
//#include "stb/stb_leakcheck.h"
|
||||||
|
|
||||||
#include "script.h"
|
#include "script.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "gameobject.h"
|
#include "gameobject.h"
|
||||||
|
@ -2665,10 +2668,12 @@ static const JSCFunctionListEntry js_texture_funcs[] = {
|
||||||
MIST_FUNC_DEF(texture, inram, 0),
|
MIST_FUNC_DEF(texture, inram, 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
JSC_GETSET_CALLBACK(timer, fn)
|
||||||
JSC_GETSET(timer, remain, number)
|
JSC_GETSET(timer, remain, number)
|
||||||
|
|
||||||
static const JSCFunctionListEntry js_timer_funcs[] = {
|
static const JSCFunctionListEntry js_timer_funcs[] = {
|
||||||
CGETSET_ADD(timer, remain),
|
CGETSET_ADD(timer, remain),
|
||||||
|
CGETSET_ADD(timer, fn),
|
||||||
};
|
};
|
||||||
|
|
||||||
JSC_GETSET(font, linegap, number)
|
JSC_GETSET(font, linegap, number)
|
||||||
|
|
|
@ -75,7 +75,14 @@ JSValue js_##ID##_get_##ENTRY (JSContext *js, JSValue self) { \
|
||||||
|
|
||||||
#define JSC_GETSET(ID, ENTRY, TYPE) GETSETPAIR( ID , ENTRY , TYPE , ; )
|
#define JSC_GETSET(ID, ENTRY, TYPE) GETSETPAIR( ID , ENTRY , TYPE , ; )
|
||||||
#define JSC_GETSET_APPLY(ID, ENTRY, TYPE) GETSETPAIR(ID, ENTRY, TYPE, ID##_apply(js2##ID (self));)
|
#define JSC_GETSET_APPLY(ID, ENTRY, TYPE) GETSETPAIR(ID, ENTRY, TYPE, ID##_apply(js2##ID (self));)
|
||||||
#define JSC_GETSET_HOOK(ID, ENTRY) GETSETPAIR(ID, ENTRY, JSValue, ;)
|
#define JSC_GETSET_CALLBACK(ID, ENTRY) \
|
||||||
|
JSValue js_##ID##_set_##ENTRY (JS_SETSIG) { \
|
||||||
|
JSValue fn = js2##ID (self)->ENTRY; \
|
||||||
|
if (!JS_IsUndefined(fn)) JS_FreeValue(js, fn); \
|
||||||
|
js2##ID (self)->ENTRY = JS_DupValue(js, val); \
|
||||||
|
return JS_UNDEFINED; \
|
||||||
|
}\
|
||||||
|
JSValue js_##ID##_get_##ENTRY (JSContext *js, JSValue self) { return JS_DupValue(js, js2##ID (self)->ENTRY); } \
|
||||||
|
|
||||||
#define JSC_GETSET_GLOBAL(ENTRY, TYPE) \
|
#define JSC_GETSET_GLOBAL(ENTRY, TYPE) \
|
||||||
JSValue js_global_set_##ENTRY (JS_SETSIG) { \
|
JSValue js_global_set_##ENTRY (JS_SETSIG) { \
|
||||||
|
|
Loading…
Reference in a new issue