Platform SDK: DirectX |
ここでは、Visual Basic でのアプリケーション開発について説明する。C++ については、「DirectDraw C/C++ チュートリアル」を参照すること。
単純なスプライト アニメーションをスクリーン上に表示するには、いくつかのステップが必要である。スプライト サーフェスとバックグラウンド イメージがバック バッファに合成され、その後バック バッファがプライマリ サーフェスにブリットされる。アニメーションを作成するには、スプライト サーフェスをバック バッファにブリットするときに、転送先矩形の位置を継続的に動かす。チュートリアル 2 では、アプリケーションの実行中に、DoFrame プロシージャがスプライト サーフェスの位置を更新し、バックグラウンド イメージを再描画する。また、アニメーションの毎秒のフレーム数 (fps) を表示するためのコードがいくつかある。
始めに、単純なタイマ ループを実装してスプライトの配置角度を計算する。
t2 = Timer If t1 <> 0 Then a = a + (t2 - t1) * 100 If a > 360 Then a = a - 360 End If t1 = t2
次に、作成したサーフェスがまだ制御できていることを確認する。ディスプレイ アダプタの制御が別のプリケーションに移った場合はサーフェスが消失することがあり、そのときはリストアする必要がある。チュートリアル 2 のサンプルには、DirectDraw オブジェクトの協調レベルをテストし、サーフェスをリストアする必要があるかどうかを決定する単純な関数 ExModeActive が含まれる。これを、以下のコードで示す。
Dim bRestore As Boolean bRestore = False Do Until ExModeActive DoEvents bRestore = True Loop DoEvents If bRestore Then bRestore = False objDD.RestoreAllSurfaces End If
次に、コードのスモール ビットを実装して、スプライト アニメーションの毎秒のフレーム数 (fps) を表示する。これは、アプリケーションを効率化し、アプリケーションに潜む障害を発見するのに役立つ。
'FPS を計算する。 i = i + 1 If i = 30 Then tNow = Timer If tNow <> tLast Then fps = 30 / (Timer - tLast) tLast = Timer i = 0 Me.Caption = "DD Transparency Frames per Second =" + Format$(fps, "#.0") End If End If
次に、スプライトを配置する位置の x 座標と y 座標を計算する。
x = Cos((a / 360) * 2 * 3.141) * Picture1.Width / 8 y = Sin((a / 360) * 2 * 3.141) * Picture1.Height / 8 x = x + Picture1.Width / 2 y = y + Picture1.Height / 2
スプライトの直前の位置は RECT 型に保持されているため、バックグラウンド サーフェスの中で影響を受けた部分のみを再描画することができる。この結果、サーフェス全体を継続的にブリットする必要がなくなり、アプリケーションのパフォーマンスが向上する。次に、スプライトの新しい位置を決定し、スプライト サーフェスをバック バッファにブリットする。
'必要な部分のバックグラウンドだけを再描画して、 '最後のフレームからバックグラウンドを取り除く。 Dim rClean As RECT If lastX <> 0 Then rClean.Left = lastX rClean.Top = lastY rClean.Right = lastX + ddsdSprite.lWidth rClean.Bottom = lastY + ddsdSprite.lHeight Call objDDBackBuffer.BltFast(lastX, lastY, objDDLakeSurf, rClean, DDBLTFAST_WAIT) End If lastX = x lastY = y 'スプライトをバックバッファにブリットする。 'その際、転送元のカラー キーを使用し、 'blt の完了を待って移動を開始する。 Dim rtemp As RECT rtemp.Left = x rtemp.Top = y rtemp.Right = x + ddsdSprite.lWidth rtemp.Bottom = y + ddsdSprite.lHeight objDDBackBuffer.Blt rtemp, objDDSpriteSurf, rSprite, DDBLT_KEYSRC Or DDBLT_WAIT
最後に、DirectX7.GetWindowRect メソッドを呼び出してピクチャボックス コントロールの矩形座標を取得し、DirectDrawSurface7.Blt メソッドを呼び出してバック バッファをプライマリ サーフェスにブリットする。
Call objDX.GetWindowRect(Picture1.hWnd, rPrim) Call objDDScreen.Blt(rPrim, objDDBackBuffer, rBackBuffer, DDBLT_WAIT)