1
0

SPANIMをループや非線形補完に対応,関数内でグローバル変数が使えなかったバグを修正

This commit is contained in:
otya128
2015-08-23 10:53:58 +09:00
parent 5ce3342dde
commit 5852e38cdb
3 changed files with 141 additions and 53 deletions

View File

@@ -200,11 +200,6 @@ class Compiler
void genCodePushVar(wstring name, Scope sc) void genCodePushVar(wstring name, Scope sc)
{ {
auto global = hasGlobalVarIndex(name); auto global = hasGlobalVarIndex(name);
if(sc.func)
{
code ~= new PushL(sc.func.getLocalVarIndex(name, this));
return;
}
if(global) if(global)
{ {
if(global < 0) if(global < 0)
@@ -215,16 +210,16 @@ class Compiler
code ~= new PushG(global); code ~= new PushG(global);
return; return;
} }
if(sc.func)
{
code ~= new PushL(sc.func.getLocalVarIndex(name, this));
return;
}
code ~= new PushG(getGlobalVarIndex(name)); code ~= new PushG(getGlobalVarIndex(name));
} }
void genCodePopVar(wstring name, Scope sc) void genCodePopVar(wstring name, Scope sc)
{ {
auto global = hasGlobalVarIndex(name); auto global = hasGlobalVarIndex(name);
if(sc.func)
{
code ~= new PopL(sc.func.getLocalVarIndex(name, this));
return;
}
if(global) if(global)
{ {
if(global < 0) if(global < 0)
@@ -235,6 +230,11 @@ class Compiler
code ~= new PopG(global); code ~= new PopG(global);
return; return;
} }
if(sc.func)
{
code ~= new PopL(sc.func.getLocalVarIndex(name, this));
return;
}
code ~= new PopG(getGlobalVarIndex(name)); code ~= new PopG(getGlobalVarIndex(name));
} }
void getVarIndex(wstring name, Scope sc, out int index, out bool isLocal) void getVarIndex(wstring name, Scope sc, out int index, out bool isLocal)

View File

@@ -657,14 +657,12 @@ class PetitComputer
return; return;
case SDL_KEYUP: case SDL_KEYUP:
{ {
if(event.key.repeat) break;
auto key = event.key.keysym.sym; auto key = event.key.keysym.sym;
button &= ~buttonTable[event.key.keysym.scancode]; button &= ~buttonTable[event.key.keysym.scancode];
} }
break; break;
case SDL_KEYDOWN: case SDL_KEYDOWN:
{ {
if(event.key.repeat) break;
auto key = event.key.keysym.sym; auto key = event.key.keysym.sym;
button |= buttonTable[event.key.keysym.scancode]; button |= buttonTable[event.key.keysym.scancode];
if(key == SDLK_BACKSPACE) if(key == SDLK_BACKSPACE)

View File

@@ -51,7 +51,7 @@ struct SpriteAnimState
} }
struct struct
{ {
double s; double scalex, scaley;
} }
struct struct
{ {
@@ -76,7 +76,16 @@ struct SpriteAnimData
SpriteAnimState old; SpriteAnimState old;
int load(int i, ref SpriteData sprite, SpriteAnimTarget target, double[] data) 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++; i++;
switch(target) switch(target)
{ {
@@ -104,7 +113,10 @@ struct SpriteAnimData
this.data.r = data[i++]; this.data.r = data[i++];
break; break;
case SpriteAnimTarget.S: 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; break;
case SpriteAnimTarget.C: case SpriteAnimTarget.C:
this.data.c = cast(uint)data[i++]; this.data.c = cast(uint)data[i++];
@@ -118,6 +130,11 @@ struct SpriteAnimData
return i; return i;
} }
} }
struct SpriteDef
{
int u, v, w, h, hx, hy;
SpriteAttr a;
}
struct SpriteData struct SpriteData
{ {
bool isAnim; bool isAnim;
@@ -164,7 +181,7 @@ struct SpriteData
scalex = 1; scalex = 1;
scaley = 1; scaley = 1;
} }
this(int id, ref SpriteDef spdef) this(int id, ref SpriteDef spdef, int defno)
{ {
x = 0; x = 0;
y = 0; y = 0;
@@ -180,11 +197,21 @@ struct SpriteData
this.define = true; this.define = true;
scalex = 1; scalex = 1;
scaley = 1; scaley = 1;
this.defno = defno;
} }
SpriteAnimData[][SpriteAnimTarget.V] anim; 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; this.anim[sat] = anim;
if(loop < 0)
{
throw new IllegalFunctionCall("SPANIM");
}
animloop[sat] = loop;
animloopcnt[sat] = 0;
isAnim = true; isAnim = true;
} }
void clear() void clear()
@@ -192,11 +219,16 @@ struct SpriteData
this.define = false; this.define = false;
this.attr = SpriteAttr.none; this.attr = SpriteAttr.none;
} }
} void change(SpriteDef s)
struct SpriteDef {
{ this.u = s.u;
int u, v, w, h, hx, hy; this.v = s.v;
SpriteAttr a; this.w = s.w;
this.h = s.h;
this.homex = s.hx;
this.homey = s.hy;
this.attr = s.a;
}
} }
class Sprite 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); 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) this(PetitComputer petitcom)
{ {
sprites = new SpriteData[512]; sprites = new SpriteData[512];
@@ -240,40 +276,91 @@ class Sprite
{ {
if(!d) continue;//未定義 if(!d) continue;//未定義
SpriteAnimTarget target = cast(SpriteAnimTarget)i; SpriteAnimTarget target = cast(SpriteAnimTarget)i;
int index = 0; int index = sprite.animindex[i];
SpriteAnimData* data = &d[index]; SpriteAnimData* data = &d[index];
data.elapse = data.elapse + 1; data.elapse = data.elapse + 1;
auto frame = data.elapse; 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; switch(target)
sprite.y = data.old.y + ((data.data.y - data.old.y) / data.frame) * frame; {
break; case SpriteAnimTarget.XY:
case SpriteAnimTarget.Z: sprite.x = data.old.x + ((data.data.x - data.old.x) / data.frame) * frame;
sprite.z = data.old.z + ((data.data.z - data.old.z) / data.frame) * frame; sprite.y = data.old.y + ((data.data.y - data.old.y) / data.frame) * frame;
break; break;
case SpriteAnimTarget.UV: case SpriteAnimTarget.Z:
sprite.u = data.old.u + ((data.data.u - data.old.u) / data.frame) * frame; sprite.z = data.old.z + ((data.data.z - data.old.z) / data.frame) * frame;
sprite.v = data.old.v + ((data.data.v - data.old.v) / data.frame) * frame; break;
break; case SpriteAnimTarget.UV:
case SpriteAnimTarget.I: sprite.u = data.old.u + ((data.data.u - data.old.u) / data.frame) * frame;
sprite.id = data.old.i + ((data.data.i - data.old.i) / data.frame) * frame; sprite.v = data.old.v + ((data.data.v - data.old.v) / data.frame) * frame;
break; break;
case SpriteAnimTarget.R: case SpriteAnimTarget.I:
break; sprite.defno = data.old.i + ((data.data.i - data.old.i) / data.frame) * frame;
case SpriteAnimTarget.S: spchr(sprite.id, sprite.defno);
break; break;
case SpriteAnimTarget.C: case SpriteAnimTarget.R:
break; break;
case SpriteAnimTarget.V: case SpriteAnimTarget.S:
break; sprite.scalex = data.old.scalex + ((data.data.scalex - data.old.scalex) / data.frame) * frame;
default: sprite.scaley = data.old.scaley + ((data.data.scaley - data.old.scaley) / data.frame) * frame;
break; break;
case SpriteAnimTarget.C:
break;
case SpriteAnimTarget.V:
break;
default:
break;
}
} }
if(frame >= data.frame) 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; continue;
} }
} }
@@ -392,7 +479,7 @@ class Sprite
} }
void spset(int id, int defno) 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) void spofs(int id, int x, int y)
{ {
@@ -410,12 +497,13 @@ class Sprite
void spanim(int id, wstring target, double[] data) void spanim(int id, wstring target, double[] data)
{ {
bool relative = false; bool relative = false;
if(target[$..$] == "+") if(target[$ - 1..$] == "+")
{ {
target = target[0..$-1]; target = target[0..$-1];
relative = true; 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 SpriteAnimTarget[wstring] spriteAnimTarget;
static this() static this()
@@ -442,16 +530,18 @@ class Sprite
int animcount = data.length / ((target == SpriteAnimTarget.XY || target == SpriteAnimTarget.UV) ? 3 : 2); int animcount = data.length / ((target == SpriteAnimTarget.XY || target == SpriteAnimTarget.UV) ? 3 : 2);
SpriteAnimData[] animdata = new SpriteAnimData[animcount]; SpriteAnimData[] animdata = new SpriteAnimData[animcount];
int j; int j;
int loop = 1;
for(int i = 0; i < data.length;) for(int i = 0; i < data.length;)
{ {
i = animdata[j++].load(i, sprites[id], target, data); i = animdata[j++].load(i, sprites[id], target, data);
if(data.length - i == 1) if(data.length - i == 1)
{ {
//loop //loop
loop = cast(int)data[i];
break; break;
} }
} }
sprites[id].setAnimation(animdata, target); sprites[id].setAnimation(animdata, target, loop);
} }
void spclr(int id) void spclr(int id)
{ {