diff --git a/SMILEBASIC/SMILEBASIC.visualdproj b/SMILEBASIC/SMILEBASIC.visualdproj
index b555c07..1a001c4 100644
--- a/SMILEBASIC/SMILEBASIC.visualdproj
+++ b/SMILEBASIC/SMILEBASIC.visualdproj
@@ -213,6 +213,7 @@
+
diff --git a/SMILEBASIC/petitcomputer.d b/SMILEBASIC/petitcomputer.d
index cd827ca..a061d89 100644
--- a/SMILEBASIC/petitcomputer.d
+++ b/SMILEBASIC/petitcomputer.d
@@ -10,6 +10,7 @@ import std.string;
import std.c.stdio;
import core.sync.mutex;
import otya.smilebasic.parser;
+import otya.smilebasic.sprite;
enum Button
{
UP = 1,
@@ -178,7 +179,7 @@ class PetitComputer
{
SDL_RWops* stream = SDL_RWFromFile(toStringz(file), toStringz("rb"));
auto src = IMG_LoadPNG_RW(stream);
- SDL_Surface* surface = SDL_CreateRGBSurface(0, src.w, src.h, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0xFF);
+ SDL_Surface* surface = SDL_CreateRGBSurface(0, src.w, src.h, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);//0xff000000, 0x00ff0000, 0x0000ff00, 0xFF);
SDL_Rect rect;
rect.x = 0;
rect.y = 0;
@@ -186,21 +187,24 @@ class PetitComputer
rect.h = src.h;
// SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND);
// SDL_SetSurfaceBlendMode(src, SDL_BLENDMODE_BLEND);
+
+ ubyte sr, sg, sb, sa;
+ SDL_GetRGBA((cast(uint*)src.pixels)[0], src.format, &sr, &sg, &sb, &sa);
+ auto color = SDL_MapRGBA(surface.format, sr, sg, sb, sa);
SDL_SetColorKey(src, SDL_TRUE, (cast(uint*)src.pixels)[0]);
- SDL_SetColorKey(surface, SDL_TRUE, (cast(uint*)src.pixels)[0]);
+ //SDL_SetColorKey(surface, SDL_TRUE, color);
int i = SDL_BlitSurface(src, &rect, surface, &rect);
auto srcpixels = (cast(uint*)src.pixels);
auto pixels = (cast(uint*)surface.pixels);
auto aaa = surface.format.Amask;
//surface.format.Amask = 0xFF;
- /+for(int x = 0; x < src.w; x++)
+ for(int x = 0; x < src.w; x++)
{
for(int y = 0; y < src.h; y++)
{
ubyte r, g, b, a;
- write(x,y, ',');
SDL_GetRGBA(*pixels, surface.format, &r, &g, &b, &a);
- if(r == 158 && g == 0 && b == 93)
+ if(r == sr && g == sg && b == sb)
{
r = 0;
g = 0;
@@ -208,14 +212,10 @@ class PetitComputer
a = 0;
*pixels = 0;
*pixels = SDL_MapRGBA(surface.format, r, g, b, a);
- }/+
- else
- *pixels = SDL_MapRGBA(surface.format, r, g, b, a);
- +/ubyte _r, _g, _b, _a;
- SDL_GetRGBA(*pixels, surface.format, &_r, &_g, &_b, &_a);
+ }
pixels++;
}
- }+/
+ }
SDL_RWclose(stream);
SDL_FreeSurface(src);
return new GraphicPage(surface);
@@ -304,6 +304,7 @@ class PetitComputer
}
}
SDL_Rect[] fontTable = new SDL_Rect[65536];
+ int sppage, bgpage;
void createFontTable()
{
string html = cast(string)get("http://smileboom.com/special/ptcm3/download/unicode/");
@@ -417,7 +418,9 @@ class PetitComputer
{
GRP[i] = createEmptyPage();
}
+ sppage = 4;
GRP[4] = createGRPF(spriteFile);
+ bgpage = 5;
GRP[5] = createGRPF(BGFile);
writeln("OK");
screenWidth = 400;
@@ -499,6 +502,7 @@ class PetitComputer
}
Button[] buttonTable;
+ Sprite sprite;
void render()
{
buttonTable = new Button[SDL_SCANCODE_SLEEP + 1];
@@ -547,10 +551,12 @@ class PetitComputer
//GRP[0] = GRPF;
//glEnable(GL_BLEND);
//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
glAlphaFunc(GL_GEQUAL, 0.5);
glEnable(GL_ALPHA_TEST);
draw = new otya.smilebasic.draw.Draw(this);
+ sprite = new Sprite(this);
+ sprite.spset(0, 0);
+ sprite.spofs(0, 9, 8);
while(true)
{
auto profile = SDL_GetTicks();
@@ -568,6 +574,7 @@ class PetitComputer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
renderGraphicPage();
renderConsoleGL();
+ sprite.render();
SDL_GL_SwapWindow(window);
auto renderticks = (SDL_GetTicks() - profile);
if(renderprofile) writeln(renderticks);
diff --git a/SMILEBASIC/sprite.d b/SMILEBASIC/sprite.d
new file mode 100644
index 0000000..b02ef32
--- /dev/null
+++ b/SMILEBASIC/sprite.d
@@ -0,0 +1,99 @@
+module otya.smilebasic.sprite;
+import otya.smilebasic.petitcomputer;
+import derelict.sdl2.sdl;
+import derelict.opengl3.gl;
+enum SpriteAttr
+{
+ show = 1,
+ rotate90 = 2,
+ rotate180 = 4,
+ rotate270 = 8,
+}
+struct SpriteData
+{
+ int id;
+ int defno;
+ double x, y;
+ double z;/*!*/
+ int u, v, w, h;//個々で保持してるみたい,SPSETをして後でSPDEFをしても変化しない
+ uint color;
+ double[8] var;
+ SpriteAttr attr;
+ bool define;//定義されてればtrue
+ this(int id, int defno)
+ {
+ x = 0;
+ y = 0;
+ this.id = id;
+ this.defno = defno;
+ this.color = -1;
+ this.attr = SpriteAttr.show;
+ }
+ this(int id, int u, int v, int w, int h)
+ {
+ x = 0;
+ y = 0;
+ this.id = id;
+ this.u = u;
+ this.v = v;
+ this.w = w;
+ this.h = h;
+ this.color = -1;
+ this.attr = SpriteAttr.show;
+ }
+}
+class Sprite
+{
+ SDL_Rect[2048] UVTable;
+ SpriteData[512] sprites;
+ PetitComputer petitcom;
+ void initUVTable()
+ {
+ UVTable[0] = SDL_Rect(0, 0, 16, 16);//Ichigo
+ }
+ this(PetitComputer petitcom)
+ {
+ initUVTable;
+ this.petitcom = petitcom;
+ }
+ void animation()
+ {
+ }
+ void render()
+ {
+ auto texture = petitcom.GRP[petitcom.sppage].glTexture;
+ float z = -0.01f;
+ glBindTexture(GL_TEXTURE_2D, texture);
+ glEnable(GL_TEXTURE_2D);
+ glBegin(GL_QUADS);
+ foreach(sprite; sprites)
+ {
+ if(sprite.attr & SpriteAttr.show)
+ {
+ glColor3f(1.0, 1.0, 1.0);
+ int x2 = cast(int)sprite.x + sprite.w;//-1
+ int y2 = cast(int)sprite.y + sprite.h;
+ int u2 = cast(int)sprite.u + sprite.w;//-1
+ int v2 = cast(int)sprite.v + sprite.h;
+ glTexCoord2f(sprite.u / 512f - 1 , v2 / 512f - 1);
+ glVertex3f(sprite.x / 200f - 1, 1 - y2 / 120f, z);
+ glTexCoord2f(sprite.u / 512f - 1, sprite.v / 512f - 1);
+ glVertex3f(sprite.x / 200f - 1, 1 - sprite.y / 120f, z);
+ glTexCoord2f(u2 / 512f - 1, sprite.v / 512f - 1);
+ glVertex3f(x2 / 200f - 1, 1 - sprite.y / 120f, z);
+ glTexCoord2f(u2 / 512f - 1, v2 / 512f - 1);
+ glVertex3f(x2 / 200f - 1, 1 - y2 / 120f, z);
+ }
+ }
+ glEnd();
+ }
+ void spset(int id, int defno)
+ {
+ sprites[id] = SpriteData(id, UVTable[defno].x, UVTable[defno].y, UVTable[defno].w, UVTable[defno].h);
+ }
+ void spofs(int id, int x, int y)
+ {
+ sprites[id].x = x;
+ sprites[id].y = y;
+ }
+}