ついにLUTを使う!

LUT=Look Up Table(参照表です)

Listing. 1: LUTで文字表を読んで描く
"theMain.cpp"
#include "DxLib.h"
#include <string.h>
 
namespace
{
	const int WIN_WIDTH = 1024;
	const int WIN_HEIGHT = 768;
	char str[] = "I Scream IceCream!";
	char samp[] = "CAB";
	const int CHAR_W = 20;
	const int CHAR_H = 20;
	const int MARGIN = 8;
	const int MAX_MOJI = 8*7;//8列7行の表
	struct Point
	{
		int x;
		int y;
	};
 
	Point LUT[MAX_MOJI];
}
 
 
void DxInit()
{
	ChangeWindowMode(true);
	SetWindowSizeChangeEnableFlag(false, false);
	SetMainWindowText("文字列を画像で表示するぞ");
	SetGraphMode(WIN_WIDTH, WIN_HEIGHT, 32);
	SetWindowSizeExtendRate(1.0);
	SetBackgroundColor(0, 0, 205);
 
	// DXライブラリ初期化処理
	if (DxLib_Init() == -1)
	{
		DxLib_End();
	}
 
	SetDrawScreen(DX_SCREEN_BACK);
}
 
//大文字’U’を引数にすると21が帰ってくる
// 20 ← GetWordNum('U');
int GetWordNum(char moji)
{   //char str[56+1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!?. ";と同じ
	char str[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!?. ";
	int length = strlen(str);
	int res = -1;//なんも見つからなかったら-1をエラーとして返す
	for (int i = 0; i < length; i++)
	{
		if (moji == str[i]) {
			res = i;
			break;
		}
	}
	return( res );
}
void MakeLUT()
{
	//LUTをつくるよ!
	//LUT[56]にwx,wyを設定していく
	const int TWIDTH = 8;//画像の文字の表の幅(文字数)
	for (int i = 0; i < MAX_MOJI; i++)
	{
		Point tmp;
		tmp.x = i % TWIDTH;
		tmp.y = i / TWIDTH;
		LUT[i] = tmp;
	}
}
//
//Point GetWordPos(char moji)
//{
//
//
//
//	return(LUT[res]);
//}
 
 
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
	DxInit();
 
	int hWTable = -1; //画像の読み込みが成功すると0より大きいハンドルが返ってくるよ!
	hWTable = LoadGraph("Image\\abc_table_refine.png");
 
	int length = strlen(str); //表示するメッセージの文字数
	//Look UP Table (参照表)を前処理で作っておけたらかっちょいい
	MakeLUT();
 
	while (true)
	{
		ClearDrawScreen();
 
		//ここにやりたい処理を書く
		//char samp[] = "ABC";
		//20x20 @ 1文字
		int TWIDTH = 8;//画像の文字の表の幅(文字数)
		for (int i = 0; i < length; i++)
		{
			int n = GetWordNum(str[i]);
			//int wx = n % TWIDTH;
			//int wy = n / TWIDTH;
 
			DrawRectGraph(10 + MARGIN * i, 10, //表示位置の調整
						  LUT[n].x*CHAR_W, LUT[n].y*CHAR_H, CHAR_W, CHAR_H,
				          hWTable, TRUE); //画像からの切り抜き位置
		}
 
 
 
		//for (int i = 0; i < length; i++)
		//{
		//	//if (samp[i] == 'A')
		//	//{
		//	//	DrawRectGraph(10 + 20 * i, 10,
		//	//		           0, 0, 20, 20, hWTable, TRUE);
		//	//}
		//	//else if (samp[i] == 'B')
		//	//{
		//	//	DrawRectGraph(10 + 20 * i,10, 
		//	//		          20, 0, 20, 20, hWTable, TRUE);
		//	//}
		//	//else if (samp[i] == 'C')
		//	//{
		//	//	DrawRectGraph(10 + 20 * i, 10, 
		//	//		          40, 0, 20, 20, hWTable, TRUE);
		//	//}
 
		//	switch (str[i])
		//	{
		//	case 'A':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			0, 0, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'B':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			20, 0, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'C':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			40, 0, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'D':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			60, 0, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'E':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			80, 0, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'F':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			100, 0, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'G':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			120, 0, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'H':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			140, 0, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'I':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			0, 20, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'J':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			20, 20, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'K':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			40, 20, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'L':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			60, 20, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'M':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			80, 20, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'N':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			100, 20, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'O':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			120, 20, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'P':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			140, 20, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'Q':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			0, 40, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'R':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			20, 40, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'S':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			40, 40, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'T':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			60, 40, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'U':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			80, 40, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'V':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			100, 40, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'W':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			120, 40, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'X':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			140, 40, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'Y':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			0, 60, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'Z':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			20, 60, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'a':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			40, 60, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'b':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			60, 60, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'c':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			80, 60, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'd':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			100, 60, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'e':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			120, 60, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'f':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			140, 60, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'g':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			0, 80, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'h':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			20, 80, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'i':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			40, 80, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'j':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			60, 80, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'k':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			80, 80, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'l':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			100, 80, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'm':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			120, 80, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'n':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			140, 80, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'o':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			0, 100, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'p':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			20, 100, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'q':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			40, 100, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'r':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			60,100, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 's':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			80, 100, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 't':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			100, 100, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'u':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			120, 100, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'v':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			140, 100, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'w':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			0, 120, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'x':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			20, 120, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'y':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			40, 120, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case 'z':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			60, 120, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case '!':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			80, 120, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case '?':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			100, 120, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case '.':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			120, 120, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	case ' ':
		//		DrawRectGraph(10 + MARGIN * i, 10,
		//			140, 120, CHAR_W, CHAR_H, hWTable, TRUE);
		//		break;
		//	default:break;
		//	}
		//}
		//	DrawGraph(10, 10, hWTable, TRUE);
 
 
		ScreenFlip();
		WaitTimer(16);
		if (ProcessMessage() == -1)
			break;
		if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
			break;
	}
 
	DxLib_End();
	return 0;
}

最終形(連想配列を使った参照表)

Listing. 2: Mapを使ってプログラムをきれいにしていくよ
"theMain.cpp"
#include "DxLib.h"
#include <string.h>
#include <map>
 
namespace
{
	const int WIN_WIDTH = 1024;
	const int WIN_HEIGHT = 768;
	char str[] = "I Scream IceCream!";
	char samp[] = "CAB";
	const int CHAR_W = 20;
	const int CHAR_H = 20;
	const int MARGIN = 8;
	const int MAX_MOJI = 8*7;//8列7行の表
	struct Point
	{
		int x;
		int y;
	};
 
	Point LUT[MAX_MOJI];
	std::map<char, Point> LUM;
}
 
 
void DxInit()
{
	ChangeWindowMode(true);
	SetWindowSizeChangeEnableFlag(false, false);
	SetMainWindowText("文字列を画像で表示するぞ");
	SetGraphMode(WIN_WIDTH, WIN_HEIGHT, 32);
	SetWindowSizeExtendRate(1.0);
	SetBackgroundColor(0, 0, 205);
 
	// DXライブラリ初期化処理
	if (DxLib_Init() == -1)
	{
		DxLib_End();
	}
 
	SetDrawScreen(DX_SCREEN_BACK);
}
 
//大文字’U’を引数にすると21が帰ってくる
// 20 ← GetWordNum('U');
int GetWordNum(char moji)
{   //char str[56+1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!?. ";と同じ
	char str[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!?. ";
	int length = strlen(str);
	int res = -1;//なんも見つからなかったら-1をエラーとして返す
	for (int i = 0; i < length; i++)
	{
		if (moji == str[i]) {
			res = i;
			break;
		}
	}
	return( res );
}
void MakeLUT()
{
	//LUTをつくるよ!
	//LUT[56]にwx,wyを設定していく
	const int TWIDTH = 8;//画像の文字の表の幅(文字数)
	for (int i = 0; i < MAX_MOJI; i++)
	{
		Point tmp;
		tmp.x = i % TWIDTH;
		tmp.y = i / TWIDTH;
		LUT[i] = tmp;
	}
	char str[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!?. ";
	//int length = strlen(str);
	for (int i = 0; i < MAX_MOJI; i++)
	{
		LUM[str[i]] = LUT[i];
	}
 
 
}
//
//Point GetWordPos(char moji)
//{
//
//
//
//	return(LUT[res]);
//}
 
 
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
	DxInit();
 
	int hWTable = -1; //画像の読み込みが成功すると0より大きいハンドルが返ってくるよ!
	hWTable = LoadGraph("Image\\abc_table_refine.png");
 
	int length = strlen(str); //表示するメッセージの文字数
	//Look UP Table (参照表)を前処理で作っておけたらかっちょいい
	MakeLUT();
 
	while (true)
	{
		ClearDrawScreen();
 
		//ここにやりたい処理を書く
		//char samp[] = "ABC";
		//20x20 @ 1文字
		int TWIDTH = 8;//画像の文字の表の幅(文字数)
		for (int i = 0; i < length; i++)
		{
			//int n = GetWordNum(str[i]);
			//int wx = n % TWIDTH;
			//int wy = n / TWIDTH;
			char moji_ima = str[i];
			DrawRectGraph(10 + MARGIN * i, 10, //表示位置の調整
						  LUM[moji_ima].x*CHAR_W, LUM[moji_ima].y*CHAR_H, CHAR_W, CHAR_H,
				                  hWTable, TRUE); //画像からの切り抜き位置
		}
 
		ScreenFlip();
		WaitTimer(16);
		if (ProcessMessage() == -1)
			break;
		if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
			break;
	}
 
	DxLib_End();
	return 0;
}