フォント読み込みを実�
This commit is contained in:
@@ -120,8 +120,15 @@ END
|
|||||||
{
|
{
|
||||||
writeln(t);
|
writeln(t);
|
||||||
}
|
}
|
||||||
auto pc = new PetitComputer();
|
try
|
||||||
pc.run();
|
{
|
||||||
readln();
|
auto pc = new PetitComputer();
|
||||||
|
pc.run();
|
||||||
|
}
|
||||||
|
catch(Throwable t)
|
||||||
|
{
|
||||||
|
writeln(std.windows.charset.toMBSz(t.to!string).to!string);
|
||||||
|
readln();
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,194 @@
|
|||||||
module otya.smilebasic.petitcomputer;
|
module otya.smilebasic.petitcomputer;
|
||||||
import derelict.sdl2.sdl;
|
import derelict.sdl2.sdl;
|
||||||
|
import derelict.sdl2.image;
|
||||||
|
import std.net.curl;
|
||||||
|
import std.file;
|
||||||
|
import std.stdio;
|
||||||
|
import std.conv;
|
||||||
|
import std.string;
|
||||||
|
import std.c.stdio;
|
||||||
|
class GraphicPage
|
||||||
|
{
|
||||||
|
SDL_Surface* surface;
|
||||||
|
SDL_Texture* texture;
|
||||||
|
this(SDL_Surface* s)
|
||||||
|
{
|
||||||
|
surface = s;
|
||||||
|
}
|
||||||
|
void createTexture(SDL_Renderer* renderer)
|
||||||
|
{
|
||||||
|
texture = SDL_CreateTextureFromSurface(renderer, surface);
|
||||||
|
}
|
||||||
|
}
|
||||||
class PetitComputer
|
class PetitComputer
|
||||||
{
|
{
|
||||||
this()
|
this()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
void run()
|
static const string resourceDirName = "resources";
|
||||||
|
static const string resourcePath = "./resources";
|
||||||
|
static const string fontFile = resourcePath ~ "/font.png";
|
||||||
|
static const string spriteFile = resourcePath ~ "/defsp.png";
|
||||||
|
static const string BGFile = resourcePath ~ "/defbg.png";
|
||||||
|
static const string fontTableFile = resourcePath ~ "/fonttable.txt";
|
||||||
|
int screenWidth;
|
||||||
|
int screenHeight;
|
||||||
|
int fontWidth;
|
||||||
|
int fontHeight;
|
||||||
|
int consoleWidth;
|
||||||
|
int consoleHeight;
|
||||||
|
wchar[][] console;
|
||||||
|
GraphicPage[] grp;
|
||||||
|
GraphicPage GRPF;
|
||||||
|
//PNG画像から透過色のpixelを指定して透過しGRPを作る
|
||||||
|
GraphicPage createGraphicPage(string file, int pixel)
|
||||||
|
{
|
||||||
|
SDL_RWops* stream = SDL_RWFromFile(toStringz(file), toStringz("rb"));
|
||||||
|
auto surfacesrc = IMG_LoadPNG_RW(stream);
|
||||||
|
SDL_Surface* surface = SDL_CreateRGBSurface(0, surfacesrc.w, surfacesrc.h, 32, 0, 0, 0, 0);
|
||||||
|
SDL_Rect rect;
|
||||||
|
rect.x = 0;
|
||||||
|
rect.y = 0;
|
||||||
|
rect.w = surfacesrc.w;
|
||||||
|
rect.h = surfacesrc.h;
|
||||||
|
int i = SDL_BlitSurface(surfacesrc, &rect, surface, &rect);
|
||||||
|
SDL_SetColorKey(surface, SDL_TRUE, (cast(uint*)surface.pixels)[pixel]);
|
||||||
|
auto grp = new GraphicPage(surface);
|
||||||
|
SDL_FreeSurface(surfacesrc);
|
||||||
|
SDL_RWclose(stream);
|
||||||
|
return grp;
|
||||||
|
}
|
||||||
|
struct Point
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
this(int x, int y)
|
||||||
|
{
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_Rect[] fontTable = new SDL_Rect[65536];
|
||||||
|
void createFontTable()
|
||||||
|
{
|
||||||
|
string html = cast(string)get("http://smileboom.com/special/ptcm3/download/unicode/");
|
||||||
|
int pos = 0, index;
|
||||||
|
auto file = File(fontTableFile, "w");
|
||||||
|
std.algorithm.fill(fontTable, SDL_Rect(488,120, 8, 8));//TODO:480,120とどっちが使われているかは要調査
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
pos = html.indexOf("<tr><th>U+");
|
||||||
|
if(pos == -1) break;
|
||||||
|
pos += "<tr><th>U+".length;
|
||||||
|
html = html[pos..$];
|
||||||
|
writeln(index = html.parse!int(16));
|
||||||
|
file.write(index, ',');
|
||||||
|
pos = html.indexOf("</td><td>(");
|
||||||
|
if(pos == -1) break;
|
||||||
|
pos += "</td><td>(".length;
|
||||||
|
html = html[pos..$];
|
||||||
|
writeln(fontTable[index].x = html.parse!int);
|
||||||
|
file.write(fontTable[index].x, ',');
|
||||||
|
pos = html.indexOf(',');
|
||||||
|
html = html[pos + 1..$];
|
||||||
|
munch(html, " ");
|
||||||
|
writeln(fontTable[index].y = html.parse!int);
|
||||||
|
file.write(fontTable[index].y, '\n');
|
||||||
|
fontTable[index].w = 8;
|
||||||
|
fontTable[index].h = 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void loadFontTable()
|
||||||
|
{
|
||||||
|
import std.csv;
|
||||||
|
import std.typecons;
|
||||||
|
std.algorithm.fill(fontTable, SDL_Rect(488,120, 8, 8));//TODO:480,120とどっちが使われているかは要調査
|
||||||
|
auto csv = csvReader!(Tuple!(int,int,int))(readText(fontTableFile));
|
||||||
|
foreach(record; csv)
|
||||||
|
{
|
||||||
|
fontTable[record[0]].x = record[1];
|
||||||
|
fontTable[record[0]].y = record[2];
|
||||||
|
fontTable[record[0]].w = 8;
|
||||||
|
fontTable[record[0]].h = 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void init()
|
||||||
{
|
{
|
||||||
DerelictSDL2.load();
|
DerelictSDL2.load();
|
||||||
|
DerelictSDL2Image.load();
|
||||||
|
if(!exists(resourcePath))
|
||||||
|
{
|
||||||
|
writeln("create ./resources");
|
||||||
|
mkdir(resourceDirName);
|
||||||
|
}
|
||||||
|
if(!exists(fontFile))
|
||||||
|
{
|
||||||
|
writeln("download font");
|
||||||
|
download("http://smileboom.com/special/ptcm3/download/unicode/image/res_font_table-320.png",
|
||||||
|
fontFile);
|
||||||
|
}
|
||||||
|
GRPF = createGraphicPage(fontFile, 0);
|
||||||
|
if(!exists(spriteFile))
|
||||||
|
{
|
||||||
|
writeln("download sprite");
|
||||||
|
download("http://smileboom.com/special/ptcm3/image/ss-story-attachment-1.png",
|
||||||
|
spriteFile);
|
||||||
|
}
|
||||||
|
if(!exists(BGFile))
|
||||||
|
{
|
||||||
|
writeln("download BG");
|
||||||
|
download("http://smileboom.com/special/ptcm3/image/ss-story-attachment-2.png",
|
||||||
|
BGFile);
|
||||||
|
}
|
||||||
|
if(!exists(fontTableFile))
|
||||||
|
{
|
||||||
|
writeln("create font table");
|
||||||
|
//HTMLなんて解析したくないから適当
|
||||||
|
createFontTable();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
loadFontTable();
|
||||||
|
}
|
||||||
|
writeln("OK");
|
||||||
|
screenWidth = 400;
|
||||||
|
screenHeight = 240;
|
||||||
|
fontWidth = 8;
|
||||||
|
fontHeight = 8;
|
||||||
|
consoleWidth = screenWidth / fontWidth;
|
||||||
|
consoleHeight = screenHeight / fontHeight;
|
||||||
|
console = new wchar[][consoleHeight];
|
||||||
|
for(int i = 0; i < console.length; i++)
|
||||||
|
{
|
||||||
|
console[i] = new wchar[consoleWidth];
|
||||||
|
for(int j = 0; j < console[i].length; j++)
|
||||||
|
console[i][j] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_Renderer* renderer;
|
||||||
|
void run()
|
||||||
|
{
|
||||||
|
init();
|
||||||
SDL_Init(SDL_INIT_VIDEO);
|
SDL_Init(SDL_INIT_VIDEO);
|
||||||
SDL_Window* window = SDL_CreateWindow("SMILEBASIC", SDL_WINDOWPOS_UNDEFINED,
|
SDL_Window* window = SDL_CreateWindow("SMILEBASIC", SDL_WINDOWPOS_UNDEFINED,
|
||||||
SDL_WINDOWPOS_UNDEFINED, 400, 240,
|
SDL_WINDOWPOS_UNDEFINED, 400, 240,
|
||||||
SDL_WINDOW_SHOWN);
|
SDL_WINDOW_SHOWN);
|
||||||
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
|
renderer = SDL_CreateRenderer(window, -1, 0);
|
||||||
|
GRPF.createTexture(renderer);
|
||||||
|
console[1][0] = 'A';
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
|
||||||
SDL_RenderClear(renderer);
|
SDL_RenderClear(renderer);
|
||||||
|
renderConsole;
|
||||||
SDL_RenderPresent(renderer);
|
SDL_RenderPresent(renderer);
|
||||||
while (SDL_PollEvent(&event))
|
while (SDL_PollEvent(&event))
|
||||||
{
|
{
|
||||||
switch (event.type)
|
switch (event.type)
|
||||||
{
|
{
|
||||||
case SDL_KEYDOWN,SDL_QUIT:
|
case SDL_KEYDOWN,SDL_QUIT:
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
|
SDL_Quit();
|
||||||
return;
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -34,4 +199,16 @@ class PetitComputer
|
|||||||
SDL_DestroyWindow(window);
|
SDL_DestroyWindow(window);
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
}
|
}
|
||||||
|
int CSRX;
|
||||||
|
int CSRY;
|
||||||
|
int CSRZ;
|
||||||
|
void renderConsole()
|
||||||
|
{
|
||||||
|
for(int y = 0; y < consoleHeight; y++)
|
||||||
|
for(int x = 0; x < consoleWidth; x++)
|
||||||
|
{
|
||||||
|
SDL_Rect rect = SDL_Rect(x * 8, y * 8, 8, 8);
|
||||||
|
SDL_RenderCopy(renderer, GRPF.texture, &fontTable[console[y][x]], &rect);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user