From 5852e38cdb1ce93dc40b801495bc47667e906663 Mon Sep 17 00:00:00 2001 From: otya128 Date: Sun, 23 Aug 2015 10:53:58 +0900 Subject: [PATCH] =?UTF-8?q?SPANIM=E3=82=92=E3=83=AB=E3=83=BC=E3=83=97?= =?UTF-8?q?=E3=82=84=E9=9D=9E=E7=B7=9A=E5=BD=A2=E8=A3=9C=E5=AE=8C=E3=81=AB?= =?UTF-8?q?=E5=AF=BE=E5=BF=9C,=E9=96=A2=E6=95=B0=E5=86=85=E3=81=A7?= =?UTF-8?q?=E3=82=B0=E3=83=AD=E3=83=BC=E3=83=90=E3=83=AB=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=81=8C=E4=BD=BF=E3=81=88=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F?= =?UTF-8?q?=E3=83=90=E3=82=B0=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SMILEBASIC/compiler.d | 20 ++--- SMILEBASIC/petitcomputer.d | 2 - SMILEBASIC/sprite.d | 172 ++++++++++++++++++++++++++++--------- 3 files changed, 141 insertions(+), 53 deletions(-) diff --git a/SMILEBASIC/compiler.d b/SMILEBASIC/compiler.d index 50b0d58..3639bea 100644 --- a/SMILEBASIC/compiler.d +++ b/SMILEBASIC/compiler.d @@ -200,11 +200,6 @@ class Compiler void genCodePushVar(wstring name, Scope sc) { auto global = hasGlobalVarIndex(name); - if(sc.func) - { - code ~= new PushL(sc.func.getLocalVarIndex(name, this)); - return; - } if(global) { if(global < 0) @@ -215,16 +210,16 @@ class Compiler code ~= new PushG(global); return; } + if(sc.func) + { + code ~= new PushL(sc.func.getLocalVarIndex(name, this)); + return; + } code ~= new PushG(getGlobalVarIndex(name)); } void genCodePopVar(wstring name, Scope sc) { auto global = hasGlobalVarIndex(name); - if(sc.func) - { - code ~= new PopL(sc.func.getLocalVarIndex(name, this)); - return; - } if(global) { if(global < 0) @@ -235,6 +230,11 @@ class Compiler code ~= new PopG(global); return; } + if(sc.func) + { + code ~= new PopL(sc.func.getLocalVarIndex(name, this)); + return; + } code ~= new PopG(getGlobalVarIndex(name)); } void getVarIndex(wstring name, Scope sc, out int index, out bool isLocal) diff --git a/SMILEBASIC/petitcomputer.d b/SMILEBASIC/petitcomputer.d index 13c5c39..b3bfd24 100644 --- a/SMILEBASIC/petitcomputer.d +++ b/SMILEBASIC/petitcomputer.d @@ -657,14 +657,12 @@ class PetitComputer return; case SDL_KEYUP: { - if(event.key.repeat) break; auto key = event.key.keysym.sym; button &= ~buttonTable[event.key.keysym.scancode]; } break; case SDL_KEYDOWN: { - if(event.key.repeat) break; auto key = event.key.keysym.sym; button |= buttonTable[event.key.keysym.scancode]; if(key == SDLK_BACKSPACE) diff --git a/SMILEBASIC/sprite.d b/SMILEBASIC/sprite.d index 202e526..c4a96d8 100644 --- a/SMILEBASIC/sprite.d +++ b/SMILEBASIC/sprite.d @@ -51,7 +51,7 @@ struct SpriteAnimState } struct { - double s; + double scalex, scaley; } struct { @@ -76,7 +76,16 @@ struct SpriteAnimData SpriteAnimState old; int load(int i, ref SpriteData sprite, SpriteAnimTarget target, double[] data) { - this.frame = -cast(int)data[i]; + this.frame = cast(int)data[i]; + if(this.frame < 0) + { + this.frame = -this.frame; + interpolation = true; + } + if(this.frame == 0) + { + throw new IllegalFunctionCall("SPANIM"); + } i++; switch(target) { @@ -104,7 +113,10 @@ struct SpriteAnimData this.data.r = data[i++]; break; case SpriteAnimTarget.S: - this.data.s = data[i++]; + this.data.scalex = data[i++]; + this.data.scaley = data[i++]; + this.old.scalex = sprite.scalex; + this.old.scaley = sprite.scaley; break; case SpriteAnimTarget.C: this.data.c = cast(uint)data[i++]; @@ -118,6 +130,11 @@ struct SpriteAnimData return i; } } +struct SpriteDef +{ + int u, v, w, h, hx, hy; + SpriteAttr a; +} struct SpriteData { bool isAnim; @@ -164,7 +181,7 @@ struct SpriteData scalex = 1; scaley = 1; } - this(int id, ref SpriteDef spdef) + this(int id, ref SpriteDef spdef, int defno) { x = 0; y = 0; @@ -180,11 +197,21 @@ struct SpriteData this.define = true; scalex = 1; scaley = 1; + this.defno = defno; } SpriteAnimData[][SpriteAnimTarget.V] anim; - void setAnimation(SpriteAnimData[] anim, SpriteAnimTarget sat) + int[SpriteAnimTarget.V] animindex; + int[SpriteAnimTarget.V] animloop; + int[SpriteAnimTarget.V] animloopcnt; + void setAnimation(SpriteAnimData[] anim, SpriteAnimTarget sat, int loop) { this.anim[sat] = anim; + if(loop < 0) + { + throw new IllegalFunctionCall("SPANIM"); + } + animloop[sat] = loop; + animloopcnt[sat] = 0; isAnim = true; } void clear() @@ -192,11 +219,16 @@ struct SpriteData this.define = false; this.attr = SpriteAttr.none; } -} -struct SpriteDef -{ - int u, v, w, h, hx, hy; - SpriteAttr a; + void change(SpriteDef s) + { + this.u = s.u; + this.v = s.v; + this.w = s.w; + this.h = s.h; + this.homex = s.hx; + this.homey = s.hy; + this.attr = s.a; + } } class Sprite { @@ -227,6 +259,10 @@ class Sprite SPDEFTable[record.I] = SpriteDef(record.X, record.Y, record.W, record.H, record.HX, record.HY, cast(SpriteAttr)record.ATTR); } } + void spchr(int i, int d) + { + sprites[i].change(SPDEFTable[d]); + } this(PetitComputer petitcom) { sprites = new SpriteData[512]; @@ -240,40 +276,91 @@ class Sprite { if(!d) continue;//未定義 SpriteAnimTarget target = cast(SpriteAnimTarget)i; - int index = 0; + int index = sprite.animindex[i]; SpriteAnimData* data = &d[index]; data.elapse = data.elapse + 1; auto frame = data.elapse; - switch(target) + if(data.interpolation) { - case SpriteAnimTarget.XY: - sprite.x = data.old.x + ((data.data.x - data.old.x) / data.frame) * frame; - sprite.y = data.old.y + ((data.data.y - data.old.y) / data.frame) * frame; - break; - case SpriteAnimTarget.Z: - sprite.z = data.old.z + ((data.data.z - data.old.z) / data.frame) * frame; - break; - case SpriteAnimTarget.UV: - sprite.u = data.old.u + ((data.data.u - data.old.u) / data.frame) * frame; - sprite.v = data.old.v + ((data.data.v - data.old.v) / data.frame) * frame; - break; - case SpriteAnimTarget.I: - sprite.id = data.old.i + ((data.data.i - data.old.i) / data.frame) * frame; - break; - case SpriteAnimTarget.R: - break; - case SpriteAnimTarget.S: - break; - case SpriteAnimTarget.C: - break; - case SpriteAnimTarget.V: - break; - default: - break; + //線形補完する奴 + switch(target) + { + case SpriteAnimTarget.XY: + sprite.x = data.old.x + ((data.data.x - data.old.x) / data.frame) * frame; + sprite.y = data.old.y + ((data.data.y - data.old.y) / data.frame) * frame; + break; + case SpriteAnimTarget.Z: + sprite.z = data.old.z + ((data.data.z - data.old.z) / data.frame) * frame; + break; + case SpriteAnimTarget.UV: + sprite.u = data.old.u + ((data.data.u - data.old.u) / data.frame) * frame; + sprite.v = data.old.v + ((data.data.v - data.old.v) / data.frame) * frame; + break; + case SpriteAnimTarget.I: + sprite.defno = data.old.i + ((data.data.i - data.old.i) / data.frame) * frame; + spchr(sprite.id, sprite.defno); + break; + case SpriteAnimTarget.R: + break; + case SpriteAnimTarget.S: + sprite.scalex = data.old.scalex + ((data.data.scalex - data.old.scalex) / data.frame) * frame; + sprite.scaley = data.old.scaley + ((data.data.scaley - data.old.scaley) / data.frame) * frame; + break; + case SpriteAnimTarget.C: + break; + case SpriteAnimTarget.V: + break; + default: + break; + } } if(frame >= data.frame) { - sprite.anim[i] = null; + if(!data.interpolation) + { + switch(target) + { + case SpriteAnimTarget.XY: + sprite.x = data.data.x; + sprite.y = data.data.y; + break; + case SpriteAnimTarget.Z: + sprite.z = data.data.z; + break; + case SpriteAnimTarget.UV: + sprite.u = data.data.u; + sprite.v = data.data.v; + break; + case SpriteAnimTarget.I: + sprite.defno = data.data.i; + spchr(sprite.id, sprite.defno); + break; + case SpriteAnimTarget.R: + break; + case SpriteAnimTarget.S: + sprite.scalex = data.data.scalex; + sprite.scaley = data.data.scaley; + break; + case SpriteAnimTarget.C: + break; + case SpriteAnimTarget.V: + break; + default: + break; + } + } + sprite.animindex[i] = (sprite.animindex[i] + 1) % d.length; + data.elapse = 0; + if(sprite.animloop[i] == 0) + { + continue; + } + sprite.animloop[i]++; + if(sprite.animloop[i] >= sprite.animloopcnt[i]) + { + sprite.anim[i] = null; + continue; + } continue; } } @@ -392,7 +479,7 @@ class Sprite } void spset(int id, int defno) { - sprites[id] = SpriteData(id, SPDEFTable[defno]); + sprites[id] = SpriteData(id, SPDEFTable[defno], defno); } void spofs(int id, int x, int y) { @@ -410,12 +497,13 @@ class Sprite void spanim(int id, wstring target, double[] data) { bool relative = false; - if(target[$..$] == "+") + if(target[$ - 1..$] == "+") { target = target[0..$-1]; relative = true; } - spanim(id, spriteAnimTarget[target] | SpriteAnimTarget.relative, data); + spanim(id, spriteAnimTarget[target] | (relative ? SpriteAnimTarget.relative : cast(SpriteAnimTarget)0), data); + } static SpriteAnimTarget[wstring] spriteAnimTarget; static this() @@ -442,16 +530,18 @@ class Sprite int animcount = data.length / ((target == SpriteAnimTarget.XY || target == SpriteAnimTarget.UV) ? 3 : 2); SpriteAnimData[] animdata = new SpriteAnimData[animcount]; int j; + int loop = 1; for(int i = 0; i < data.length;) { i = animdata[j++].load(i, sprites[id], target, data); if(data.length - i == 1) { //loop + loop = cast(int)data[i]; break; } } - sprites[id].setAnimation(animdata, target); + sprites[id].setAnimation(animdata, target, loop); } void spclr(int id) {