DirectDraw7
DirectDrawはゲーム専用機に対抗してMicrosoftがWindowsでゲームを行えるよう開発したツールです。
XBOXで使われているそうです。
3D機能のあるDirectX9 SDK (February 2006)をdownloadしたものを使っていますが、
DirectDrawはDirectX7のまま、DirectX9に含まれています。
DirectDraw7をVisucal Stuio.NET 2003のC++でプログラムしたサンプルを以下に示します。
DirectX7以上が必要です。
Hello World
あらゆるプログラム言語はHello Worldから始まるそうです。
以下のように打ち込みました。
Source1.cpp
やっていることは
- 640x480・背景黒windowの作成
- DirectDrawのオブジェクト、表示されるサーフェイス、裏サーフェイスの作成
- メモリデバイスコンテキストの設定を別途作成したビットマップとする(はまりました)
- DrawTextを使ってメモリデバイスコンテキストへ描画
- メモリデバイスコンテキストの内容を裏サーフェイスのデバイスコンテキストにブロック転送
- 裏サーフェイスのデバイスコンテキストを削除(はまりました)
- 裏サーフェイスを表示
- 作成した順番の逆にDirectDrawの部品を削除
です。
どうもDirectDrawを終了する時点で画面モードが元に戻るようなので、
画面モード関数ChangeDisplaySettingsの2番目の引数にNULLを入れて、
画面モードを復元することはしていません。
task1.exe
Hello World!と表示されます。
ランダムドットの背景と文字表示
DirectDrawを使うと画面のちらつきが抑えられるそうです。
そこで背景が時間変化するランダムドット表示、文字を変化しないランダムドット表示に挑戦しました。
Source2.cpp
- GIVEIOを組み込みパラレルポートからトリガー信号が出せるようにしました。
- 背景変化が速すぎると灰色に見えるのでSleep関数を使って間を取っています。
ようやく視覚刺激の課題らしくなりました。
task2.exe
1秒毎にひらがな1文字が表示されます。
渦巻きと文字表示
背景を回転する渦巻きとし、一定時間反転した文字を表示させます。
Source3.cpp
- 予め回転角度分の渦模様を計算し、HBITMAP配列に保存します。
- オリジナルと文字反転用と、メモリデバイスコンテキストを2つ作成。
- 文字反転用のメモリデバイスコンテキストをバックサーフェイスに出力
- Sleepで適当に時間調整
反転は残影が残るためかサブリミナル効果は?です。
task3.exe
但し、見ていると気分が悪くなります。
四分の一ずつ反転
視野の四分の一ずつを反転する課題を作成しました。
Source4.cpp
- do while文使用
- Sleep関数による刺激提示時間設定のためSleep中はESCAPEキーに反応しにくい?
- 5種類のオフスクリーンサーフェイスを作成。
- ランダムに4種類のオフスクリーンサーフェイスをバックサーフェイスにブロック転送
- 反転サーフェイス開始と終了で2回トリガー刺激
視野1/4ずつ検査できることを期待したいと思います。
task4.exe
ウインドウのデバイスコンテキストを介したブロック転送bitblt関数よりサーフェイスのbltFast関数のほうが高速なんだそうです。