Implement SPSTART/SPSTOP
This commit is contained in:
@@ -2256,6 +2256,40 @@ class BuiltinFunction
|
|||||||
throw new IllegalFunctionCall("SPFUNC"/*, 2*/);
|
throw new IllegalFunctionCall("SPFUNC"/*, 2*/);
|
||||||
p.sprite.spfunc(id, callback);
|
p.sprite.spfunc(id, callback);
|
||||||
}
|
}
|
||||||
|
static void SPSTART(PetitComputer p, int id)
|
||||||
|
{
|
||||||
|
if (!p.sprite.isValidSpriteId(id))
|
||||||
|
{
|
||||||
|
throw new OutOfRange("SPSTART", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!p.sprite.isSpriteDefined(id))
|
||||||
|
{
|
||||||
|
throw new IllegalFunctionCall("SPSTART", 1);
|
||||||
|
}
|
||||||
|
p.sprite.spstart(id);
|
||||||
|
}
|
||||||
|
static void SPSTART(PetitComputer p)
|
||||||
|
{
|
||||||
|
p.sprite.spstart();
|
||||||
|
}
|
||||||
|
static void SPSTOP(PetitComputer p, int id)
|
||||||
|
{
|
||||||
|
if (!p.sprite.isValidSpriteId(id))
|
||||||
|
{
|
||||||
|
throw new OutOfRange("SPSTOP", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!p.sprite.isSpriteDefined(id))
|
||||||
|
{
|
||||||
|
throw new IllegalFunctionCall("SPSTOP", 1);
|
||||||
|
}
|
||||||
|
p.sprite.spstop(id);
|
||||||
|
}
|
||||||
|
static void SPSTOP(PetitComputer p)
|
||||||
|
{
|
||||||
|
p.sprite.spstop();
|
||||||
|
}
|
||||||
static void BGMSTOP(PetitComputer p)
|
static void BGMSTOP(PetitComputer p)
|
||||||
{
|
{
|
||||||
writeln("NOTIMPL:BGMSTOP");
|
writeln("NOTIMPL:BGMSTOP");
|
||||||
|
|||||||
@@ -255,6 +255,7 @@ struct SpriteData
|
|||||||
this.defno = defno;
|
this.defno = defno;
|
||||||
col = SpriteCollision(&this);
|
col = SpriteCollision(&this);
|
||||||
}
|
}
|
||||||
|
bool animationEnabled = true;
|
||||||
SpriteAnimData[][SpriteAnimTarget.V + 1] anim;
|
SpriteAnimData[][SpriteAnimTarget.V + 1] anim;
|
||||||
int[SpriteAnimTarget.V + 1] animindex;
|
int[SpriteAnimTarget.V + 1] animindex;
|
||||||
int[SpriteAnimTarget.V + 1] animloop;
|
int[SpriteAnimTarget.V + 1] animloop;
|
||||||
@@ -395,6 +396,11 @@ class Sprite
|
|||||||
this.petitcom = petitcom;
|
this.petitcom = petitcom;
|
||||||
}
|
}
|
||||||
void animation(SpriteData* sprite, SpriteAnimData* data, SpriteAnimTarget target)
|
void animation(SpriteData* sprite, SpriteAnimData* data, SpriteAnimTarget target)
|
||||||
|
{
|
||||||
|
if (!sprite.animationEnabled)
|
||||||
|
return;
|
||||||
|
auto frame = data.elapse;
|
||||||
|
if(frame == 1)
|
||||||
{
|
{
|
||||||
if(!data.interpolation)
|
if(!data.interpolation)
|
||||||
{
|
{
|
||||||
@@ -430,89 +436,6 @@ class Sprite
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
auto frame = data.elapse;
|
|
||||||
//線形補完する奴
|
|
||||||
switch(target)
|
|
||||||
{
|
|
||||||
case SpriteAnimTarget.XY:
|
|
||||||
sprite.x = cast(int)(data.old.x + ((data.data.x - data.old.x) / data.frame) * frame);
|
|
||||||
sprite.y = cast(int)(data.old.y + ((data.data.y - data.old.y) / data.frame) * frame);
|
|
||||||
break;
|
|
||||||
case SpriteAnimTarget.Z:
|
|
||||||
sprite.z = cast(int)(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:
|
|
||||||
sprite.r = data.old.r + ((data.data.r - data.old.r) / data.frame) * frame;
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void animation(SpriteData* sprite)
|
|
||||||
{
|
|
||||||
foreach(i, ref d; sprite.anim)
|
|
||||||
{
|
|
||||||
if(!d) continue;//未定義
|
|
||||||
SpriteAnimTarget target = cast(SpriteAnimTarget)i;
|
|
||||||
int index = sprite.animindex[i];
|
|
||||||
SpriteAnimData* data = &d[index];
|
|
||||||
data.elapse = data.elapse + 1;
|
|
||||||
auto frame = data.elapse;
|
|
||||||
if(frame == 1)
|
|
||||||
{
|
|
||||||
if(!data.interpolation)
|
|
||||||
{
|
|
||||||
switch(target)
|
|
||||||
{
|
|
||||||
case SpriteAnimTarget.XY:
|
|
||||||
sprite.x = data.data.x;
|
|
||||||
sprite.y = data.data.y;
|
|
||||||
break;
|
|
||||||
case SpriteAnimTarget.Z:
|
|
||||||
sprite.z = cast(int)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:
|
|
||||||
sprite.r = data.data.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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(data.interpolation)
|
if(data.interpolation)
|
||||||
{
|
{
|
||||||
@@ -520,8 +443,8 @@ class Sprite
|
|||||||
switch(target)
|
switch(target)
|
||||||
{
|
{
|
||||||
case SpriteAnimTarget.XY:
|
case SpriteAnimTarget.XY:
|
||||||
sprite.x = data.old.x + ((data.data.x - data.old.x) / data.frame) * frame;
|
sprite.x = cast(int)(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;
|
sprite.y = cast(int)(data.old.y + ((data.data.y - data.old.y) / data.frame) * frame);
|
||||||
break;
|
break;
|
||||||
case SpriteAnimTarget.Z:
|
case SpriteAnimTarget.Z:
|
||||||
sprite.z = cast(int)(data.old.z + ((data.data.z - data.old.z) / data.frame) * frame);
|
sprite.z = cast(int)(data.old.z + ((data.data.z - data.old.z) / data.frame) * frame);
|
||||||
@@ -549,6 +472,20 @@ class Sprite
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
void animation(SpriteData* sprite)
|
||||||
|
{
|
||||||
|
if (!sprite.animationEnabled)
|
||||||
|
return;
|
||||||
|
foreach(i, ref d; sprite.anim)
|
||||||
|
{
|
||||||
|
if(!d) continue;//未定義
|
||||||
|
SpriteAnimTarget target = cast(SpriteAnimTarget)i;
|
||||||
|
int index = sprite.animindex[i];
|
||||||
|
SpriteAnimData* data = &d[index];
|
||||||
|
data.elapse = data.elapse + 1;
|
||||||
|
auto frame = data.elapse;
|
||||||
|
animation(sprite, data, target);
|
||||||
if(frame >= data.frame)
|
if(frame >= data.frame)
|
||||||
{
|
{
|
||||||
sprite.animindex[i] = (sprite.animindex[i] + 1) % cast(int)d.length;
|
sprite.animindex[i] = (sprite.animindex[i] + 1) % cast(int)d.length;
|
||||||
@@ -1255,4 +1192,43 @@ class Sprite
|
|||||||
{
|
{
|
||||||
return sprites[spid(id)].callback;
|
return sprites[spid(id)].callback;
|
||||||
}
|
}
|
||||||
|
void spstart(int id)
|
||||||
|
{
|
||||||
|
setSpriteAnimationEnabled(id, true);
|
||||||
|
}
|
||||||
|
void spstart()
|
||||||
|
{
|
||||||
|
setSpriteAnimationEnabled(true);
|
||||||
|
}
|
||||||
|
void spstop(int id)
|
||||||
|
{
|
||||||
|
setSpriteAnimationEnabled(id, false);
|
||||||
|
}
|
||||||
|
void spstop()
|
||||||
|
{
|
||||||
|
setSpriteAnimationEnabled(false);
|
||||||
|
}
|
||||||
|
void setSpriteAnimationEnabled(int id, bool flag)
|
||||||
|
{
|
||||||
|
id = spid(id);
|
||||||
|
sprites[id].animationEnabled = flag;
|
||||||
|
}
|
||||||
|
void setSpriteAnimationEnabled(bool flag)
|
||||||
|
{
|
||||||
|
auto id = spid(0);
|
||||||
|
if(spmax <= id)
|
||||||
|
{
|
||||||
|
synchronized (this) for(int i = id; i < sprites.length; i++)
|
||||||
|
{
|
||||||
|
sprites[i].animationEnabled = flag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
synchronized (this) for(int i = 0; i < spmax; i++)
|
||||||
|
{
|
||||||
|
sprites[i].animationEnabled = flag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user