Platform SDK: DirectX

ステップ 3 : プライマリ サーフェスへのブリット

[C++]

ここでは、Visual Basic でのアプリケーション開発について説明する。C++ については、「DirectDraw C/C++ チュートリアル」を参照すること。

[Visual Basic]

単純なスプライト アニメーションをスクリーン上に表示するには、いくつかのステップが必要である。スプライト サーフェスとバックグラウンド イメージがバック バッファに合成され、その後バック バッファがプライマリ サーフェスにブリットされる。アニメーションを作成するには、スプライト サーフェスをバック バッファにブリットするときに、転送先矩形の位置を継続的に動かす。チュートリアル 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)