1
0

Fix SPLINK

This commit is contained in:
otya128
2016-12-24 15:01:03 +09:00
parent 2afa70943d
commit 7746dac4bb

View File

@@ -289,6 +289,7 @@ struct SpriteData
//SPLINKの親は子より小さい管理番号でしかなれないのでsprite->child->nextのX座標を加算すればなんとかなる //SPLINKの親は子より小さい管理番号でしかなれないのでsprite->child->nextのX座標を加算すればなんとかなる
//->挙動的に違う //->挙動的に違う
int linkx, linky; int linkx, linky;
double linkz = 0;
//SPCOL //SPCOL
SpriteCollision col; SpriteCollision col;
@@ -590,7 +591,7 @@ class Sprite
import std.range; import std.range;
import std.algorithm; import std.algorithm;
zChange = false; zChange = false;
synchronized (this) sort!("a.z > b.z", SwapStrategy.stable)(zsortedSprites); synchronized (this) sort!("a.linkz > b.linkz", SwapStrategy.stable)(zsortedSprites);
} }
float disw, dish, disw2, dish2; float disw, dish, disw2, dish2;
disw = petitcom.currentDisplay.rect[0].w / 2; disw = petitcom.currentDisplay.rect[0].w / 2;
@@ -661,18 +662,24 @@ class Sprite
continue; continue;
} }
int x, y; int x, y;
double spritez;
if(sprite.parent) if(sprite.parent)
{ {
x += cast(int)(sprite.x + sprite.parent.linkx); x += cast(int)(sprite.x + sprite.parent.linkx);
y += cast(int)(sprite.y + sprite.parent.linky); y += cast(int)(sprite.y + sprite.parent.linky);
spritez = sprite.z + sprite.parent.linkz;
} }
else else
{ {
x = cast(int)sprite.x;// - cast(int)(sprite.homex * sprite.scalex); x = cast(int)sprite.x;// - cast(int)(sprite.homex * sprite.scalex);
y = cast(int)sprite.y;// - cast(int)(sprite.homey * sprite.scaley); y = cast(int)sprite.y;// - cast(int)(sprite.homey * sprite.scaley);
spritez = sprite.z;
} }
sprite.linkx = x; sprite.linkx = x;
sprite.linky = y; sprite.linky = y;
if (sprite.linkz != spritez)
zChange = true;
sprite.linkz = spritez;
auto homex2 = ((sprite.w / 2f ) - sprite.homex); auto homex2 = ((sprite.w / 2f ) - sprite.homex);
auto homey2 = ((sprite.h / 2f ) - sprite.homey); auto homey2 = ((sprite.h / 2f ) - sprite.homey);
int w = sprite.w; int w = sprite.w;
@@ -851,8 +858,9 @@ class Sprite
sprites[id].z = z; sprites[id].z = z;
sprites[id].linkx = cast(int)(x + (sprites[id].parent ? sprites[id].parent.linkx : 0)); sprites[id].linkx = cast(int)(x + (sprites[id].parent ? sprites[id].parent.linkx : 0));
sprites[id].linky = cast(int)(y + (sprites[id].parent ? sprites[id].parent.linky : 0)); sprites[id].linky = cast(int)(y + (sprites[id].parent ? sprites[id].parent.linky : 0));
sprites[id].linkz = sprites[id].parent ? z + sprites[id].parent.linkz : z;
zChange = true;
} }
zChange = true;
} }
void getspofs(int id, out double x, out double y, out double z) void getspofs(int id, out double x, out double y, out double z)
{ {
@@ -1009,7 +1017,14 @@ class Sprite
//SPLINK 2,0 //SPLINK 2,0
//SPLINK 2,1した時の挙動謎 //SPLINK 2,1した時の挙動謎
//最後にSPSETした親が優先される->子が親を保持? //最後にSPSETした親が優先される->子が親を保持?
sprites[child].parent = &sprites[parent]; synchronized (this)
{
sprites[child].parent = &sprites[parent];
sprites[child].linkx = cast(int)(sprites[child].x + (sprites[child].parent ? sprites[child].parent.linkx : 0));
sprites[child].linky = cast(int)(sprites[child].y + (sprites[child].parent ? sprites[child].parent.linky : 0));
sprites[child].linkz = sprites[child].z + sprites[parent].linkz;
zChange = true;
}
} }
//再帰的にUNLINKされるのか //再帰的にUNLINKされるのか
void spunlink(int id) void spunlink(int id)