From 5ce3342ddea787ebe97cf943009fe34807297761 Mon Sep 17 00:00:00 2001 From: otya128 Date: Sat, 22 Aug 2015 22:49:23 +0900 Subject: [PATCH] =?UTF-8?q?SPHOME,SPCLR,SPSCALE,STR,HEX=E5=AE=9F=EF=BF=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SMILEBASIC/builtinfunctions.d | 17 ++++++++++++++ SMILEBASIC/petitcomputer.d | 2 ++ SMILEBASIC/sprite.d | 42 +++++++++++++++++++++++++++-------- 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index e65d17f..09c1f9e 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -301,6 +301,15 @@ class BuiltinFunction { return cast(int)str[0]; } + static wstring STR(int val) + { + return val.to!wstring; + } + static wstring HEX(int val) + { + //ひどい + return val.to!string(16).to!wstring; + } static void SPSET(PetitComputer p, int id, int defno) { p.sprite.spset(id, defno); @@ -406,6 +415,14 @@ class BuiltinFunction else p.sprite.spclr(cast(int)i); } + static void SPHOME(PetitComputer p, int i, int hx, int hy) + { + p.sprite.sphome(i, hx, hy); + } + static void SPSCALE(PetitComputer p, int i, int x, int y) + { + p.sprite.spscale(i, x, y); + } static void BGMSTOP(PetitComputer p) { writeln("NOTIMPL:BGMSTOP"); diff --git a/SMILEBASIC/petitcomputer.d b/SMILEBASIC/petitcomputer.d index b3bfd24..13c5c39 100644 --- a/SMILEBASIC/petitcomputer.d +++ b/SMILEBASIC/petitcomputer.d @@ -657,12 +657,14 @@ class PetitComputer return; case SDL_KEYUP: { + if(event.key.repeat) break; auto key = event.key.keysym.sym; button &= ~buttonTable[event.key.keysym.scancode]; } break; case SDL_KEYDOWN: { + if(event.key.repeat) break; auto key = event.key.keysym.sym; button |= buttonTable[event.key.keysym.scancode]; if(key == SDLK_BACKSPACE) diff --git a/SMILEBASIC/sprite.d b/SMILEBASIC/sprite.d index bfe2c87..202e526 100644 --- a/SMILEBASIC/sprite.d +++ b/SMILEBASIC/sprite.d @@ -74,9 +74,8 @@ struct SpriteAnimData bool interpolation;//線形補完するかどうか SpriteAnimState data; SpriteAnimState old; - int load(ref SpriteData sprite, SpriteAnimTarget target, double[] data) + int load(int i, ref SpriteData sprite, SpriteAnimTarget target, double[] data) { - int i = 0; this.frame = -cast(int)data[i]; i++; switch(target) @@ -132,6 +131,8 @@ struct SpriteData double[8] var; SpriteAttr attr; bool define;//定義されてればtrue + double scalex; + double scaley; this(bool flag) { define = false; @@ -145,6 +146,8 @@ struct SpriteData this.color = -1; this.attr = SpriteAttr.show; this.define = true; + scalex = 1; + scaley = 1; } this(int id, int u, int v, int w, int h) { @@ -158,6 +161,8 @@ struct SpriteData this.color = -1; this.attr = SpriteAttr.show; this.define = true; + scalex = 1; + scaley = 1; } this(int id, ref SpriteDef spdef) { @@ -173,6 +178,8 @@ struct SpriteData this.homex = spdef.hx; this.homey = spdef.hy; this.define = true; + scalex = 1; + scaley = 1; } SpriteAnimData[][SpriteAnimTarget.V] anim; void setAnimation(SpriteAnimData[] anim, SpriteAnimTarget sat) @@ -183,6 +190,7 @@ struct SpriteData void clear() { this.define = false; + this.attr = SpriteAttr.none; } } struct SpriteDef @@ -289,8 +297,8 @@ class Sprite } if(sprite.attr & SpriteAttr.show) { - int x = cast(int)sprite.x - sprite.homex; - int y = cast(int)sprite.y - sprite.homey; + int x = cast(int)sprite.x - cast(int)(sprite.homex * sprite.scalex); + int y = cast(int)sprite.y - cast(int)(sprite.homey * sprite.scaley); int w = sprite.w; int h = sprite.h; if((sprite.attr & SpriteAttr.rotate90) == SpriteAttr.rotate90) @@ -303,20 +311,20 @@ class Sprite int v = cast(int)sprite.v; int u2 = cast(int)sprite.u + sprite.w;//-1 int v2 = cast(int)sprite.v + sprite.h; - int flipx = 1, flipy = 1, flipx2 = x, flipy2 = y; + float flipx = cast(float)sprite.scalex, flipy = cast(float)sprite.scaley, flipx2 = x, flipy2 = y; if(sprite.attr & SpriteAttr.hflip) { - flipx = -1; + flipx = -flipx; flipx2 = x2; } if(sprite.attr & SpriteAttr.hflip) { - flipy = -1; + flipy = -flipy; flipy2 = y2; } glTranslatef((flipx2) / 200f - 1,1 - ((flipy2) / 120f), z); - glRotatef(d, 0.0f, 0.0f, 1.0f ); glScalef(flipx, flipy, 1f); + glRotatef(d, 0.0f, 0.0f, 1.0f ); glBegin(GL_QUADS); glColor3f(1.0, 1.0, 1.0); if(sprite.attr == SpriteAttr.show) @@ -433,9 +441,15 @@ class Sprite } int animcount = data.length / ((target == SpriteAnimTarget.XY || target == SpriteAnimTarget.UV) ? 3 : 2); SpriteAnimData[] animdata = new SpriteAnimData[animcount]; + int j; for(int i = 0; i < data.length;) { - i = animdata[i].load(sprites[id], target, data); + i = animdata[j++].load(i, sprites[id], target, data); + if(data.length - i == 1) + { + //loop + break; + } } sprites[id].setAnimation(animdata, target); } @@ -450,4 +464,14 @@ class Sprite spclr(i); } } + void sphome(int i, int hx, int hy) + { + sprites[i].homex = hx; + sprites[i].homey = hy; + } + void spscale(int i, int x, int y) + { + sprites[i].scalex = x; + sprites[i].scaley = y; + } }