Resources for animations

This commit is contained in:
John Alanbrook 2023-12-27 23:28:10 +00:00
parent 5df1670538
commit 2195f9f5db
4 changed files with 36 additions and 16 deletions

View file

@ -79,6 +79,8 @@ component.sprite = Object.copy(component, {
_enghook: make_sprite,
});
Object.hide(component.sprite, 'rect');
component.sprite.impl = {
set path(x) {
//cmd(12,this.id,prototypes.resani(this.gameobject.__proto__.toString(), x),this.rect);
@ -107,6 +109,7 @@ component.sprite.impl = {
get drawmode() { return cmd(220,this.id); },
set drawmode(x) { cmd(219,this.id,x); },
emissive(x) { cmd(170, this.id, x); },
sync() { this.path = this.path; },
pickm() { return this; },
move(d) { this.pos = this.pos.add(d); },
@ -118,9 +121,14 @@ component.sprite.impl = {
},
kill() { cmd(9,this.id); },
dimensions() { return cmd(64,this.path); },
width() { return cmd(64,this.path).x; },
height() { return cmd(64,this.path).y; },
dimensions() {
var dim = Resources.texture.dimensions(this.path);
dim.x *= (this.rect.s1-this.rect.s0);
dim.y *= (this.rect.t1-this.rect.t0);
return dim;
},
width() { return this.dimensions().x; },
height() { return this.dimensions().y; },
};
Object.freeze(sprite);
@ -160,7 +168,7 @@ var SpriteAnim = {
var anim = {};
anim.frames = [];
anim.path = path;
var frames = cmd(139,path);
var frames = Resources.gif.frames(path);
var yslice = 1/frames;
for (var f = 0; f < frames; f++) {
var frame = {};
@ -174,9 +182,10 @@ var SpriteAnim = {
anim.frames.push(frame);
}
anim.loop = true;
var dim = cmd(64,path);
var dim = Resources.texture.dimensions(path);
dim.y /= frames;
anim.dim = dim;
anim.toJSON = function() { return {}; };
return anim;
},
@ -191,7 +200,7 @@ var SpriteAnim = {
frame.time = time;
anim.frames.push(frame);
}
anim.dim = cmd(64,path);
anim.dim = Resources.texture.dimensions(path);
anim.dim.x /= frames;
return anim;
},
@ -267,12 +276,7 @@ component.char2dimpl = {
},
anims:{},
sync() {
if (this.path)
cmd(12,this.id,this.path,this.rect);
},
acur:{},
frame: 0,
play_anim(anim) {
@ -301,7 +305,8 @@ component.char2dimpl = {
},
setsprite() {
cmd(12, this.id, this.acur.path, this.acur.frames[this.frame].rect);
this.rect = this.acur.frames[this.frame].rect;
this.path = this.path;
},
advance() {
@ -340,9 +345,7 @@ component.char2dimpl = {
},
};
Object.assign(component.char2d, component.char2dimpl);
component.char2d.doc = {
component.char2dimpl.doc = {
doc: "An animation player for sprites.",
frame: "The current frame of animation.",
anims: "A list of all animations in this player.",
@ -357,6 +360,8 @@ component.char2d.doc = {
add_anim: "Add an animation object with the given name."
};
Object.hide(component.char2dimpl, "doc");
/* Returns points specifying this geometry, with ccw */
var Geometry = {
box(w, h) {

View file

@ -870,6 +870,7 @@ editor.inputs['M-t'] = function() { editor.edit_level.objects.forEach(function(x
editor.inputs['M-t'].doc = "Unlock all objects in current level.";
editor.inputs['C-n'] = function() {
return;
};
editor.inputs['C-n'].doc = "Create an empty object.";

View file

@ -480,10 +480,13 @@ var gameobject = {
transform() {
var t = {};
t.pos = this.pos;
if (t.pos.every(x=>x===0)) delete t.pos;
t.angle = Math.places(this.angle,4);
if (t.angle === 0) delete t.angle;
t.scale = this.scale;
t.scale = t.scale.map((x,i) => x/this.__proto__.scale[i]);
t.scale = t.scale.map(x => Math.places(x,3));
if (t.scale.every(x=>x===1)) delete t.scale;
return t;
},

View file

@ -23,6 +23,17 @@ Resources.is_sound = function(path) {
return Resources.sounds.any(x => x === ext);
}
Resources.is_animation = function(path)
{
if (path.ext() === 'gif' && Resources.gif.frames(path) > 1) return true;
}
Resources.texture = {};
Resources.texture.dimensions = function(path) { return cmd(64,path); }
Resources.gif = {};
Resources.gif.frames = function(path) { return cmd(139,path); }
var Log = {
set level(x) { cmd(92,x); },
get level() { return cmd(93); },