1
0

Implement relative sprite animation

This commit is contained in:
otya128
2017-07-10 21:32:00 +09:00
parent e8edabab5a
commit 4dd7ededea

View File

@@ -76,8 +76,9 @@ struct SpriteAnimData
bool interpolation;//線形補完するかどうか bool interpolation;//線形補完するかどうか
SpriteAnimState data; SpriteAnimState data;
SpriteAnimState old; SpriteAnimState old;
int load(int i, ref SpriteData sprite, SpriteAnimTarget target, double[] data, SpriteAnimData* old) int load(int i, ref SpriteData sprite, SpriteAnimTarget target, double[] data, SpriteAnimData* old, bool r)
{ {
relative = r;
this.frame = cast(int)data[i]; this.frame = cast(int)data[i];
if(this.frame < 0) if(this.frame < 0)
{ {
@@ -94,30 +95,57 @@ struct SpriteAnimData
case SpriteAnimTarget.XY: case SpriteAnimTarget.XY:
this.data.x = cast(int)data[i++]; this.data.x = cast(int)data[i++];
this.data.y = cast(int)data[i++]; this.data.y = cast(int)data[i++];
if (!old && relative)
{
this.data.x += sprite.x;
this.data.y += sprite.y;
}
this.old.x = old ? old.data.x : sprite.x; this.old.x = old ? old.data.x : sprite.x;
this.old.y = old ? old.data.y : sprite.y; this.old.y = old ? old.data.y : sprite.y;
break; break;
case SpriteAnimTarget.Z: case SpriteAnimTarget.Z:
this.data.z = cast(int)data[i++]; this.data.z = cast(int)data[i++];
if (!old && relative)
{
this.data.z += sprite.z;
}
this.old.z = old ? old.data.z : sprite.z; this.old.z = old ? old.data.z : sprite.z;
break; break;
case SpriteAnimTarget.UV: case SpriteAnimTarget.UV:
this.data.u = cast(int)data[i++]; this.data.u = cast(int)data[i++];
this.data.v = cast(int)data[i++]; this.data.v = cast(int)data[i++];
if (!old && relative)
{
this.data.u += sprite.u;
this.data.v += sprite.v;
}
this.old.u = old ? old.data.u : sprite.u; this.old.u = old ? old.data.u : sprite.u;
this.old.v = old ? old.data.v : sprite.v; this.old.v = old ? old.data.v : sprite.v;
break; break;
case SpriteAnimTarget.I: case SpriteAnimTarget.I:
this.data.i = cast(int)data[i++]; this.data.i = cast(int)data[i++];
if (!old && relative)
{
this.data.i += sprite.defno;
}
this.old.i = old ? old.data.i : sprite.defno; this.old.i = old ? old.data.i : sprite.defno;
break; break;
case SpriteAnimTarget.R: case SpriteAnimTarget.R:
this.data.r = data[i++]; this.data.r = data[i++];
if (!old && relative)
{
this.data.r += sprite.r;
}
this.old.r = old ? old.data.r : sprite.r; this.old.r = old ? old.data.r : sprite.r;
break; break;
case SpriteAnimTarget.S: case SpriteAnimTarget.S:
this.data.scalex = data[i++]; this.data.scalex = data[i++];
this.data.scaley = data[i++]; this.data.scaley = data[i++];
if (!old && relative)
{
this.data.scalex += sprite.scalex;
this.data.scaley += sprite.scaley;
}
this.old.scalex = old ? old.data.scalex : sprite.scalex; this.old.scalex = old ? old.data.scalex : sprite.scalex;
this.old.scaley = old ? old.data.scaley : sprite.scaley; this.old.scaley = old ? old.data.scaley : sprite.scaley;
break; break;
@@ -890,7 +918,7 @@ class Sprite
SpriteAnimData* old; SpriteAnimData* old;
for(int i = 0; i < data.length;) for(int i = 0; i < data.length;)
{ {
i = animdata[j].load(i, sprites[id], target, data, old); i = animdata[j].load(i, sprites[id], target, data, old, relative);
old = &animdata[j++]; old = &animdata[j++];
if(data.length - i == 1) if(data.length - i == 1)
{ {