猫でもわかるゲームプログラミング第1版に関する問題

このQ&Aのポイント
  • 猫でもわかるゲームプログラミング第1版を見て勉強しているプログラミング初心者は、本に問題があると感じています。
  • 問い合わせメールを送っても返事がなく、質問フォーラムにも投稿しましたが解決できていません。
  • 特に、polypolyline01というプログラムで図形が正しく表示されず、数式の間違いが疑われます。
回答を見る
  • ベストアンサー

猫でもわかるゲームプログラミング3章

猫でもわかるゲームプログラミング第1版を見て勉強しているプログラミング初心者です。 本に問題ありな気がします。作者にも出版社にも問い合わせメール書きましたが返事ないです。 以前の質問 setpixel01: http://okwave.jp/qa/q6349241.html polyline01: http://okwave.jp/qa/q6362229.html だったのですが、polyline01の方ではプログラム通りの多重四角が表示されたんですが、(あ、うっかりしてました。自分がコード少し間違っていて質問してしまったようでした;;)本の実行結果より図形のウィンドウがはみ出してしまっていてすっきりしない終わり方でした。 今回の問題はpolypolyline01という六芒星をウィンドウいっぱいに沢山表示するプログラムなんですが、setpixel01と同じく math.hを宣言してpow関数を使います。使うのは2とかまた簡単な数字だったんですがビルドできないので少数第一位まで表記してコンパイルしたんです。そしたら実行結果の六芒星がおかしな形で一列に表示されてしまいました。 //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id, i, j, l = 40; HDC hdc; PAINTSTRUCT ps; RECT rc; switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rc); for (i = 0; i * 60 <= rc.right; i++) { for(j = 0;j * 60 <= rc.bottom; j++){ MyDraw(hdc, 60 * i, 60 + j, l); } } EndPaint(hWnd, &ps); break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよろしいですか", "終了確認", MB_YESNO); if (id == IDYES) DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } BOOL MyDraw(HDC hdc, int x, int y, int l) { POINT pt[8]; DWORD dwPoints[2] = {4, 4}, dwCount = 2; int h; h = (int)sqrt(pow(l,2.0) - pow(l / 2.0, 2.0)); pt[0].x = x; pt[0].y = y; pt[1].x = l / 2 + x; pt[1].y = h + y; pt[2].x = l + pt[0].x; pt[2].y = pt[0].y; pt[3].x = pt[0].x; pt[3].y = pt[0].y; pt[4].x = pt[0].x; pt[4].y = pt[0].y + h * 2 / 3; pt[5].x = l + pt[0].x; pt[5].y = pt[4].y; pt[6].x = l / 2 + pt[0].x; pt[6].y = y- h / 3; pt[7].x = pt[4].x; pt[7].y = pt[4].y; PolyPolyline(hdc, pt, dwPoints, dwCount); return TRUE; } なんですけど・・・ どこか数式が間違ってるんでしょうか?自分で見直す感じ見つけられません。 猫でもわかる~のソースコードがDLできるってことでしたが、ゲームプログラミングはDLできないようです。。 あとちなみにこのプログラム(polypolyline01.cpp)のCD-ROMから読んだサンプルファイルは、文字化けてました。 お分かりになる方、教えてください!

質問者が選んだベストアンサー

  • ベストアンサー
noname#137556
noname#137556
回答No.1

表示結果から y 座標がおかしいのは容易に察しが付きますよね。 MyDraw(hdc, 60 * i, 60 + j, l); ↓ 猫でもわかる~のソースコード http://homepage2.nifty.com/c_lang/dl/

REINBOW01
質問者

お礼

*と+を間違えてましたか…orz ご指摘どうもありがとうございます。 猫でもわかると言う割に書いてあること全然わからなくて、 サンプルコード余り考えず打ってコンパイルを繰り返してるような頭足りない私です^^; すみません…専門の時もそんな感じです。 ソースコードもあったんですか!探し方足らなかったんですね… 頭が下がるばかりです。 今度からはもっとじっくりデバックしてから質問します。っていうか二回連続自分のミスだったので、基本的に自分に問題があるんだと考えなきゃ駄目ですね、プログラマーの道は険しいです。というか年齢的になるのは無理だと思いますがね^^;

関連するQ&A

  • wsprintf( ) でポインタに代入

    wsprintf(p, "%d" , i); を書いたせいで、i の値が変わります。 wsprintf(p, "%d" , i); によってどんなことが起こっているのか詳しく知りたいです。 ポインタのことがまだよく分かってないんです。 #include <windows.h> LPCSTR szStr = "\n char c[255];\n char *p = \"\\0\";\n int i = 12345;\n\n switch (msg){\n case WM_LBUTTONDOWN:\n  wsprintf(c, \"%d\" , i);\n  wsprintf(p, \"%d\" , i);\n  MessageBox(hWnd , c , \"\" , MB_OK);\n break;"; LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM); int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE , LPSTR , int){ 省略 return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){ HDC hDC; PAINTSTRUCT ps; RECT rt; char c[255]; char *p = "\0"; int i = 12345; switch (msg){ case WM_LBUTTONDOWN: wsprintf(c, "%d" , i); wsprintf(p, "%d" , i); MessageBox(hWnd , c , "" , MB_OK); break; case WM_PAINT: GetClientRect(hWnd, &rt); hDC = BeginPaint(hWnd, &ps); DrawText(hDC, szStr, lstrlen(szStr), &rt, DT_WORDBREAK); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd , msg , wParam , lParam)); } return (0L); }

  • 猫でもわかるWindowsプログラミングの5.2タイピングソフトのプログラムについて

    猫でもわかるWindowsプログラミング第3版の5.2タイピングソフトのプログラムなのですが、 本のプログラムをそのまま書くと、タイプミス!の分岐にはいらないんですが、これは本が間違ってるんでしょうか? 付属のCD-ROMのプログラム(本の方とは少し違う)は正しく動いているようですが、 本に書いてある方がなぜ上手くいかないのかが理解できません。 もし本が間違えているなら、どこが間違っているのか教えていただけると助かります。 下のコードは本に書いてあった方のウィンドウプロージャ部を写したものです。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc; PAINTSTRUCT ps; MMTIME mm; switch (msg) { case WM_CREATE: srand((unsigned)time(NULL)); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 0, 0, szMondai, lstrlen(szMondai)); TextOut(hdc, 0, 40, szInput, lstrlen(szInput)); if(bSeikai) SetTextColor(hdc, RGB(0,0,0)); else SetTextColor(hdc, RGB(255,0,0)); TextOut(hdc,0,80,szCheck,lstrlen(szCheck)); EndPaint(hWnd, &ps); break; case WM_CHAR: if(wp == VK_SPACE && !bStart) { bStart = TRUE; TypeStart(hWnd); break; } if(bStart == FALSE) return DefWindowProc(hWnd, msg, wp, lp); if(wp == VK_ESCAPE) { lstrcpy(szMondai, TEXT("")); lstrcpy(szInput, TEXT("")); lstrcpy(szCheck, TEXT("")); InvalidateRect(hWnd, NULL, TRUE); bStart = FALSE; break; } wsprintf(szInput, TEXT("あなたの入力=\"%c\""), (int)wp); if(szMondai[6] == szInput[14]) { bSeikai = TRUE; mm.wType = TIME_MS; timeGetSystemTime(&mm, sizeof(MMTIME)); dwEnd = mm.u.ms; wsprintf(szCheck, TEXT("反応時間[%dミリ秒]"), dwEnd - dwStart); TypeStart(hWnd); } else { bSeikai = FALSE; MessageBeep(MB_OK); lstrcpy(szCheck, TEXT("タイプミス!")); } InvalidateRect(hWnd, NULL, TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp,lp)); } return 0; } int TypeStart(HWND hWnd) { int n; MMTIME mm; n = rand() % 26; wsprintf(szMondai, TEXT("問題=\"%c\""), 'a' + n); mm.wType = TIME_MS; timeGetSystemTime(&mm, sizeof(MMTIME)); dwStart = mm.u.ms; InvalidateRect(hWnd, NULL, TRUE); return 0; }

  • フォントの指定 猫でもわかるwindowsプログラミングより

    猫でもわかるwindowsプログラミングの本で勉強している学生なんですが、第2章の2.4フォントの指定のところでプログラムを打ち込んでコンパイルしたのですがなぜか識別子が見つかりませんというエラーがでてコンパイルできません。どなたかわかる方お願いします。 一応プログラム(CALLBACK関数と論理フォント作成の関数のみ)↓ //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ static HFONT hFont1, hFont2, hFont3; PAINTSTRUCT ps; HDC hdc; char *szName1 = "○○"; char *szName2 = "▲▲"; switch (msg) { case WM_CREATE: hFont1 = MyCreateFont(40, SHIFTJIS_CHARSET, "HG行書体"); hFont2 = MyCreateFont(40, ANSI_CHARSET, "Fraktur JS"); hFont3 = MyCreateFont(40, SHIFTJIS_CHARSET, "MS 明朝"); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SelectObject(hdc, hFont1); TextOut(hdc, 0, 0, (LPCTSTR)szName1, (int)strlen(szName1)); SelectObject(hdc, hFont2); TextOut(hdc, 0, 60, (LPCTSTR)szName2, (int)strlen(szName2)); SelectObject(hdc, hFont3); TextOut(hdc, 0, 120, (LPCTSTR)szName1, (int)strlen(szName1)); EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteObject(hFont1); DeleteObject(hFont2); DeleteObject(hFont3); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //論理フォントの作成 HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName){ return(CreateFont(nHeight, 0, 0, 0, FW_DONTCARE. FALSE, FALSE, FALSE, dwCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, lpName)); } エラー内容↓ MyCreateFontの識別子が見つかりません。 論理フォントの関数のFALSEの値が構文エラーで参照できない。

  • なぜCreateHatchBushの設定が途中で喪失するのか

    いつもお世話になります。 縦縞の四角形を表示するプログラムですが、ある一定の四角形を描画すると四角形の中の縦縞がなくなり、白色になります。 原因が分かりません。アドバイスをお願い致します。 (四角形をマウスドラッグ中に小さくすると黒い線がたくさんでてきますが、これはアプリケーションの仕様です) プロシージャソースは以下の通り。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hDC; PAINTSTRUCT ps; static POINT start, end; static bool push; switch(msg) { case WM_CREATE: push = false; break; case WM_LBUTTONDOWN: start.x = LOWORD(lParam); start.y = HIWORD(lParam); push = true; break; case WM_MOUSEMOVE: if(push){ end.x = LOWORD(lParam); end.y = HIWORD(lParam); InvalidateRect(hWnd, NULL, FALSE); } break; case WM_LBUTTONUP: end.x = LOWORD(lParam); end.y = HIWORD(lParam); push = false; InvalidateRect(hWnd, NULL, FALSE); break; case WM_PAINT: HBRUSH hBrush; hDC = BeginPaint(hWnd, &ps); hBrush = CreateHatchBrush(HS_VERTICAL, RGB(255, 0, 0)); SelectObject(hDC, hBrush); Rectangle(hDC, start.x, start.y, end.x, end.y); DeleteObject(hBrush); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, msg, wParam, lParam); } よろしくお願い致します。

  • C言語で画面がおかしくなる

    最近C言語でプログラムを書き始めました。 二次関数を作るスクリプトなんですが、一定時間がたつと画面がおかしくなります。 どこが問題なのか探しても見つからないので、わかる方教えてください。 WinMainの部分は省いてます #include<windows.h> #include<stdio.h> #include <stdlib.h> #include<time.h> #define TIMER_ID 1 #define spy(num) (wy-num) int rnd(int r); void bset(HDC hdc, int x, int y); LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { HDC hDC; static int DesktopX ,DesktopY; static HDC hdc; static HDC Mhdc; static HBITMAP BMPhdc; PAINTSTRUCT paint; RECT Rect; LOGPEN lopnPen; POINT CursorP, ScreenP; char str[250]; int i; static int wx, wy ,ky; static double a ,b ,c ,x ,y ,n ,m ,s ,t; switch (msg) { case WM_DESTROY: DeleteObject( BMPhdc ); DeleteDC( Mhdc ); PostQuitMessage(0); return 0; case WM_CREATE: SetTimer(hwnd, TIMER_ID, 10, NULL); hDC = GetDC(hwnd); hdc = CreateCompatibleDC( hDC ); GetClientRect(GetDesktopWindow() ,&Rect); DesktopX = Rect.right ;DesktopY = Rect.bottom; BMPhdc = CreateCompatibleBitmap( hDC, DesktopX, DesktopY ); SelectObject( hdc, BMPhdc ); ReleaseDC( hwnd, hDC ); GetClientRect(hwnd, &Rect); wx = Rect.right ;wy = Rect.bottom; x = rnd(wx); y = rnd(wy); n = rnd(wx); m = rnd(wy); return 0; case WM_TIMER: ScreenP.x = LOWORD(lp); ScreenP.y = HIWORD(lp); GetClientRect(hwnd, &Rect); wx = Rect.right ;wy = Rect.bottom; if( ky == 1 ){ x = rnd(wx); y = rnd(wy); n = rnd(wx); m = rnd(wy); } ClientToScreen(hwnd ,&ScreenP); GetCursorPos(&CursorP); s = CursorP.x-ScreenP.x; t = wy-(CursorP.y-ScreenP.y); InvalidateRect(hwnd, NULL, FALSE); return 0; case WM_RBUTTONDOWN: ky = 1; return 0; case WM_RBUTTONUP: ky = 0; return 0; case WM_PAINT: Mhdc = BeginPaint(hwnd, &paint); SelectObject(hdc , CreateSolidBrush(RGB(255,255,255))); lopnPen.lopnStyle = PS_NULL; SelectObject(hdc , CreatePenIndirect(&lopnPen)); Rectangle(hdc , 0 , 0 , wx+1 , wy+1); SelectObject(hdc , CreateSolidBrush(RGB(255,0,0))); if ((s-n) != 0 && (n-x) != 0 && (s-x) != 0){ a = ((t-m)/(s-n) - (m-y)/(n-x)) / (s-x); b = (m-y)/(n-x) - a*(n+x); c = y - a*x*x -b*x; } bset(hdc, x,spy(y)); bset(hdc, n,spy(m)); bset(hdc, s,spy(t)); lopnPen.lopnStyle = PS_SOLID; lopnPen.lopnColor = RGB(0,0,255); SelectObject(hdc , CreatePenIndirect(&lopnPen)); MoveToEx(hdc , -1 , spy( a + b - c) , NULL); for(i = 0 ; i <= wx ;i++){ LineTo(hdc , i , spy( a*i*i - b*i - c)); } BitBlt(Mhdc, 0, 0, DesktopX, DesktopY, hdc, 0, 0, SRCCOPY ); EndPaint(hwnd, &paint); return 0; } return DefWindowProc(hwnd , msg , wp , lp); } int rnd(int r){ static int flag; if (flag == 0) { srand((unsigned int)time(NULL)); flag = 1; } return (int)(rand()*(r+1.0)/(1.0+RAND_MAX)); } void bset(HDC hdc, int x, int y){ static LOGPEN lopnPen; lopnPen.lopnStyle = PS_NULL; SelectObject(hdc , CreatePenIndirect(&lopnPen)); Rectangle(hdc , x-3 , y-3 , x+3 , y+3); return; }

  • C言語・Windows RECTが渡せない

    C言語のWindowsプログラムで、左クリック後に四角形の描画をしたいのですがうまくいきません。 WM_LBUTTONDOWNイベントで定義したRECT構造体を、別の関数に渡しRectangleで描画したいのですが、その関数内でRECTの値を調べるととんでもない値になっています。 何度やってもどうして値がおかしくなるのかわかりません。 WM_LBUTTONDOWNもWM_PAINTも正常に反応していると思います。 どうか知恵をお貸しくださいm(_ _)m 以下ソースコードのメッセージ処理部分です。 ウィンドウ生成のひな型はサイトの物を丸写しし、正常に動作することを確認しています。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rcPos; switch (msg){ case WM_LBUTTONDOWN: rcPos.top =0; rcPos.left =0; rcPos.bottom =100; rcPos.right =100; InvalidateRect(hWnd, &rcPos, FALSE); break; //ウィンドウの描画 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); DrawGr(hWnd, hdc, &rcPos); EndPaint(hWnd, &ps); break; //ウィンドウの削除 case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } //描画 int DrawGr(HWND hWnd, HDC hdc, RECT *rcPos) { int i; HBRUSH hBrush, hOldBrush; char *str_org = "rc.top=%d rc.left=%d rc.bottom=%d rc.right=%d"; char strx[256]; //四角形 hBrush = CreateSolidBrush(RGB(100, 100, 255)); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); //デバッグ用 wsprintf((LPSTR)strx, (LPCSTR)str_org, rcPos->top, rcPos->left, rcPos->bottom, rcPos->right); MessageBox(hWnd, (LPCSTR)strx, (LPCSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION); Rectangle(hdc, rcPos->left, rcPos->top, rcPos->right, rcPos->bottom); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); return 0; }

  • win32apiでの動画出力

    win32apiとopenCVを使った動画出力プログラムを作りたいのですが, フリーズしてしまいます. 詳しい方,力を貸してください. 以下にプログラムを載せます. LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { int x, y; int id; int c; char* szWndName = "camera capture"; CvCapture* capture; // IplImage* img; switch (msg) { case WM_CREATE: hDC = GetDC( hWnd ); return DefWindowProc(hWnd, msg, wParam, lParam); case WM_COMMAND: switch(LOWORD(wParam)){ case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0L); break; case IDM_USB: capture = cvCaptureFromCAM(0); if(capture == NULL){ MessageBox(hWnd, (LPCTSTR)TEXT("Not camera"), (LPCTSTR)TEXT("Test"), MB_OK); return -1; } while(1){ img = cvQueryFrame(capture); bmpData = (LPDWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, img->width * img->height * 4); iplTobmp(img, bmpInfo, bmpData); StretchDIBits( hDC, 0, 0, img->width, img->height, 0, 0, img->width, img->height, bmpData, &bmpInfo, DIB_RGB_COLORS, SRCCOPY); } ReleaseDC(hWnd, hDC); cvReleaseCapture(&capture); return 0; break; } break; case WM_LBUTTONDOWN: // マウスカーソルが移動したときに送られてくる // 移動先の座標を取得 x = LOWORD( lParam ); y = HIWORD( lParam ); // 座標をテキストファイルに書き込む _ftprintf( g_fp, _T("(%d %d)\n"), x, y ); return 0; case WM_CLOSE: id = MessageBox(hWnd, TEXT("Close?"), TEXT("Close"), MB_OKCANCEL | MB_ICONQUESTION); if(id == IDOK) DestroyWindow(hWnd); return (0L); case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); }

  • TextOut( ) が動かない

    LRESULT CALLBACK WndProc( HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; switch(msg){ case WM_KEYDOWN:  if( wParam == VK_ESCAPE ){   hdc = BeginPaint(hWnd, &ps);   TextOut(hdc,0,0,str,strlen(str));   EndPaint(hWnd, &ps);  }  break; case WM_PAINT:  break; エスケープキーで文字表示をやりたいけど TextOut( ) が動作していないみたいでした。 switch(msg){ case WM_KEYDOWN:  if( wParam == VK_ESCAPE ){   hdc = BeginPaint(hWnd, &ps);   TextOut(hdc,0,0,str,strlen(str));   EndPaint(hWnd, &ps);  }  break; case WM_PAINT:  hdc = BeginPaint(hWnd, &ps);  TextOut(hdc,0,0,str,strlen(str));  EndPaint(hWnd, &ps);  break; とすると、常に文字が表示されたから、やっぱり case WM_KEYDOWN: の中の TextOut( ) が 動作していないんだと思いました。 TextOut( ) は case WM_PAINT: からのつながりが ある場合でないと実行されないんですか? ソースのおかしいところがあったら教えてください。

  • 指定の開発環境を導入しても解決できません。

    以前、猫でもわかるゲームプログラミングで、 付録のプログラム「外部ファイルの画像を表示する」 をコンパイルした時にエラーが起きると質問しましたが、 その時の解答「指定の開発環境を導入する」を行い、 コンパイルした所、以下のエラーが出てきました。 その時のプログラムがこちら。 // bmp02.cpp #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); char szClassName[] = "bmp02"; //ウィンドウクラス HINSTANCE hInst; int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; hInst = hCurInst; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } //ウィンドウ・クラスの登録 ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; //プロシージャ名 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst;//インスタンス wc.hIcon = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; //メニュー名 wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); return (RegisterClassEx(&wc)); } //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, "猫でもわかるゲームプログラミング", //タイトルバーに表示されます WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL NULL, //メニューハンドル、クラスメニューを使うときはNULL hInst, //インスタンスハンドル NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id, i, j; static int bmpw, bmph; static HDC hdc_mem; static HBITMAP hBmp; BITMAP bmp_info; HDC hdc; PAINTSTRUCT ps; RECT rc; switch (msg) { case WM_CREATE: hBmp = (HBITMAP)LoadImage(NULL, "cat.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); GetObject(hBmp, (int)sizeof(bmp_info), &bmp_info); bmpw = bmp_info.bmWidth; bmph = bmp_info.bmHeight; hdc_mem = CreateCompatibleDC(NULL); SelectObject(hdc_mem, hBmp); break; case WM_PAINT: GetClientRect(hWnd, &rc); hdc = BeginPaint(hWnd, &ps); for (i = 0; i * bmpw <= rc.right; i++) { for (j = 0; j * bmph <= rc.bottom; j++) { BitBlt(hdc, i * bmpw, j * bmph, bmpw, bmph, hdc_mem, 0, 0, SRCCOPY); } } EndPaint(hWnd, &ps); break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよろしいですか", "確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) DestroyWindow(hWnd); break; case WM_DESTROY: DeleteObject(hBmp); DeleteDC(hdc_mem); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

  • SetPixel関数のmath.h

    WindowsXPのノートでVisualC++2008ExpressEditionを使っています。 SetPixel関数で円を描くプログラムで、math.hの問題だと思われる4つのエラーでコンパイルできません。 宣言は #include<windows.h> #include<math.h> ウィンドウプロシージャ内で switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); for (i = a - r;i <= a + r; i++) { x = i; y = (int)sqrt(pow(r, 2) - pow(x - a, 2)) + b;←96行目 SetPixel(hdc, x, y, RGB(0, 0, 0)); y = (int)-sqrt(pow(r, 2) - pow(x - a, 2)) + b;←98行目 1>c:\documents and settings\REI\my documents\visual studio 2008\projects\setpixel01\setpixel01\setpixel01.cpp(96) : error C2668: 'pow' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(575): 'long double pow(long double,int)' の可能性があります。 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(527): または 'float pow(float,int)' 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(489): または 'double pow(double,int)' 1> 引数リスト '(int, int)' を一致させようとしているとき 同じ内容のエラーが96行目なのが2回、98行目なのが2回出ます。math.hを編集すればいいんでしょうか?gccならコマンドラインから-lmでいいかもしれないんですが。自分の入力ミスはないと思います。 どなたかお分かりになる方、教えていただけないでしょうかm(_ _)m

専門家に質問してみよう