SPANIMをループや非線形補完に対応,関数内でグローバル変数が使えなかったバグを修正
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user