100 lines
2.6 KiB
D
100 lines
2.6 KiB
D
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;
|
|
}
|
|
}
|