トップページ > 記事閲覧
2D描画でZ値を指定して表示することはできますか?
名前:丈槍由紀 日時: 2016/01/24 17:18

斜め上してんのゲーム(RPGなど)で、手前のもの(画面上で下にあるもの)に奥のもの(画面上で上にあるもの)が隠されるような表現をしたいのですが、 DrawGraphなどの2D描画関数のみを使ってそれを実装しようとすると、表示するものをすべて把握したうえでY座標でソートしてから描画処理、という風になりますよね? ビルボードを使うしかないのでしょうか?
メンテ

Page: 1 |

Re: 2D描画でZ値を指定して表示することはできますか? ( No.1 )
名前:管理人 日時:2016/01/24 23:40

> 2D描画でZ値を指定して表示することはできますか? 3Dと同じようにZバッファを使うことはできますが、2Dとの相性はあまりよくないので お勧めはできません お勧めできない理由ですが、Zバッファは半透明と非常に相性が悪いので 半透明のものを描画する場合はやはり画面に対して奥のものから順番に描画しなければなりません また、半透明の要素が無いドット絵でも、拡大して描画をする場合に SetDrawMode( DX_DRAWMODE_BILINEAR ) ; を使用してバイリニア補間で描画した場合は ドット絵の透過させる部分と透過させない部分との間に半透明の領域ができてしまうので この場合もZバッファとは相性が悪く、画面奥のものから描画しなくてはなりません とりあえず以下のプログラムのように SetUseZBufferFlag と SetWriteZBufferFlag と SetDrawZ を使用することで2D描画でも Zバッファを使用することができますので、 よろしければお試しください #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GrHandle ; ChangeWindowMode( TRUE ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1 ; // 画像の読み込み GrHandle = LoadGraph( "test1.bmp" ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 画面を初期化 ClearDrawScreen() ; // Zバッファを有効にして、Zバッファへの書き込みも有効にする SetUseZBufferFlag( TRUE ) ; SetWriteZBufferFlag( TRUE ) ; // 描画物のZ値をセット( 指定できる値の範囲は 0.0fより大きく、1.0fより小さい値 ) SetDrawZ( 0.5f ) ; // 1枚目を描画 DrawGraph( 0, 0, GrHandle, TRUE ) ; // 描画物のZ値をセット( 指定できる値の範囲は 0.0fより大きく、1.0fより小さい値 ) SetDrawZ( 0.7f ) ; // 2枚目を描画 DrawGraph( 40, 0, GrHandle, TRUE ) ; // Zバッファを無効にして、Zバッファへの書き込みも無効にする SetUseZBufferFlag( FALSE ) ; SetWriteZBufferFlag( FALSE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; } Zバッファを使用した描画を行う前に SetUseZBufferFlag( TRUE ); と SetWriteZBufferFlag( TRUE ) ; を実行して、Zバッファを使用ない描画に戻したいタイミングで SetUseZBufferFlag( FALSE ); と SetWriteZBufferFlag( FALSE ) ; を実行します 奥行きの度合いは SetDrawZ で指定しますが、注釈にもありますがこちらの値は 0.0f より大きく、1.0f より小さい値である必要があります ( 一応 0.0f や 1.0f でも大丈夫ですが、微妙な値なのでグラフィックスデバイスによっては 正常に描画されない可能性があるので、使用する値の範囲は 0.0001f 〜 0.999f などに しておいた方が良いです )
メンテ
Re: 2D描画でZ値を指定して表示することはできますか? ( No.2 )
名前:丈槍由紀 日時:2016/01/31 11:26

迅速な返信ありがとうございます そして返信遅れてすみませんでした 教えていただいたSetDrawZ、いろいろ試してみたのですが半透明が使えるところが限られますね。。。 ちゃんとソートして描画という風な実装にすることにしました ありがとうございました
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存