int main(int argc, char *argv[]) { //printf("Sizeof struct game is %zu bytes.\n", sizeof(game)); Game_init(&game); if (Game_deserializeData(&game) == 1) { Game_run(&game); } return 0; }
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); MSG msg; HACCEL hAccelTable; // グローバル文字列を初期化しています。 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_TETRIS, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // アプリケーションの初期化を実行します: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TETRIS)); // メイン メッセージ ループ: ::timeBeginPeriod(1); double host_timescale = 1; double view_max_fps = VIEW_SPEED_FPS; // 描画のFPS制限 // 上のがいわゆるnet_graphのFPSだと思う double game_max_fps = GAME_SPEED_FPS * host_timescale; // ゲームスピードのFPS制限 // こっちが一般的にはtick?? DWORD dwTime = ::timeGetTime(); DWORD fps_after = dwTime; DWORD fps_before = fps_after; DWORD frame = 0; DWORD currentTime = dwTime; double gameSpeedWaitTime = (1.0 / game_max_fps * 1000.0); double gameSpeedNextTime = dwTime + gameSpeedWaitTime; double viewSpeedWaitTime = (1.0 / view_max_fps * 1000.0); double viewSpeedNextTime = dwTime + gameSpeedWaitTime; Game_init(); while(true){ if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){ if(!GetMessage(&msg, NULL, 0, 0)) return msg.wParam; TranslateMessage(&msg); DispatchMessage(&msg); }else{ // FPS測定(1000ms秒あたりのframe数を計測) currentTime = ::timeGetTime(); if(currentTime - fps_before >= 1000){ // 前回から1秒間(1000ms)経過していた場合 fps_before = currentTime; g_frameRate = g_frame; g_frame = 0; // フレーム数を次秒の計測のためにリセット } // FPS制限(1/60おきにコードが実行されるようにする) if(currentTime >= gameSpeedNextTime ){ // 次回の予定実行時を過ぎていた場合 gameSpeedNextTime += gameSpeedWaitTime; // メイン処理 if( GameMain(msg.hwnd) == false ){ break; // 終了処理へ } }else{ // 表示上のFPS描画しなければならないかチェックする if(currentTime >= viewSpeedNextTime ){ viewSpeedNextTime += viewSpeedWaitTime; onPaint(g_hWnd, g_mDC); ::InvalidateRect(g_hWnd, NULL, FALSE); g_frame++; }else{ Sleep(1); } } } } // いろいろ後片付けを書く trace(L"終了処理\n"); GameMain_quit(); ::timeEndPeriod(1); return (int) msg.wParam; }