timers fixed
This commit is contained in:
parent
166857a6df
commit
8c3e8aa539
2
Makefile
2
Makefile
|
@ -252,7 +252,7 @@ crosswin:
|
||||||
clean:
|
clean:
|
||||||
@echo Cleaning project
|
@echo Cleaning project
|
||||||
@rm -rf bin dist
|
@rm -rf bin dist
|
||||||
@rm -f shaders/*.sglsl.h shaders/*.metal core.cdb jso cdb packer TAGS scripts/*.jso
|
@rm -f shaders/*.sglsl.h shaders/*.metal core.cdb jso cdb packer scripts/*.jso
|
||||||
@make -C quickjs clean
|
@make -C quickjs clean
|
||||||
|
|
||||||
TAGINC != find . -name "*.[chj]"
|
TAGINC != find . -name "*.[chj]"
|
||||||
|
|
|
@ -215,7 +215,6 @@ var editor = {
|
||||||
Primum.clear();
|
Primum.clear();
|
||||||
load("config.js");
|
load("config.js");
|
||||||
Game.play();
|
Game.play();
|
||||||
Game.editor_mode(false);
|
|
||||||
Player.players[0].uncontrol(this);
|
Player.players[0].uncontrol(this);
|
||||||
Player.players[0].control(limited_editor);
|
Player.players[0].control(limited_editor);
|
||||||
Register.unregister_obj(this);
|
Register.unregister_obj(this);
|
||||||
|
@ -849,7 +848,6 @@ editor.inputs['M-p'].doc = "Do one time step, pausing if necessary.";
|
||||||
editor.inputs['C-M-p'] = function() {
|
editor.inputs['C-M-p'] = function() {
|
||||||
if (!Game.playing()) {
|
if (!Game.playing()) {
|
||||||
editor.start_play_ed();
|
editor.start_play_ed();
|
||||||
Game.editor_mode(false);
|
|
||||||
}
|
}
|
||||||
Log.warn(`Starting edited level ...`);
|
Log.warn(`Starting edited level ...`);
|
||||||
};
|
};
|
||||||
|
@ -1544,7 +1542,7 @@ var replpanel = Object.copy(inputpanel, {
|
||||||
|
|
||||||
return [
|
return [
|
||||||
Mum.text({str:log, anchor:[0,0], offset:[0,-300].sub(this.scrolloffset), selectable: true}),
|
Mum.text({str:log, anchor:[0,0], offset:[0,-300].sub(this.scrolloffset), selectable: true}),
|
||||||
Mum.text({str:this.value,color:Color.purple, offset:[0,-290], caret: this.caret})
|
Mum.text({str:this.value,color:Color.green, offset:[0,-290], caret: this.caret})
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
prevmark:-1,
|
prevmark:-1,
|
||||||
|
|
|
@ -239,6 +239,7 @@ load("scripts/gui.js");
|
||||||
|
|
||||||
var timer = {
|
var timer = {
|
||||||
make(fn, secs,obj,loop,app) {
|
make(fn, secs,obj,loop,app) {
|
||||||
|
obj ??= globalThis;
|
||||||
app ??= false;
|
app ??= false;
|
||||||
if (secs === 0) {
|
if (secs === 0) {
|
||||||
fn.call(obj);
|
fn.call(obj);
|
||||||
|
@ -246,17 +247,7 @@ var timer = {
|
||||||
}
|
}
|
||||||
|
|
||||||
var t = Object.create(this);
|
var t = Object.create(this);
|
||||||
|
t.id = make_timer(fn, secs, app, obj);
|
||||||
t.callback = fn;
|
|
||||||
var guardfn = function() {
|
|
||||||
if (typeof t.callback === 'function') {
|
|
||||||
t.callback();
|
|
||||||
if (!t.loop) t.kill();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Log.warn("Timer trying to execute without a function.");
|
|
||||||
};
|
|
||||||
t.id = make_timer(guardfn, secs, app);
|
|
||||||
t.loop = loop;
|
t.loop = loop;
|
||||||
t.pause();
|
t.pause();
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,13 @@ function grab_from_points(pos, points, slop) {
|
||||||
return idx;
|
return idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var actor = {};
|
||||||
|
actor.spawn = function(ur, config){};
|
||||||
|
actor.die = function(actor){};
|
||||||
|
actor.kill = function(actor){};
|
||||||
|
actor.delay = function(fn, seconds) {};
|
||||||
|
actor.clock = function(fn){};
|
||||||
|
|
||||||
var gameobject = {
|
var gameobject = {
|
||||||
impl: {
|
impl: {
|
||||||
full_path() {
|
full_path() {
|
||||||
|
@ -34,6 +41,12 @@ var gameobject = {
|
||||||
};
|
};
|
||||||
this.objects = {};
|
this.objects = {};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
timers:[],
|
||||||
|
delay(fn, seconds) {
|
||||||
|
var t = timer.oneshot(fn, seconds, this, false);
|
||||||
|
return function() { t.kill(); };
|
||||||
|
},
|
||||||
|
|
||||||
set max_velocity(x) { cmd(151, this.body, x); },
|
set max_velocity(x) { cmd(151, this.body, x); },
|
||||||
get max_velocity() { return cmd(152, this.body); },
|
get max_velocity() { return cmd(152, this.body); },
|
||||||
|
@ -286,6 +299,9 @@ var gameobject = {
|
||||||
if (typeof obj.debug === 'function')
|
if (typeof obj.debug === 'function')
|
||||||
Register.debug.register(obj.debug, obj);
|
Register.debug.register(obj.debug, obj);
|
||||||
|
|
||||||
|
if (typeof obj.gui === 'function')
|
||||||
|
Register.gui.register(obj.gui,obj);
|
||||||
|
|
||||||
obj.components.forEach(function(x) {
|
obj.components.forEach(function(x) {
|
||||||
if (typeof x.collide === 'function')
|
if (typeof x.collide === 'function')
|
||||||
register_collide(1, x.collide, x, obj.body, x.shape);
|
register_collide(1, x.collide, x, obj.body, x.shape);
|
||||||
|
@ -638,6 +654,7 @@ gameobject.doc = {
|
||||||
transform: `Return an object representing the transform state of this object.`,
|
transform: `Return an object representing the transform state of this object.`,
|
||||||
kill: `Remove this object from the world.`,
|
kill: `Remove this object from the world.`,
|
||||||
level: "The entity this entity belongs to.",
|
level: "The entity this entity belongs to.",
|
||||||
|
delay: 'Run the given function after the given number of seconds has elapsed.',
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Default objects */
|
/* Default objects */
|
||||||
|
|
|
@ -252,6 +252,7 @@ Mum.image = Mum.extend({
|
||||||
|
|
||||||
Mum.column = Mum.extend({
|
Mum.column = Mum.extend({
|
||||||
draw(cursor, cnt) {
|
draw(cursor, cnt) {
|
||||||
|
cnt ??= Mum;
|
||||||
if (this.hide) return;
|
if (this.hide) return;
|
||||||
cursor = cursor.add(this.offset);
|
cursor = cursor.add(this.offset);
|
||||||
this.max_width = cnt.width;
|
this.max_width = cnt.width;
|
||||||
|
|
|
@ -37,6 +37,10 @@ var physics = {
|
||||||
|
|
||||||
return cmd(86, box.pos, box.wh, points, points.length);
|
return cmd(86, box.pos, box.wh, points, points.length);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
shape_query(shape) {
|
||||||
|
return cmd(80,shape);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
physics.doc = {};
|
physics.doc = {};
|
||||||
|
|
|
@ -1673,11 +1673,8 @@ JSValue duk_anim(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
|
|
||||||
JSValue duk_make_timer(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
JSValue duk_make_timer(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||||
double secs = js2number(argv[1]);
|
double secs = js2number(argv[1]);
|
||||||
struct callee *c = malloc(sizeof(*c));
|
struct callee *c = make_callee(argv[0], argv[3]);
|
||||||
c->fn = JS_DupValue(js, argv[0]);
|
|
||||||
c->obj = globalThis;
|
|
||||||
int id = timer_make(secs, call_callee, c, 1, js2bool(argv[2]));
|
int id = timer_make(secs, call_callee, c, 1, js2bool(argv[2]));
|
||||||
|
|
||||||
return JS_NewInt64(js, id);
|
return JS_NewInt64(js, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1749,7 +1746,7 @@ void ffi_load() {
|
||||||
DUK_FUNC(make_edge2d, 3)
|
DUK_FUNC(make_edge2d, 3)
|
||||||
DUK_FUNC(cmd_edge2d, 6)
|
DUK_FUNC(cmd_edge2d, 6)
|
||||||
DUK_FUNC(make_model,2);
|
DUK_FUNC(make_model,2);
|
||||||
DUK_FUNC(make_timer, 3)
|
DUK_FUNC(make_timer, 4)
|
||||||
|
|
||||||
DUK_FUNC(cmd_points, 5);
|
DUK_FUNC(cmd_points, 5);
|
||||||
|
|
||||||
|
|
|
@ -71,13 +71,13 @@ void script_startup() {
|
||||||
|
|
||||||
void script_stop()
|
void script_stop()
|
||||||
{
|
{
|
||||||
|
timers_free();
|
||||||
send_signal("quit",0,NULL);
|
send_signal("quit",0,NULL);
|
||||||
|
|
||||||
for (int i = 0; i < shlen(jsstrs); i++)
|
for (int i = 0; i < shlen(jsstrs); i++)
|
||||||
JS_FreeValue(js,jsstrs[i].value);
|
JS_FreeValue(js,jsstrs[i].value);
|
||||||
|
|
||||||
JS_FreeContext(js);
|
JS_FreeContext(js);
|
||||||
JS_RunGC(rt);
|
|
||||||
JS_FreeRuntime(rt);
|
JS_FreeRuntime(rt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,6 +271,21 @@ void script_callee(struct callee c, int argc, JSValue *argv) {
|
||||||
js_callee_exec(&c, argc, argv);
|
js_callee_exec(&c, argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct callee *make_callee(JSValue fn, JSValue obj)
|
||||||
|
{
|
||||||
|
struct callee *c = malloc(sizeof(*c));
|
||||||
|
c->fn = JS_DupValue(js, fn);
|
||||||
|
c->obj = JS_DupValue(js, obj);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_callee(struct callee *c)
|
||||||
|
{
|
||||||
|
JS_FreeValue(js,c->fn);
|
||||||
|
JS_FreeValue(js,c->obj);
|
||||||
|
free(c);
|
||||||
|
}
|
||||||
|
|
||||||
void send_signal(const char *signal, int argc, JSValue *argv)
|
void send_signal(const char *signal, int argc, JSValue *argv)
|
||||||
{
|
{
|
||||||
JSValue globalThis = JS_GetGlobalObject(js);
|
JSValue globalThis = JS_GetGlobalObject(js);
|
||||||
|
|
|
@ -27,6 +27,8 @@ time_t jso_file(const char *file);
|
||||||
JSValue script_runfile(const char *file);
|
JSValue script_runfile(const char *file);
|
||||||
void script_update(double dt);
|
void script_update(double dt);
|
||||||
void script_draw();
|
void script_draw();
|
||||||
|
struct callee *make_callee(JSValue fn, JSValue obj);
|
||||||
|
void free_callee(struct callee *c);
|
||||||
|
|
||||||
void duk_run_err();
|
void duk_run_err();
|
||||||
void js_dump_stack();
|
void js_dump_stack();
|
||||||
|
|
|
@ -382,20 +382,20 @@ void anim_load(struct anim2d *anim, const char *path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void anim_play(struct anim2d *anim) {
|
void anim_play(struct anim2d *anim) {
|
||||||
if (anim->playing)
|
// if (anim->playing)
|
||||||
return;
|
// return;
|
||||||
|
|
||||||
if (anim->frame == anim_frames(anim->anim))
|
// if (anim->frame == anim_frames(anim->anim))
|
||||||
anim->frame = 0;
|
// anim->frame = 0;
|
||||||
|
|
||||||
anim->playing = 1;
|
// anim->playing = 1;
|
||||||
|
|
||||||
if (anim->timer == NULL)
|
// if (anim->timer == NULL)
|
||||||
anim->timer = id2timer(timer_make(1.f / anim->anim->ms, anim_incr, anim, 0, 0));
|
// anim->timer = id2timer(timer_make(1.f / anim->anim->ms, anim_incr, anim, 0, 0));
|
||||||
else
|
// else
|
||||||
timerr_settime(anim->timer, 1.f / anim->anim->ms);
|
// timerr_settime(anim->timer, 1.f / anim->anim->ms);
|
||||||
|
|
||||||
timer_start(anim->timer);
|
// timer_start(anim->timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void anim_stop(struct anim2d *anim) {
|
void anim_stop(struct anim2d *anim) {
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <stb_ds.h>
|
#include <stb_ds.h>
|
||||||
|
#include "script.h"
|
||||||
|
|
||||||
struct timer *timers;
|
struct timer *timers;
|
||||||
static int first = -1;
|
static int first = -1;
|
||||||
|
@ -76,7 +77,7 @@ void timer_start(struct timer *t) {
|
||||||
|
|
||||||
void timer_remove(int id) {
|
void timer_remove(int id) {
|
||||||
struct timer *t = id2timer(id);
|
struct timer *t = id2timer(id);
|
||||||
if (t->owndata) free(t->data);
|
free_callee(t->data);
|
||||||
t->next = first;
|
t->next = first;
|
||||||
t->on = 0;
|
t->on = 0;
|
||||||
first = id;
|
first = id;
|
||||||
|
@ -90,3 +91,9 @@ void timerr_settime(struct timer *t, double interval) {
|
||||||
struct timer *id2timer(int id) {
|
struct timer *id2timer(int id) {
|
||||||
return &timers[id];
|
return &timers[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void timers_free()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < arrlen(timers); i++)
|
||||||
|
free_callee(timers[i].data);
|
||||||
|
}
|
||||||
|
|
|
@ -23,4 +23,6 @@ void timer_stop(struct timer *t);
|
||||||
void timer_update(double dt, double scale);
|
void timer_update(double dt, double scale);
|
||||||
void timerr_settime(struct timer *t, double interval);
|
void timerr_settime(struct timer *t, double interval);
|
||||||
|
|
||||||
|
void timers_free();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue