/*       RPG製作記5 1999/ 5/17 宍戸 輝光 */ #include #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void none(void); void scroll(void); void wait(void); void drawMap(int,int); void drawState(); void event(int); void message(LPCTSTR); int dialog(LPCTSTR,LPCTSTR); void drawScreen(); void battle(); LPDIRECTDRAW lpDD=NULL; LPDIRECTDRAWSURFACE lpDDSPrimary=NULL,lpDDSBack=NULL,lpDDSMap=NULL,lpDDSState=NULL; LPDIRECTDRAWSURFACE lpDDSScreen=NULL,lpDDSMessage=NULL,lpDDSParts[3],lpDDSChr=NULL; DDSURFACEDESC ddsdpr,ddsdbb,ddsdmap,ddsdsc,ddsdst,ddsdms,ddsdpt[3],ddsdch; DDSCAPS ddscaps; LPDIRECTDRAWPALETTE lpDPalette; char lpszMes[256]; RECT recScreen={0,0,800,600},recChr={0,0,32,32},recMes={0,0,384,192}; RECT recMap={32,32,512,512},recState={0,0,224,400}; int iX,iY,iDx,iDy,iDdx,iDdy,iScd=2,iState,hp=32,hpm=32; BYTE map[64][64]; WORD mInfo[64][64]; DWORD dwTime; HFONT hFontH,hFontB; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass ; PALETTEENTRY pePal[256]; int i,j; LPBYTE lpBuf; hFontH=CreateFont((int)24,0,0,0,FW_MEDIUM, FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE,NULL); hFontB=CreateFont((int)20,0,0,0,FW_NORMAL, FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FIXED_PITCH|FF_DONTCARE,NULL); wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = NULL; wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; wndclass.hIconSm = NULL; RegisterClassEx (&wndclass); HWND hwnd=CreateWindowEx(WS_EX_TOPMOST,"CWindow",NULL, WS_POPUP,0,0,800,600,NULL,NULL,hInstance,NULL); ShowWindow (hwnd,iCmdShow); // ウインドウを表示 UpdateWindow (hwnd); DirectDrawCreate(NULL,&lpDD,NULL); // DirectDrawオブジェクト作成 lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); lpDD->SetDisplayMode(800,600,8); // 画面を640*480/8Bit モードに設定 FillMemory(&ddsdpr,0,sizeof(ddsdpr)); // プライマリサーフェス作成 ddsdpr.dwSize=sizeof(ddsdpr); ddsdpr.dwFlags=DDSD_CAPS| DDSD_BACKBUFFERCOUNT; ddsdpr.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX; ddsdpr.dwBackBufferCount = 1; lpDD->CreateSurface(&ddsdpr,&lpDDSPrimary,NULL); pePal[1].peRed=32; pePal[1].peGreen=0; pePal[1].peBlue=240; pePal[1].peFlags=NULL; pePal[2].peRed=64; pePal[2].peGreen=96; pePal[2].peBlue=255; pePal[2].peFlags=NULL; pePal[3].peRed=64; pePal[3].peGreen=240; pePal[3].peBlue=0; pePal[3].peFlags=NULL; pePal[4].peRed=32; pePal[4].peGreen=192; pePal[4].peBlue=0; pePal[4].peFlags=NULL; pePal[5].peRed=224; pePal[5].peGreen=96; pePal[5].peBlue=64; pePal[5].peFlags=NULL; pePal[6].peRed=160; pePal[6].peGreen=160; pePal[6].peBlue=176; pePal[6].peFlags=NULL; pePal[7].peRed=128; pePal[7].peGreen=144; pePal[7].peBlue=160; pePal[7].peFlags=NULL; pePal[8].peRed=88; pePal[8].peGreen=112; pePal[8].peBlue=72; pePal[8].peFlags=NULL; pePal[254].peRed=128; pePal[254].peGreen=128; pePal[254].peBlue=128; pePal[254].peFlags=NULL; pePal[255].peRed=255; pePal[255].peGreen=255; pePal[255].peBlue=255; pePal[255].peFlags=NULL; lpDD->CreatePalette(DDPCAPS_8BIT,pePal,&lpDPalette,NULL); lpDPalette->SetEntries(0,0,256,pePal); lpDDSPrimary->SetPalette(lpDPalette); // パレット設定 // バックバッファ取得 ddscaps.dwCaps = DDSCAPS_BACKBUFFER; lpDDSPrimary->GetAttachedSurface(&ddscaps,&lpDDSBack); FillMemory(&ddsdmap,sizeof(ddsdmap),0); // マップ用サーフェス作成 ddsdmap.dwSize=sizeof(ddsdmap); ddsdmap.dwFlags=DDSD_CAPS| DDSD_WIDTH| DDSD_HEIGHT; ddsdmap.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN; ddsdmap.dwWidth=544; ddsdmap.dwHeight=544; lpDD->CreateSurface(&ddsdmap,&lpDDSMap,NULL); FillMemory(&ddsdsc,sizeof(ddsdsc),0); // 背景用サーフェス作成 ddsdsc.dwSize=sizeof(ddsdsc); ddsdsc.dwFlags=DDSD_CAPS| DDSD_WIDTH| DDSD_HEIGHT; ddsdsc.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN; ddsdsc.dwWidth=800; ddsdsc.dwHeight=600; lpDD->CreateSurface(&ddsdsc,&lpDDSScreen,NULL); FillMemory(&ddsdst,sizeof(ddsdst),0); // ステータス用サーフェス作成 ddsdst.dwSize=sizeof(ddsdst); ddsdst.dwFlags=DDSD_CAPS| DDSD_WIDTH| DDSD_HEIGHT; ddsdst.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN; ddsdst.dwWidth=224; ddsdst.dwHeight=400; lpDD->CreateSurface(&ddsdst,&lpDDSState,NULL); FillMemory(&ddsdms,sizeof(ddsdms),0); // メッセージ用サーフェス作成 ddsdms.dwSize=sizeof(ddsdms); ddsdms.dwFlags=DDSD_CAPS| DDSD_WIDTH| DDSD_HEIGHT; ddsdms.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN; ddsdms.dwWidth=384; ddsdms.dwHeight=192; lpDD->CreateSurface(&ddsdms,&lpDDSMessage,NULL); for (i=0;i<3;i++) { // マップパーツ用サーフェス作成 FillMemory(&ddsdpt[i],0,sizeof(ddsdpt[i])); ddsdpt[i].dwSize=sizeof(ddsdpt[i]); ddsdpt[i].dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT; ddsdpt[i].ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN; ddsdpt[i].dwWidth=32; ddsdpt[i].dwHeight=32; lpDD->CreateSurface(&ddsdpt[i],&lpDDSParts[i],NULL); } FillMemory(&ddsdch,sizeof(ddsdch),0); // 主人公用サーフェス作成 ddsdch.dwSize=sizeof(ddsdch); ddsdch.dwFlags=DDSD_CAPS| DDSD_WIDTH| DDSD_HEIGHT; ddsdch.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN; ddsdch.dwWidth=32; ddsdch.dwHeight=32; lpDD->CreateSurface(&ddsdch,&lpDDSChr,NULL); DDCOLORKEY ddck; // 主人公サーフェスに透過色設定 ddck.dwColorSpaceLowValue=0; ddck.dwColorSpaceHighValue=0; lpDDSChr->SetColorKey(DDCKEY_SRCBLT,&ddck); srand((unsigned)time(NULL)); /* 背景サーフェス作成 */ lpDDSScreen->Lock(NULL,&ddsdsc,DDLOCK_WAIT,NULL); lpBuf=(BYTE*)ddsdsc.lpSurface; FillMemory(lpBuf,800*600,8); for (i=56;i<600;i++) FillMemory(lpBuf+i*800,544,7); lpDDSScreen->Unlock(NULL); lpDDSParts[0]->Lock(NULL,&ddsdpt[0],DDLOCK_WAIT,NULL); lpBuf=(BYTE*)ddsdpt[0].lpSurface; FillMemory(lpBuf,32*32,1); for (i=0;i<64;i++) lpBuf[rand() % 32+(rand() % 32)*32]=2; lpDDSParts[0]->Unlock(NULL); lpDDSParts[1]->Lock(NULL,&ddsdpt[1],DDLOCK_WAIT,NULL); lpBuf=(BYTE*)ddsdpt[1].lpSurface; // オフスクリーンサーフェスのポインタ FillMemory(lpBuf,32*32,3); for (i=0;i<64;i++) lpBuf[rand() % 32+(rand() % 32)*32]=4; lpDDSParts[1]->Unlock(NULL); lpDDSParts[2]->Lock(NULL,&ddsdpt[2],DDLOCK_WAIT,NULL); lpBuf=(BYTE*)ddsdpt[2].lpSurface; // オフスクリーンサーフェスのポインタ FillMemory(lpBuf,32*32,3); for (i=0;i<64;i++) lpBuf[rand() % 32+(rand() % 32)*32]=4; for (i=2;i<10;i++) FillMemory(lpBuf+12+i*32,8,5); for (i=10;i<24;i++) FillMemory(lpBuf+10+i*32,12,8); lpDDSParts[2]->Unlock(NULL); lpDDSChr->Lock(NULL,&ddsdch,DDLOCK_WAIT,NULL); lpBuf=(BYTE*)ddsdch.lpSurface; // オフスクリーンサーフェスのポインタ FillMemory(lpBuf,32*32,0); for (i=2;i<10;i++) FillMemory(lpBuf+12+i*32,8,5); for (i=10;i<24;i++) FillMemory(lpBuf+10+i*32,12,6); lpDDSChr->Unlock(NULL); // マップと属性配列作成 for (i=0;i<64;i++) for (j=0;j<64;j++) if (i<8 || j<8 || j>55||i>55) { map[j][i]=0; mInfo[j][i]=0x0000; } else { if (rand() % 16==0) { map[j][i]=0; mInfo[j][i]=0x0000; } else { map[j][i]=1; mInfo[j][i]=0x8000; } } map[32][32]=1; mInfo[32][32]=0x8000; map[32][31]=1; mInfo[32][31]=0x8000; map[32][30]=2; mInfo[32][30]=0x0001; map[34][25]=2; mInfo[34][25]=0x0002; iX=32; iY=32; iDx=0; iDy=0; iDdx=0; iDdy=0; iState=0; drawMap(iX,iY); drawState(); lpDDSBack->BltFast(0,0,lpDDSScreen,&recScreen,DDBLTFAST_NOCOLORKEY); dwTime=GetTickCount(); while (1) { /* メインループ */ if (PeekMessage (&msg,NULL,0,0,PM_NOREMOVE)) { if (!GetMessage (&msg,NULL,0,0)) // メッセージ処理 return msg.wParam ; TranslateMessage(&msg); DispatchMessage(&msg); } else none(); } } void scroll(void) { // スクロール処理 RECT recSc; while(iDx!=iScd && iDy!=iScd && iDx!=64-iScd && iDy!=64-iScd) { if (GetTickCount()>dwTime+5) { dwTime=GetTickCount(); RECT rec; iDx+=iDdx; iDy+=iDdy; rec.left=iDx; rec.top=iDy; rec.right=iDx+480; rec.bottom=iDy+480; // バックバッファにマップをずらしながら描画 lpDDSBack->BltFast(32,88,lpDDSMap,&rec,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファに主人公を描画(透過処理) lpDDSBack->BltFast(224+32,224+88,lpDDSChr,&recChr,DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT); // バックバッファをフリップ lpDDSPrimary->Flip(NULL,DDFLIP_WAIT); } } //スクロール終了後、表示中央とマップ中央を合わせる if (iDdy<0) { // 上スクロール時 recSc.left=32; recSc.top=0; } else if (iDdx>0) { // 右スクロール時 recSc.left=64; recSc.top=32; } else if (iDdy>0) { // 下スクロール時 recSc.left=32; recSc.top=64; } else if (iDdx<0) { // 左スクロール時 recSc.left=0; recSc.top=32; } recSc.right=recSc.left+480; recSc.bottom=recSc.top+480; // マップ中央に描きなおす lpDDSMap->BltFast(32,32,lpDDSMap,&recSc,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファにマップを描画 lpDDSBack->BltFast(32,88,lpDDSMap,&recMap,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファに主人公を描画(透過処理) lpDDSBack->BltFast(224+32,224+88,lpDDSChr,&recChr,DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT); // バックバッファをフリップ lpDDSPrimary->Flip(NULL,DDFLIP_WAIT); if (rand() % 16==0) // 1/16の確率で戦闘発生 battle(); } void none(void) { // 通常時 int kX,kY,i; iDx=32; iDy=32; iDdy=0; iDdy=0; kX=0; kY=0; // カーソルキーで移動 if (GetAsyncKeyState(VK_UP)<0) { kY=-1; if(mInfo[iX][iY-1]>32767) { for (i=1;i<16;i++) lpDDSMap->BltFast(i*32,0,lpDDSParts[map[i+iX-8][iY-8]], &recChr,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); iY--; // 主人公の位置更新 iDdx=0; // スクロール方向設定 iDdy=-iScd; kY=0; scroll(); } } else if (GetAsyncKeyState(VK_RIGHT)<0) { kX=1; if(mInfo[iX+1][iY]>32767) { for (i=1;i<16;i++) lpDDSMap->BltFast(512,i*32,lpDDSParts[map[iX+8][iY+i-8]], &recChr,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); iX++; iDdx=iScd; iDdy=0; kX=0; scroll(); } } else if (GetAsyncKeyState(VK_DOWN)<0) { kY=1; if(mInfo[iX][iY+1]>32767) { for (i=1;i<16;i++) lpDDSMap->BltFast(i*32,512,lpDDSParts[map[iX+i-8][iY+8]], &recChr,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); iY++; iDdx=0; iDdy=iScd; kY=0; scroll(); } } else if (GetAsyncKeyState(VK_LEFT)<0) { kX=-1; if(mInfo[iX-1][iY]>32767) { for (i=1;i<16;i++) lpDDSMap->BltFast(0,i*32,lpDDSParts[map[iX-8][iY+i-8]], &recChr,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); iX--; iDdx=-iScd; iDdy=0; kX=0; scroll(); } } // イベント判定 if ((mInfo[iX+kX][iY+kY] & 0xff)!=0) event(mInfo[iX+kX][iY+kY] & 0xff); } void drawMap(int x,int y) { RECT rec={32,32,512,512}; int i,j; for (i=1;i<16;i++) for (j=1;j<16;j++) lpDDSMap->BltFast(j*32,i*32,lpDDSParts[map[j+x-8][i+y-8]], &recChr,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファに背景を描画 lpDDSBack->BltFast(0,0,lpDDSScreen,&recScreen,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファにマップを描画 lpDDSBack->BltFast(32,88,lpDDSMap,&rec,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファに主人公を描画(透過処理) lpDDSBack->BltFast(224+32,224+88,lpDDSChr,&recChr,DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT); // バックバッファをフリップ lpDDSPrimary->Flip(NULL,DDFLIP_WAIT); } void drawState() { // ステータス表示 HDC hdc; char str[32]; RECT rec={0,0,224,400}; RECT rec2={4,4,220,396}; lpDDSState->GetDC(&hdc); // サーフェスに枠描画 FillRect(hdc,&rec,GetStockObject(WHITE_BRUSH)); FillRect(hdc,&rec2,GetStockObject(BLACK_BRUSH)); // 表示用フォント・領域設定 SelectObject(hdc,hFontH); SelectObject(hdc,hFontH); RECT recText={8,8,216,40}; SetTextColor(hdc,0x00ffffff); SetBkMode(hdc,TRANSPARENT); // 体力表示 wsprintf(str,"体力 %3d / %3d",hp,hpm); DrawText(hdc,str,-1,&recText,DT_CENTER|DT_VCENTER|DT_SINGLELINE); lpDDSState->ReleaseDC(hdc); // 現在のプライマリサーフェスをバックバッファにコピー lpDDSBack->BltFast(0,0,lpDDSPrimary,&recScreen,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファにステータスウインドウを上書き lpDDSBack->BltFast(560,56,lpDDSState,&recState,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファをフリップ lpDDSPrimary->Flip(NULL,DDFLIP_WAIT); // 背景に更新したステータスウインドウを上書き lpDDSScreen->BltFast(560,56,lpDDSState,&recState,DDBLTFAST_NOCOLORKEY); } void event(int e) { switch (e) { case 1: message("人物1\n選択してください"); if (dialog("選択肢1","選択肢2")==1) message("選択肢1を選択"); else message("選択肢2を選択"); wait(); break; case 2: message("人物2"); wait(); // 入力待ち break; } iState=0; drawScreen(); } void message(LPCTSTR str) { // メッセージ表示 HDC hdc; iState=1; // バックバッファに背景を描画 lpDDSBack->BltFast(0,0,lpDDSPrimary,&recScreen,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // メッセージウインドウサーフェスのデバイスコンテキスト取得 lpDDSMessage->GetDC(&hdc); RECT rec={0,0,384,192};//48+32,272+88,48+32+384,272+88+192}; FillRect(hdc,&rec,GetStockObject(WHITE_BRUSH)); RECT rec2={2,2,382,190}; FillRect(hdc,&rec2,GetStockObject(BLACK_BRUSH)); RECT recText={8,8,376,184}; // メッセージ描画 SelectObject(hdc,hFontB); SetTextColor(hdc,0x00ffffff); SetBkMode(hdc,TRANSPARENT); DrawText(hdc,str,-1,&recText,DT_LEFT|DT_WORDBREAK); lpDDSMessage->ReleaseDC(hdc); lpDDSBack->BltFast(80,360,lpDDSMessage,&recMes,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファをフリップ lpDDSPrimary->Flip(NULL,DDFLIP_WAIT); lstrcpy(lpszMes,str); } int dialog(LPCTSTR menu1,LPCTSTR menu2) { HDC hdc; RECT recDlg={160+32,160+88,160+32+160,160+88+80}; RECT recDcl={162+32,162+88,160+32+158,160+88+78}; RECT recTxt1={168+32,168+88,160+32+152,160+88+32}; RECT recTxt2={168+32,168+88+40,160+32+152,160+88+72}; MSG msg; int iMenu=1; while (GetAsyncKeyState(VK_DOWN)<0); while ((GetAsyncKeyState(VK_RETURN)<0)); while ((GetAsyncKeyState(VK_RETURN)>=0)) { // リターンキーでループ脱出 if (PeekMessage (&msg,NULL,0,0,PM_NOREMOVE)) { if (!GetMessage (&msg,NULL,0,0)) // メッセージ処理 return 0; TranslateMessage(&msg); DispatchMessage(&msg); } if (GetAsyncKeyState(VK_UP)<0) // 選択カーソル移動 iMenu=1; else if (GetAsyncKeyState(VK_DOWN)<0) iMenu=2; // バックバッファに背景を描画 lpDDSBack->BltFast(0,0,lpDDSPrimary,&recScreen,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // メッセージウインドウサーフェスのデバイスコンテキスト取得 lpDDSBack->GetDC(&hdc); FillRect(hdc,&recDlg,GetStockObject(WHITE_BRUSH)); FillRect(hdc,&recDcl,GetStockObject(BLACK_BRUSH)); if (iMenu==1) // 選択されたメニューの背景を灰色に FillRect(hdc,&recTxt1,GetStockObject(GRAY_BRUSH)); else FillRect(hdc,&recTxt2,GetStockObject(GRAY_BRUSH)); // メッセージ描画 SetTextColor(hdc,0x00ffffff); SetBkMode(hdc,TRANSPARENT); DrawText(hdc,menu1,-1,&recTxt1,DT_LEFT|DT_VCENTER|DT_SINGLELINE); DrawText(hdc,menu2,-1,&recTxt2,DT_LEFT|DT_VCENTER|DT_SINGLELINE); lpDDSBack->ReleaseDC(hdc); // バックバッファをフリップ lpDDSPrimary->Flip(NULL,DDFLIP_WAIT); } // リターンキーが離されるまで待つ while ((GetAsyncKeyState(VK_RETURN)<0)); iState=0; drawScreen(); return iMenu; } void drawScreen() { drawMap(iX,iY); // バックバッファに背景を描画 lpDDSBack->BltFast(0,0,lpDDSScreen,&recScreen,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファにマップを描画 lpDDSBack->BltFast(32,88,lpDDSMap,&recMap,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT); // バックバッファに主人公を描画(透過処理) lpDDSBack->BltFast(224+32,224+88,lpDDSChr,&recChr,DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT); // バックバッファをフリップ lpDDSPrimary->Flip(NULL,DDFLIP_WAIT); if (iState & 0x01!=0) message(lpszMes); drawState(); } void wait(void) { // 入力待ち MSG msg; while ((GetAsyncKeyState(VK_RETURN)>=0)) { /* メインループ */ if (PeekMessage (&msg,NULL,0,0,PM_NOREMOVE)) { if (!GetMessage (&msg,NULL,0,0)) // メッセージ処理 return; TranslateMessage(&msg); DispatchMessage(&msg); } } } void battle() { // 戦闘処理 int a,b,mhp=6; char msg[80],wrk[32]; message("敵に遭遇!"); wait(); message("どうしますか?"); while (dialog("闘う","逃げる")==1) { a=rand() % 4; // ダメージを乱数で決定 mhp-=a; // 主人公の攻撃メッセージ lstrcpy(msg,"主人公の攻撃!\n\n"); wsprintf(wrk,"敵に%dのダメージ!\n\n",a); lstrcat(msg,wrk); if (mhp<=0) { // 敵を倒したらループ脱出 message(msg); wait(); break; } b=rand() % 3; hp-=b; // 敵の攻撃メッセージ lstrcat(msg,"敵の攻撃!\n\n"); wsprintf(wrk,"主人公は%dのダメージ!",b); lstrcat(msg,wrk); drawState(); // 主人公のステータス表示 message(msg); wait(); message("どうしますか?"); } if (mhp<=0) // 戦闘結果表示 message("敵を倒しました。"); else message("逃げました。"); Sleep(100); wait(); // 通常状態に復帰 iState=0; drawScreen(); } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { int i; switch (iMsg) { case WM_KEYDOWN: if (wParam==VK_ESCAPE && iState==0) // エスケープキーが押されたら終了 PostMessage(hwnd,WM_CLOSE,0,0); break; case WM_DESTROY : // 終了処理 lpDD->RestoreDisplayMode(); // 画面モードを元に戻す for (i=0;i<2;i++) if (lpDDSParts[i]) // パーツ用サーフェス解放 lpDDSParts[i]->Release(); if (lpDDSChr) // 主人公用サーフェス解放 lpDDSChr->Release(); if (lpDDSMap) // マップ用サーフェス解放 lpDDSMap->Release(); if (lpDDSMessage) // メッセージ表示用サーフェス解放 lpDDSMessage->Release(); if (lpDDSState) // ステータス表示用サーフェス解放 lpDDSState->Release(); if (lpDDSScreen) // 背景用サーフェス解放 lpDDSScreen->Release(); if (lpDDSBack) // バックバッファ解放 lpDDSBack->Release(); if (lpDDSPrimary) // プライマリサーフェス解放 lpDDSPrimary->Release(); if (lpDD) // DirectDrawオブジェクト解放 lpDD->Release(); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }