From 57ef38a037b48c1ea0c7f8817c13df23d500135a Mon Sep 17 00:00:00 2001 From: otya128 Date: Sat, 22 Jul 2017 12:13:03 +0900 Subject: [PATCH] Implement SPHITINFO --- SMILEBASIC/builtinfunctions.d | 24 ++++++++++++++++++++++++ SMILEBASIC/sprite.d | 28 ++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 9650d30..2b9e3c0 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -2292,6 +2292,30 @@ class BuiltinFunction { p.sprite.spstop(); } + static void SPHITINFO(PetitComputer p, out double tm) + { + tm = p.sprite.spriteHitInfo.time; + } + static void SPHITINFO(PetitComputer p, out double tm, out double x1, out double y1, out double x2, out double y2) + { + tm = p.sprite.spriteHitInfo.time; + x1 = p.sprite.spriteHitInfo.x1; + y1 = p.sprite.spriteHitInfo.y1; + x2 = p.sprite.spriteHitInfo.x2; + y2 = p.sprite.spriteHitInfo.y2; + } + static void SPHITINFO(PetitComputer p, out double tm, out double x1, out double y1, out double vx1, out double vy1, out double x2, out double y2, out double vx2, out double vy2) + { + tm = p.sprite.spriteHitInfo.time; + x1 = p.sprite.spriteHitInfo.x1; + y1 = p.sprite.spriteHitInfo.y1; + x2 = p.sprite.spriteHitInfo.x2; + y2 = p.sprite.spriteHitInfo.y2; + vx1 = p.sprite.spriteHitInfo.vx1; + vy1 = p.sprite.spriteHitInfo.vy1; + vx2 = p.sprite.spriteHitInfo.vx2; + vy2 = p.sprite.spriteHitInfo.vy2; + } static void BGMSTOP(PetitComputer p) { writeln("NOTIMPL:BGMSTOP"); diff --git a/SMILEBASIC/sprite.d b/SMILEBASIC/sprite.d index 0ac6ef7..9c766a8 100644 --- a/SMILEBASIC/sprite.d +++ b/SMILEBASIC/sprite.d @@ -175,6 +175,9 @@ struct SpriteCollision short sy; ushort w; ushort h; + double vx = 0; + double vy = 0; + bool detection(ref SpriteData sp) { if(sp.define && sp.col.mask & mask) @@ -328,6 +331,18 @@ struct SpriteData SpriteCollision col; bool enableCol; } +struct SpriteHitInfo +{ + double time; + double x1 = 0; + double y1 = 0; + double vx1 = 0; + double vy1 = 0; + double x2 = 0; + double y2 = 0; + double vx2 = 0; + double vy2 = 0; +} class Sprite { SpriteDef[] defSPDEFTable; @@ -1146,6 +1161,7 @@ class Sprite end = spid(end); return sphitsp2(id, start, end); } + SpriteHitInfo spriteHitInfo; int sphitsp2(int id, int start, int end) { if (!sprites[id].enableCol) @@ -1156,7 +1172,19 @@ class Sprite { if(id == start) continue; if(sprites[start].enableCol && sprites[id].col.detection(sprites[start])) + { + spriteHitInfo.time = 0; + spriteHitInfo.x1 = sprites[id].x; + spriteHitInfo.y1 = sprites[id].y; + spriteHitInfo.vx1 = sprites[id].col.vx; + spriteHitInfo.vy1 = sprites[id].col.vy; + spriteHitInfo.x2 = sprites[start].x; + spriteHitInfo.y2 = sprites[start].y; + spriteHitInfo.vx2 = sprites[start].col.vx; + spriteHitInfo.vy2 = sprites[start].col.vy; + return start; + } } return -1; }