2

私は現在、GDI+ でゲームを作成しています。ゲームを開発するための最適なソリューションではないことはわかっていますが、これは学校のプロジェクトであるため、選択の余地がありません。

ゲームを約 10 回実行するたびに、グラフィックが画面の左上隅のフォームの外側にレンダリングされます。

問題を絞り込むのに役立つ場合は、ダブルバッファリングを使用しています。

レンダリング コードは次のようになります。

while (true)
{       
    // Create buffer if it don't exist already
    if (context == null)
    {
        context = BufferedGraphicsManager.Current;
        this.buffer = context.Allocate(CreateGraphics(), this.DisplayRectangle);
    }

    // Clear the screen with the forms back color
    this.buffer.Graphics.Clear(this.BackColor);

    // Stuff is written to the buffer here, example of drawing a game object:
    this.buffer.Graphics.DrawImage(
        image: SpriteSheet,
        destRect: new Rectangle(
            this.Position.X
            this.Position.Y
            this.SpriteSheetSource.Width,
            this.SpriteSheetSource.Height),
        srcX: this.SpriteSheetSource.X,
        srcY: this.SpriteSheetSource.Y,
        srcWidth: this.SpriteSheetSource.Width,
        srcHeight: this.SpriteSheetSource.Height,
        srcUnit: GraphicsUnit.Pixel);

    // Transfer buffer to display - aka back/front buffer swapping 
    this.buffer.Render();
}

スクリーンショットで説明する方が簡単です:

勝利フォーム外のゲームgfx

4

2 に答える 2

2

ゲームを約 10 回実行するたびに、グラフィックが画面の左上隅のフォームの外側にレンダリングされます。

スクリーン ショットと説明から、Windows のデスクトップ デバイス コンテキスト (DC) に描画している場合があります。これは、DC を取得するときにゼロ (IntPtr.Zero) のウィンドウ ハンドルを使用した場合の効果です。これにより、フォーム ウィンドウが作成される前にゲーム ループを開始すると、グラフィックス コンテキストがゼロのウィンドウ ハンドルを指すようになる可能性があると思いました。

解説で確認されているように、ゲームループに別のスレッドを使用しているため、これがランダムに発生します。一度スレッドを処理すると、スレッドの開始と完了のタイミングに関しては、常に同じ結果が 2 回得られるとは限りません (特に、スレッドがマルチコア/CPU コンピューターを介して並列に実行できる場合)。ゲーム アプリケーションが実行されるたびに、UI スレッドでフォーム ウィンドウを作成して表示する前に、ゲーム ループ スレッドが起動して実行される可能性があります。

于 2012-12-30T17:26:17.073 に答える