ページ 1 / 1
東方文花帖の撮影機能について。
Posted: 2008年9月02日(火) 21:51
by 彩
初めまして。
龍神録プログラミングの館を頼りにSTGをある程度作ったのですが、
東方文花帖では、弾を放つのではなく、写真を撮るという内容のゲームなのです。
そこで、撮影機能に凄い興味がわき自分もこの機能の勉強をしたいと思って書き込みました。
どうやってプログラムを組めば、撮影が可能になるのでしょうか??
Re:東方文花帖の撮影機能について。
Posted: 2008年9月02日(火) 22:29
by array
撮影機能は便利なのがDXライブラリにあります。
int SaveDrawScreen( int x1, int y1, int x2, int y2, char *FileName ) ;
を使って、スクリーンショットの範囲を決めてやり、この範囲を少しづつ小さくしていきつつ・・・と説明したら長くなりそうなのでやめますが。
(ショット=写真を撮る)
要点として
ショット中はプレイヤの移動はしない。
ショット中は撮影位置の移動。
ショットは、時間経過に基づき、少しずつ撮影可能範囲が狭くなる。
範囲外に相手が居ればショットミス。
ショット範囲内の弾は消す。
ショット後は次回ショットまでのカウントを初期化する。
他にも細かく言えば要素がありますが、とりあえずこんな感じで組めば良いと思います。
あとは撮影範囲のエフェクトですよね。とりあえず撮影範囲はDrawBox()で描画しておいて、それっぽい動きをさせてやれば良いと思います。
Re:東方文花帖の撮影機能について。
Posted: 2008年9月02日(火) 22:32
by 名無しさん
描画をバックバッファに直接行う前にレンダーターゲットテクスチャに描画するだけです
描画したテクスチャをsetTextureしてお好みの範囲(写真の大きさ)を指定して描画すればOKです
Re:東方文花帖の撮影機能について。
Posted: 2008年9月02日(火) 22:40
by array
名無しさんの処理は分らないのですが、なんか軽そうで良いですね。
ちなみに
SaveDrawScreen( ) ;
は、画面を座標範囲を指定してやり、BMPとして保存する関数ですので、重そう・・・。そしてそれを画像として読み込む必要があるので一瞬止まる可能性も(実際にやってみないと分りませんが)。その画像を希望する動きをさせながら定位置に持っていく・・・というのをイメージしてました。
Re:東方文花帖の撮影機能について。
Posted: 2008年9月02日(火) 23:25
by 木霊
arrayさんと同系列のやり方であれば
GetDrawScreenGraph ( int x1, int y1, int x2, int y2, int GrHandle );
の方が使えそうです。詳細はリファレンスの「グラフィックデータ制御関数」の中ほどからいけます。
画像を保存せずに直接読み込むので少しだけましです。
DerivationGraph( int SrcX, int SrcY, int Width, int Height, int SrcGraphHandle );
と組み合わせて使えば何とかなるかもしれません。
名無しさんのやり方の方はDXライブラリの関数ではなく、DirectXの関数(正確にはその中のDirect3D)なので、
ちょっと敷居が高いです。
Re:東方文花帖の撮影機能について。
Posted: 2008年9月02日(火) 23:40
by Justy
>名無しさんのやり方の方はDXライブラリの関数ではなく、DirectXの関数(正確にはその中のDirect3D)なので、
>ちょっと敷居が高いです。
DXライブラリでも使えますよ。
MakeScreen()で作ったテクスチャを SetDrawScreen()すれば、
以後は描画したものは全てそのテクスチャにレンダリングされます。
とはいえ、実際にゲームの中で使うには仕様にも依りますが、
望み通りのものを作るには多少工夫が必要になるかもしれません。
Re:東方文花帖の撮影機能について。
Posted: 2008年9月03日(水) 07:21
by 管理人
私がもしそれを行うなら
MakeGraphでグラフィックを作って
GetDrawScreenGraphで読み込み、それを使用します。
詳しくはこちらをご覧下さい。
http://homepage2.nifty.com/natupaji/DxL ... html#R3N12
bmpファイルへの保存はそのエリアをクリアして情報を保存する時でいいんじゃないかと思います。
あのゲームは、撮った写真の評価を自動でするのがすごいですよね。