DrawImage を数回使用して、多数の画像を描画するとします。
e.Graphics.DrawImage(newImage, destRect);
描いたグラフィック用紙から特定の画像を削除するにはどうすればよいですか? 削除に使用できる特定の機能はありますか?
dispose
とを試しRectangle.Empty
ましたが、紙に描いた画像は実際には削除されません。
クリカラ、あなたがすべきことは:
フレームごとに、すべてをゼロから再描画する必要があります。これには、ボール、パドル、ブロックのリスト (およびスコアなど、必要なものすべて) が含まれます。
これで混乱が解消されることを願っています。
まず、GDI+ Graphics には「オブジェクトを削除する」という概念がありません。フレームごとにクライアント領域全体を再描画する必要があります。オブジェクトとその状態のリストをメモリに保持し、フレームごとにサーフェス全体を再描画する必要があります。ただし、これにより、ちらつきやスムーズでないユーザー エクスペリエンスが発生する可能性があることに注意してください。これらを回避するためのヒントを次に示します。
DoubleBuffered
Form または UserControl のプロパティが True に設定されていることを確認してください。これにより、他の方法よりもはるかにスムーズなアニメーションが得られます。
CreateGraphics()
描画ループでは、Graphics オブジェクトへの参照を取得するために絶対に呼び出さないでください。ループ内のオブジェクトと状態のリストを更新してInvalidate()
から、コントロール/フォームを呼び出して、Paint
イベントで描画プロセスを実行します。
の 1 つのオーバーロードをInvalidate()
使用すると、無効にする (再描画する) 必要がある四角形を指定できます。跳ねるボールの現在の位置 (ボールのサイズよりも 20 ピクセル広い/高いなど) の周りに「安全な」長方形を引数として渡し、その部分だけをPaint
イベントに描画できます。
パフォーマンスをさらに向上させるために、スコア、プレーヤー名などの補助情報を実際の「ゲーム ボード」の外に保持し、描画の代わりに通常のラベル/テキスト ボックスを使用できます。