Fix animations from not deleting gameobjects
This commit is contained in:
parent
32333c32ad
commit
3f73a808d8
|
@ -58,14 +58,14 @@ actor.interval = function(fn, seconds) {
|
|||
}
|
||||
|
||||
actor.delay = function(fn, seconds) {
|
||||
var that = this;
|
||||
var timers = this.timers;
|
||||
var stop = function() {
|
||||
that.timers.remove(stop);
|
||||
timers.remove(stop);
|
||||
rm();
|
||||
}
|
||||
|
||||
function execute() {
|
||||
fn.call(that);
|
||||
fn();
|
||||
stop();
|
||||
}
|
||||
|
||||
|
@ -80,7 +80,7 @@ actor.delay = function(fn, seconds) {
|
|||
|
||||
var rm = Register.appupdate.register(update);
|
||||
|
||||
this.timers.push(stop);
|
||||
timers.push(stop);
|
||||
return stop;
|
||||
};
|
||||
|
||||
|
|
|
@ -89,33 +89,33 @@ Object.mixin(os.sprite(true), {
|
|||
anim:{},
|
||||
playing: 0,
|
||||
play(str) {
|
||||
console.trace();
|
||||
this.del_anim?.();
|
||||
var sp = this;
|
||||
var self = this;
|
||||
var stop;
|
||||
this.del_anim = function() {
|
||||
sp = undefined;
|
||||
self.del_anim = function() {
|
||||
self.del_anim = undefined;
|
||||
self = undefined;
|
||||
advance = undefined;
|
||||
this.del_anim = undefined;
|
||||
stop();
|
||||
}
|
||||
str ??= 0;
|
||||
var playing = this.anim[str];
|
||||
var playing = self.anim[str];
|
||||
if (!playing) return;
|
||||
var f = 0;
|
||||
sp.path = playing.path;
|
||||
self.path = playing.path;
|
||||
|
||||
function advance() {
|
||||
if (!sp) this.del_anim();
|
||||
if (!sp.gameobject) return;
|
||||
//sp.path = playing.path;
|
||||
sp.frame = playing.frames[f].rect;
|
||||
if (!self) return;
|
||||
if (!self.gameobject) return;
|
||||
//self.path = playing.path;
|
||||
self.frame = playing.frames[f].rect;
|
||||
f = (f+1)%playing.frames.length;
|
||||
if (f === 0) {
|
||||
sp.anim_done?.();
|
||||
if (!sp.loop) { sp.stop(); return; }
|
||||
self.anim_done?.();
|
||||
self.anim_done = undefined;
|
||||
// if (!self.loop) { self.stop(); return; }
|
||||
}
|
||||
stop = sp.gameobject.delay(advance, playing.frames[f].time);
|
||||
stop = self.gameobject.delay(advance, playing.frames[f].time);
|
||||
}
|
||||
this.tex(game.texture(playing.path));
|
||||
advance();
|
||||
|
@ -124,7 +124,6 @@ Object.mixin(os.sprite(true), {
|
|||
this.del_anim?.();
|
||||
},
|
||||
set path(p) {
|
||||
console.info(`setting path to ${p}`);
|
||||
p = Resources.find_image(p);
|
||||
if (!p) {
|
||||
console.warn(`Could not find image ${p}.`);
|
||||
|
@ -347,7 +346,6 @@ var SpriteAnim = {
|
|||
find(path) {
|
||||
if (!io.exists(path + ".asset")) return;
|
||||
var asset = JSON.parse(io.slurp(path + ".asset"));
|
||||
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -180,10 +180,9 @@ var gameobject = {
|
|||
},
|
||||
|
||||
delay(fn, seconds) {
|
||||
var that = this;
|
||||
|
||||
var timers = this.timers;
|
||||
var stop = function() {
|
||||
that.timers.remove(stop);
|
||||
timers.remove(stop);
|
||||
execute = undefined;
|
||||
stop = undefined;
|
||||
rm?.();
|
||||
|
@ -192,7 +191,7 @@ var gameobject = {
|
|||
}
|
||||
|
||||
function execute() {
|
||||
fn.call(that);
|
||||
fn();
|
||||
stop?.();
|
||||
}
|
||||
|
||||
|
@ -205,7 +204,7 @@ var gameobject = {
|
|||
}
|
||||
|
||||
var rm = Register.update.register(update);
|
||||
this.timers.push(stop);
|
||||
timers.push(stop);
|
||||
return stop;
|
||||
},
|
||||
|
||||
|
@ -256,8 +255,8 @@ var gameobject = {
|
|||
spawn(text, config, callback) {
|
||||
var ent = os.make_gameobject();
|
||||
ent.setref(ent);
|
||||
ent.components ??= {};
|
||||
ent.objects ??= {};
|
||||
ent.components = {};
|
||||
ent.objects = {};
|
||||
ent.timers = [];
|
||||
if (typeof text === 'object') // assume it's an ur
|
||||
{
|
||||
|
@ -301,8 +300,6 @@ var gameobject = {
|
|||
if (sim.playing())
|
||||
if (typeof ent.start === 'function') ent.start();
|
||||
|
||||
ent.objects ??= {};
|
||||
ent.components ??= {};
|
||||
Object.hide(ent, 'ur', 'components', 'objects', '_ed', 'timers', 'master');
|
||||
|
||||
var mur = ent.get_ur();
|
||||
|
@ -315,11 +312,12 @@ var gameobject = {
|
|||
var o = ent.objects;
|
||||
delete ent.objects;
|
||||
for (var i in o) {
|
||||
say(`MAKING ${i}`);
|
||||
console.info(`MAKING ${i}`);
|
||||
var n = ent.spawn(ur[o[i].ur]);
|
||||
ent.rename_obj(n.toString(), i);
|
||||
delete o[i].ur;
|
||||
Object.assign(n, o[i]);
|
||||
n.sync();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -537,14 +535,19 @@ var gameobject = {
|
|||
for (var key in this.components) {
|
||||
this.components[key].kill?.();
|
||||
this.components[key].gameobject = undefined;
|
||||
this[key].enabled = false;
|
||||
delete this.components[key];
|
||||
delete this[key];
|
||||
}
|
||||
delete this.components;
|
||||
|
||||
this.clear();
|
||||
this.objects = undefined;
|
||||
|
||||
if (typeof this.stop === 'function') this.stop();
|
||||
|
||||
for (var i in this) {
|
||||
if (typeof this[i] === 'object') delete this[i];
|
||||
if (typeof this[i] === 'function') delete this[i];
|
||||
}
|
||||
},
|
||||
|
||||
up() { return [0, 1].rotate(this.angle); },
|
||||
|
@ -581,7 +584,6 @@ var gameobject = {
|
|||
},
|
||||
|
||||
add_component(comp, data, name) {
|
||||
data ??= undefined;
|
||||
if (typeof comp.make !== 'function') return;
|
||||
name ??= comp.toString();
|
||||
name = obj_unique_name(name, this);
|
||||
|
@ -607,7 +609,7 @@ function go_init() {
|
|||
gop.sync = function() {
|
||||
gsync.call(this);
|
||||
this.components.forEach(function(x) { x.sync?.(); });
|
||||
this.objects.forEach(function(x) { x.sync(); });
|
||||
this.objects.forEach(function(x) { x.sync?.(); });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ appy.inputs = {};
|
|||
if (os.sys() === 'macos') {
|
||||
appy.inputs['S-q'] = os.quit;
|
||||
appy.inputs['S-h'] = function() { };
|
||||
appy.inputs['S-g'] = os.gc;
|
||||
}
|
||||
|
||||
player[0].control(appy);
|
||||
|
|
|
@ -87,7 +87,6 @@ void mYughLog(int category, int priority, int line, const char *file, const char
|
|||
vprintf(message, args);
|
||||
va_end(args);
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
//if (priority >= LOG_ERROR)
|
||||
|
|
|
@ -43,9 +43,18 @@ static JSValue globalThis;
|
|||
static JSClassID js_ptr_id;
|
||||
static JSClassDef js_ptr_class = { "POINTER" };
|
||||
|
||||
JSValue str2js(const char *c) {
|
||||
JSValue str2js(const char *c, ...) {
|
||||
if (!c) return JS_UNDEFINED;
|
||||
return JS_NewString(js, c);
|
||||
char *result = NULL;
|
||||
va_list args;
|
||||
va_start(args, c);
|
||||
va_list args2;
|
||||
va_copy(args2,args);
|
||||
char buf[1+vsnprintf(NULL, 0, c, args)];
|
||||
va_end(args);
|
||||
vsnprintf(buf, sizeof buf, c, args2);
|
||||
va_end(args2);
|
||||
return JS_NewString(js, buf);
|
||||
}
|
||||
|
||||
const char *js2str(JSValue v) {
|
||||
|
@ -67,25 +76,7 @@ QJSCLASS(material)
|
|||
QJSCLASS(mesh)
|
||||
QJSCLASS(window)
|
||||
QJSCLASS(drawmodel)
|
||||
|
||||
/* qjs class colliders and constraints */
|
||||
/* constraint works for all constraints - 2d or 3d */
|
||||
static JSClassID js_constraint_id;
|
||||
static void js_constraint_finalizer(JSRuntime *rt, JSValue val) {
|
||||
constraint *c = JS_GetOpaque(val, js_constraint_id);
|
||||
constraint_free(c);
|
||||
}
|
||||
static JSClassDef js_constraint_class = {
|
||||
"constraint",
|
||||
.finalizer = js_constraint_finalizer
|
||||
};
|
||||
static constraint *js2constraint(JSValue val) { return JS_GetOpaque(val, js_constraint_id); }
|
||||
static JSValue constraint2js(constraint *c)
|
||||
{
|
||||
JSValue j = JS_NewObjectClass(js, js_constraint_id);
|
||||
JS_SetOpaque(j, c);
|
||||
return j;
|
||||
}
|
||||
QJSCLASS(constraint)
|
||||
|
||||
static JSValue sound_proto;
|
||||
sound *js2sound(JSValue v) { return js2dsp_node(v)->data; }
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "quickjs/quickjs.h"
|
||||
#include "HandmadeMath.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
#define MIST_CFUNC_DEF(name, length, func1) { name, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE | JS_PROP_ENUMERABLE, JS_DEF_CFUNC, 0, .u = { .func = { length, JS_CFUNC_generic, { .generic = func1 } } } }
|
||||
|
||||
|
@ -93,6 +94,8 @@ static JSValue TYPE##2js(TYPE *n) { \
|
|||
YughSpam("Created " #TYPE " at %p", n); \
|
||||
JS_SetOpaque(j,n);\
|
||||
return j; }\
|
||||
\
|
||||
static JSValue js_##TYPE##_memid (JSContext *js, JSValue this) { return str2js("%p", js2##TYPE(this)); } \
|
||||
|
||||
#define QJSGLOBALCLASS(NAME) \
|
||||
JSValue NAME = JS_NewObject(js); \
|
||||
|
@ -108,8 +111,10 @@ JS_NewClass(JS_GetRuntime(js), js_##TYPE##_id, &js_##TYPE##_class);\
|
|||
QJSCLASSPREP(TYPE); \
|
||||
JSValue TYPE##_proto = JS_NewObject(js); \
|
||||
JS_SetPropertyFunctionList(js, TYPE##_proto, js_##TYPE##_funcs, countof(js_##TYPE##_funcs)); \
|
||||
JS_SetPropertyStr(js, TYPE##_proto, "memid", JS_NewCFunction(js, &js_##TYPE##_memid, "memid", 0)); \
|
||||
JS_SetClassProto(js, js_##TYPE##_id, TYPE##_proto); \
|
||||
|
||||
|
||||
#define countof(x) (sizeof(x)/sizeof((x)[0]))
|
||||
|
||||
void ffi_load();
|
||||
|
@ -125,7 +130,7 @@ int js_print_exception(JSValue v);
|
|||
struct rgba js2color(JSValue v);
|
||||
double js2number(JSValue v);
|
||||
JSValue number2js(double g);
|
||||
JSValue str2js(const char *c);
|
||||
JSValue str2js(const char *c, ...);
|
||||
|
||||
void nota_int(char *blob);
|
||||
|
||||
|
|
|
@ -98,9 +98,11 @@ void sprite_draw_all() {
|
|||
|
||||
qsort(sprites, arrlen(sprites), sizeof(*sprites), sprite_sort);
|
||||
|
||||
for (int i = 0; i < arrlen(sprites); i++)
|
||||
for (int i = 0; i < arrlen(sprites); i++) {
|
||||
if (!sprites[i]->enabled) continue;
|
||||
sprite_draw(sprites[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void sprite_initialize() {
|
||||
shader_sprite = sg_make_shader(sprite_shader_desc(sg_query_backend()));
|
||||
|
|
|
@ -65,7 +65,10 @@ void c_init() {
|
|||
JS_FreeValue(js, c_start);
|
||||
}
|
||||
|
||||
void c_frame() { script_call_sym(c_process_fn,0,NULL); }
|
||||
void c_frame() {
|
||||
script_call_sym(c_process_fn,0,NULL);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void cleanup()
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue