public void OpenLevel(int level_nr) { if (level_nr > last_level_nr) { return; } this.level_nr = level_nr; if (!game.Init(level_nr, out width, out height)) { MessageBox.Show("Поздравляю!!!!!"); this.DialogResult = System.Windows.Forms.DialogResult.OK; return; } InitPictures(); game.ShowLevel(); }
public void OpenLevel(int level_nr) { if (level_nr > last_level_nr) { return; } this.level_nr = level_nr; if (!game.Init(level_nr, out width, out height)) { this.DialogResult = System.Windows.Forms.DialogResult.OK; return; } //width = 10; //height = 8; InitPictures(); game.ShowLevel(); }
static void Main(string[] args) { Thread.CurrentThread.Priority = ThreadPriority.Highest; // スレッドの優先度を上げておく // 画面リフレッシュレートと目標フレームレートが等しい場合は垂直同期を有効に、等しくない場合は垂直同期を無効にする DX.SetWaitVSyncFlag(DX.GetRefreshRate() == TargetFPS ? DX.TRUE : DX.FALSE); DX.SetWindowText("ゲームタイトル"); // ウィンドウのタイトル DX.SetGraphMode(Screen.SCREEN_WIDTH, Screen.SCREEN_HIGTH, 32); // ウィンドウサイズ(画面解像度)の指定 DX.ChangeWindowMode(DX.TRUE); // ウィンドウモードにする(DX.FALSEを指定するとフルスクリーンになる) DX.SetAlwaysRunFlag(DX.TRUE); // ウィンドウが非アクティブでも動作させる DX.DxLib_Init(); // DXライブラリの初期化 DX.SetMouseDispFlag(DX.TRUE); // マウスを表示する(DX.FALSEを指定すると非表示になる) DX.SetDrawScreen(DX.DX_SCREEN_BACK); // 描画先を裏画面とする(ダブルバッファ) game = new Game(); game.Init(); DX.ScreenFlip(); stopwatch.Start(); while (DX.ProcessMessage() == 0) // ウィンドウが閉じられるまで繰り返す { // FPSの計測 fpsFrameCount++; if (fpsFrameCount >= 60) { long elapsedTicks = stopwatch.Elapsed.Ticks - fpsTicks; float elapsedSec = elapsedTicks / 10000000f; CurrentFPS = fpsFrameCount / elapsedSec; fpsFrameCount = 0; fpsTicks = stopwatch.Elapsed.Ticks; } game.Update(); if (DX.GetWaitVSyncFlag() == DX.TRUE) { if (EnableFrameSkip) { long waitTicks = nextFrameTicks - stopwatch.Elapsed.Ticks; // 余った時間 if (waitTicks < 0) // 目標時刻をオーバーしている { if (skipCount < MaxAllowSkipCount) // 連続フレームスキップ数が最大スキップ数を超えていなければ { skipCount++; // フレームスキップ(描画処理を飛ばす) } else { // 最大スキップ数を超えてるので、フレームスキップしないで描画 nextFrameTicks = stopwatch.Elapsed.Ticks; Draw(); } } else { Draw(); } nextFrameTicks += IntervalTicks; } else { Draw(); } } else { long waitTicks = nextFrameTicks - stopwatch.Elapsed.Ticks; // 余った時間(待機が必要な時間) if (EnableFrameSkip && waitTicks < 0) { if (skipCount < MaxAllowSkipCount) { skipCount++; // フレームスキップ(描画処理を飛ばす) } else { nextFrameTicks = stopwatch.Elapsed.Ticks; Draw(); } } else { if (waitTicks > 20000) // あと2ミリ秒以上待つ必要がある { // Sleep()は指定した時間でピッタリ戻ってくるわけではないので、 // 余裕を持って、「待たなければならない時間-2ミリ秒」Sleepする int waitMillsec = (int)(waitTicks / 10000) - 2; Thread.Sleep(waitMillsec); } // 時間が来るまで何もしないループを回して待機する while (stopwatch.Elapsed.Ticks < nextFrameTicks) { } Draw(); } nextFrameTicks += IntervalTicks; } } DX.DxLib_End(); // DXライブラリ終了処理 }