#12
by かずま » 5年前
70回も LoadImage を実行するから時間がかかってちらつくのではありませんか?
次のようにすればよいのでは?
コード:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
static HBITMAP hbmGrass, hbmWall, hbmHero;
static int maptable[7][10] = {
{ 1,1,1,1,1,1,1,1,1,1 }, //0
{ 1,0,0,0,0,0,0,0,0,1 }, //1
{ 1,0,0,0,0,0,0,0,0,1 }, //2
{ 1,0,0,0,0,0,0,0,0,1 }, //3
{ 1,0,0,0,0,0,0,0,0,1 }, //4
{ 1,0,0,0,0,0,0,0,0,1 }, //5
{ 1,1,1,1,1,1,1,1,1,1 } //6
};
int saisyo_x = 0, saisyo_y = 0, chx = 0, chy = 0;
PAINTSTRUCT ps;
HDC hdc, hmdc;
switch (msg) {
case WM_CREATE:
hbmGrass = (HBITMAP)LoadImage(NULL, "mapchip_grass.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
hbmWall = (HBITMAP)LoadImage(NULL, "mapchip_wall.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
hbmHero = (HBITMAP)LoadImage(NULL, "hero_dot.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
break;
case WM_DESTROY:
DeleteObject(hbmGrass);
DeleteObject(hbmWall);
DeleteObject(hbmHero);
PostQuitMessage(0);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
hmdc = CreateCompatibleDC(hdc);
for (int x = 0; x < 10; ++x)
for (int y = 0; y < 7; ++y) {
SelectObject(hmdc, maptable[y][x] ? hbmWall : hbmGrass);
BitBlt(hdc, 225 + x * 32, 140 + y * 32, 32, 32, hmdc, 0, 0, SRCCOPY);
}
SelectObject(hmdc, hbmHero);
BitBlt(hdc, 320 + (chx - saisyo_x) * 32,
270 + (chy - saisyo_y) * 32, 170, 180, hmdc, 0, 0, SRCCOPY);
DeleteDC(hmdc);
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, msg, wp, lp);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE p, LPSTR s, int nCmdShow)
{
WNDCLASS wc = { CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInst, NULL,
LoadCursor(NULL, IDC_ARROW), (HBRUSH)GetStockObject(WHITE_BRUSH),
NULL, "hoge" };
if (!RegisterClass(&wc)) return 0;
HWND hWnd = CreateWindow("hoge", "RPG", WS_OVERLAPPEDWINDOW,
80, 60, 640, 480, NULL, NULL, hInst, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
70回も LoadImage を実行するから時間がかかってちらつくのではありませんか?
次のようにすればよいのでは?
[code]
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
static HBITMAP hbmGrass, hbmWall, hbmHero;
static int maptable[7][10] = {
{ 1,1,1,1,1,1,1,1,1,1 }, //0
{ 1,0,0,0,0,0,0,0,0,1 }, //1
{ 1,0,0,0,0,0,0,0,0,1 }, //2
{ 1,0,0,0,0,0,0,0,0,1 }, //3
{ 1,0,0,0,0,0,0,0,0,1 }, //4
{ 1,0,0,0,0,0,0,0,0,1 }, //5
{ 1,1,1,1,1,1,1,1,1,1 } //6
};
int saisyo_x = 0, saisyo_y = 0, chx = 0, chy = 0;
PAINTSTRUCT ps;
HDC hdc, hmdc;
switch (msg) {
case WM_CREATE:
hbmGrass = (HBITMAP)LoadImage(NULL, "mapchip_grass.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
hbmWall = (HBITMAP)LoadImage(NULL, "mapchip_wall.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
hbmHero = (HBITMAP)LoadImage(NULL, "hero_dot.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
break;
case WM_DESTROY:
DeleteObject(hbmGrass);
DeleteObject(hbmWall);
DeleteObject(hbmHero);
PostQuitMessage(0);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
hmdc = CreateCompatibleDC(hdc);
for (int x = 0; x < 10; ++x)
for (int y = 0; y < 7; ++y) {
SelectObject(hmdc, maptable[y][x] ? hbmWall : hbmGrass);
BitBlt(hdc, 225 + x * 32, 140 + y * 32, 32, 32, hmdc, 0, 0, SRCCOPY);
}
SelectObject(hmdc, hbmHero);
BitBlt(hdc, 320 + (chx - saisyo_x) * 32,
270 + (chy - saisyo_y) * 32, 170, 180, hmdc, 0, 0, SRCCOPY);
DeleteDC(hmdc);
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, msg, wp, lp);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE p, LPSTR s, int nCmdShow)
{
WNDCLASS wc = { CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInst, NULL,
LoadCursor(NULL, IDC_ARROW), (HBRUSH)GetStockObject(WHITE_BRUSH),
NULL, "hoge" };
if (!RegisterClass(&wc)) return 0;
HWND hWnd = CreateWindow("hoge", "RPG", WS_OVERLAPPEDWINDOW,
80, 60, 640, 480, NULL, NULL, hInst, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
[/code]