トップページ > 過去ログ > 記事閲覧
SetDrawArea
名前:DXビギナー 日時: 2006/12/11 18:40

円形で描画可能領域を指定したいのですがSetDrawAreaだとやはり四角しか無理ですか? あと円形にする方法が他にあれば教えていただけないでしょうか。

Page: 1 |

Re: SetDrawArea ( No.1 )
名前:管理人 日時:2006/12/12 13:25

 DXビギナーさん始めまして、DXライブラリの管理人です。  SetDrawArea では四角しか設定することが出来ませんので、 描画領域を四角以外にされたい場合はマスクを使用してみて下さい。m(_ _)m (ただ、重いので大きな画像の描画には向いていませんが・・・) http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R16N1
Re: SetDrawArea ( No.2 )
名前:DXビギナー 日時:2006/12/13 18:54

素早い回答ありがとうございます。 早速マスクを使ってみたのですがLoadMaskでpng形式を読み込むとなぜかエラーが出てしまいます。 いちおうbmpファイルにすると読みこめました。 あと現在14歳からはじめるC++ゲームプログラミングのフレームワークを参考にして ゲームを開発しているのですがマスクの処理はどこでするのがスマートな方法ですか?
Re: SetDrawArea ( No.3 )
名前:管理人 日時:2006/12/15 13:13

 DXビギナーさんどうも、DXライブラリの管理人です。  すみません、画像形式に関らず 24bitカラー画像以外の画像ファイルを LoadMask で読み込もうとするとエラーが起きるようになっていました。  修正したバージョンをアップしましたので、宜しければこちらを お使い下さい。m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のファイルに上書きして、BCCをお使いの場合は『再構築』、 VCをお使いの場合は『リビルド』をして下さい) > あと現在14歳からはじめるC++ゲームプログラミングのフレームワークを参考にして > ゲームを開発しているのですがマスクの処理はどこでするのがスマートな方法ですか?  うーん、どのような用途でマスクを使うのかによって変わってきますので、 単純に「これが一番良いです」というのはありません。
Re: SetDrawArea ( No.4 )
名前:DXビギナー 日時:2006/12/15 21:58

管理人さん回答ありがとうございます。 マスクをつかったのですが、かなり処理が重たくなってしまい ゲームとしては使えないプログラムになってしまいました(+_+) WindowsAPIのクリッピングというのを使えばできるようなのですが DXライブラリとWindowsAPIの併用はできるのでしょうか? 初心者な質問ですいません。
Re: SetDrawArea ( No.5 )
名前:管理人 日時:2006/12/18 15:46

 DXビギナーさんどうも、DXライブラリの管理人です。  重かったですか・・・   > WindowsAPIのクリッピングというのを使えばできるようなのですが > DXライブラリとWindowsAPIの併用はできるのでしょうか?  WindowsAPI には余り詳しくないので曖昧な答えになってしまいますが、 WindowsAPI(というか DirectX 以外の画像処理API なので GDI ですね)との 併用は可能です。  が、クリッピングというのが私が知っているものだとしますと、 現在DXライブラリが使用している描画処理に対して使用することは 出来ません。  ただ、WindowsAPI のクリッピング機能ではありませんが、別の方法で現在より も高速にマスク処理を行うことが出来るかもしれない方法を少し思いつきました ので、申し訳ありませんが少々(多分長くて一週間くらいだと思います)お待ち 下さい。m(_ _)m  ところで、マスクを使う処理は結構特殊な効果を行う場合だと思うのですが、 どのような処理にマスクを使用されているのでしょうか?
Re: SetDrawArea ( No.6 )
名前:DXビギナー 日時:2006/12/19 12:38

ありがとうございます。お忙しいのに本当にすいませんm(_ _)m 現在、私はアクションゲームを作っていて、暗い場所に入ると自分の操作するキャラの周りとスコアの部分だけを描画したいと思っています。 その場合にマスク処理を使おうと考えています。
Re: SetDrawArea ( No.7 )
名前:SweetBlack 日時:2006/12/20 20:13

横槍失礼します。 普通にキャラ類を表示した後、 自分の周りだけ抜いた黒い画像を上書きして、 その上にさらにスコア類を表示するとか してみたらどうでしょうか。
Re: SetDrawArea ( No.8 )
名前:DXビギナー 日時:2006/12/22 14:03

SweetBlackさん回答ありがとうございます。 すみません、説明が足りませんでした。 ゲームは二人操作で二つのキャラを動かしたり、キャラによって明るい範囲が増えたりといろいろと発展を考えています。
Re: SetDrawArea ( No.9 )
名前:からすば 日時:2006/12/22 16:58

こんにちは、からすばです。 横から失礼します。 こうすればどうでしょう? ・まずキャラ類を画面に描画する。 ・GetDrawScreenGraphでキャラ周りの矩形を取得。この時に見える範囲分を取る。 ・画面を黒くする。 ・キャラ周りの矩形画像を、取得した位置と同じ位置に描画。 ・その(キャラ周りの)上に円形に切り抜いた黒い画像を描画。見える範囲はDrawExtendGraphで調整する。 ・スコアの描画。 とやると表示が楽かもしれません。まぁマスクよりは早いと思います。
Re: SetDrawArea ( No.10 )
名前:SweetBlack 日時:2006/12/22 21:42

>ゲームは二人操作で二つのキャラを動かしたり、キャラによって明るい範囲が増えたりといろいろと発展を考えています。 そんなのはどうとでもなると思いますよ。 「キャラの周りだけ表示」 ではなくて 「キャラの周り以外を黒く塗りつぶす」 というやり方を取ればいいのですから。 例えば、画面の大きさにあわせた仮想画面を配列変数で作って、 デフォルトで黒フラグをセットしておき、 キャラの座標にあわせて円の形に透明フラグを立てる。 それからその配列変数の値から画面を塗りつぶしていくなり 黒画像を作って上書きするなりすればできると思います。 (処理速度がどれくらいになるかはやってみないとわかりませんが)
Re: SetDrawArea ( No.11 )
名前:管理人 日時:2006/12/25 14:06

 DXビギナーさんどうも、DXライブラリの管理人です。  高速なマスク処理の為の機能を追加したバージョンをアップしましたので、 宜しければダウンロードしてください。 http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のファイルに上書きして、BCCをお使いの場合は『再構築』、 VCをお使いの場合は『リビルド』をして下さい)  高速なマスク処理ですが、3D関連では必ずお世話になるZバッファを 使うことにしました。  Zバッファは本来3Dポリゴンを描画する際に、奥行き的に遠くの ポリゴンが手前のポリゴンに隠れるようにする為の機能なのですが (Zバッファの機能を使うと手前のポリゴンを描画した後、遠くの ポリゴンを描画しても手前のポリゴンの上には描画されないように することが出来ます(Zバッファの機能を使わないと後から描画した ものが必ず上になるので、手前のポリゴンを描画した後、遠くのポリゴンを 描画するとしっかり手前のポリゴンの上に描画されてしまう)) この機能を2Dのマスクとして使うことにしました。  というわけで、今回以下の関数を追加しました。 // Zバッファに対して矩形の描画を行う int DrawBoxToZBuffer( int x1, int y1, int x2, int y2, int FillFlag, int WriteZMode ); // Zバッファに対して円の描画を行う int DrawCircleToZBuffer( int x, int y, int r, int FillFlag, int WriteZMode ); // Zバッファに対して画像の描画を行う int DrawGraphToZBuffer( int X, int Y, int GrHandle, int WriteZMode );  文章でご説明すると長くなってしまうので、とりあえず以下のサンプルをご覧になって 見てください。方向キーで操作できる円の周りだけZバッファの機能を使って青色に塗り 潰されないというプログラムです。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int x, y; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // Zバッファを使用する SetUseZBufferFlag( TRUE ); // キャラの初期座標は画面の中心 x = 320; y = 240; // メインループ while( ProcessMessage() == 0 ) { // キャラの移動 if( CheckHitKey( KEY_INPUT_LEFT ) ) x -= 8; if( CheckHitKey( KEY_INPUT_RIGHT ) ) x += 8; if( CheckHitKey( KEY_INPUT_UP ) ) y -= 8; if( CheckHitKey( KEY_INPUT_DOWN ) ) y += 8; // 画面のクリア ClearDrawScreen(); // 背景の描画(テキトーに四角で塗り潰すだけ) DrawBox( 0, 0, 160, 480, GetColor( 128,128,128 ), TRUE ); DrawBox( 160, 0, 320, 480, GetColor( 128, 0, 0 ), TRUE ); DrawBox( 320, 0, 480, 480, GetColor( 0,128, 0 ), TRUE ); DrawBox( 480, 0, 640, 480, GetColor( 0, 0,128 ), TRUE ); // キャラの描画(ただの円) DrawCircle( x, y, 32, GetColor(255,255,0), TRUE ); // 周りを見えなくする描画 { // キャラの位置に円形のマスクを描画 DrawCircleToZBuffer( x, y, 64, DX_WRITE_MASK ); // 画面全体を青で塗り潰す(マスクが掛かったところは書かれない) DrawBox( 0, 0, 640, 480, GetColor( 0,0,255 ), TRUE ); } // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } まずZバッファの機能を使うには SetUseZBufferFlag 関数に TRUE を渡して // Zバッファを使用する SetUseZBufferFlag( TRUE ); Zバッファを有効にします。  次に描画処理を行っても描画されない領域(マスク)を設定する為に DrawBoxToZBuffer, DrawCircleToZBuffer, DrawGraphToZBuffer の 何れかを使用します。(上記のサンプルでは DrawCircleToZBuffer を 使用しています)  通常の DrawBox 関数や DrawCircle 関数と違う点はまずZバッファに 対しての描画なので当然通常の画面には何も描画されないということと、 一番後ろの引数の WriteZMode の存在で、この引数には DX_ZWRITE_MASK 又は DX_ZWRITE_CLEAR を渡します。  DX_ZWRITE_MASK を渡した場合は描画した領域にマスクを設定し、  DX_ZWRITE_CLEAR を渡した場合は描画した領域のマスクを解除します。 (上記のサンプルでは操作できる円の周りにマスクを設定しています)  マスクを設定した後は、普通の描画関数で描画処理を行います。 すると、マスクを設定してある場所は描画されません。 (上記のサンプルではマスクを設定した後画面全体を青色に塗り潰す DrawBox を呼んでいます)  というわけで現在既にあるマスク機能と似ているのですが、 今までのマスク機能と比べると格段に高速であるということと、 ClearDrawScreen で設定したマスクがクリアされてしまうので 毎フレーム他の描画物と同じようにマスクを設定し直してやる 必要があるということと、ソフトウエアレンダリング機能の方には 実装していないので3D機能が使えない環境では利用できないという 違いがあります。  何か滅茶苦茶なご説明になってしまった気がしますので、ご不明な 点がありましたらご質問下さい。m(_ _;m
Re: SetDrawArea ( No.12 )
名前:DXビギナー 日時:2006/12/25 23:10

からすばさん、SweetBlack さんありがとうございます。 いろいろと試してみて良い方法を使っていきたいと思います。 管理人さんわざわざ作っていただきありがとうございます。 とりあえずサンプルを実行しようとしたところ以下のエラーが出ました。 ちゃんとバージョンの更新は行いました。 未定義の関数 'DrawCircleToZBuffer' を呼び出した(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 未定義のシンボル DX_WRITE_MASK(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
Re: SetDrawArea ( No.13 )
名前:管理人 日時:2006/12/27 17:35

 DXビギナーさんどうも、DXライブラリの管理人です。  申し訳ありません、サンプルプログラムの DrawCircleToZBuffer 関数の 引数の記述に間違いがありました。  正しくはこちらになります。m(_ _;m #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int x, y; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // Zバッファを使用する SetUseZBufferFlag( TRUE ); // キャラの初期座標は画面の中心 x = 320; y = 240; // メインループ while( ProcessMessage() == 0 ) { // キャラの移動 if( CheckHitKey( KEY_INPUT_LEFT ) ) x -= 8; if( CheckHitKey( KEY_INPUT_RIGHT ) ) x += 8; if( CheckHitKey( KEY_INPUT_UP ) ) y -= 8; if( CheckHitKey( KEY_INPUT_DOWN ) ) y += 8; // 画面のクリア ClearDrawScreen(); // 背景の描画(テキトーに四角で塗り潰すだけ) DrawBox( 0, 0, 160, 480, GetColor( 128,128,128 ), TRUE ); DrawBox( 160, 0, 320, 480, GetColor( 128, 0, 0 ), TRUE ); DrawBox( 320, 0, 480, 480, GetColor( 0,128, 0 ), TRUE ); DrawBox( 480, 0, 640, 480, GetColor( 0, 0,128 ), TRUE ); // キャラの描画(ただの円) DrawCircle( x, y, 32, GetColor(255,255,0), TRUE ); // 周りを見えなくする描画 { // キャラの位置に円形のマスクを描画 DrawCircleToZBuffer( x, y, 64, TRUE, DX_ZWRITE_MASK ); // 画面全体を青で塗り潰す(マスクが掛かったところは書かれない) DrawBox( 0, 0, 640, 480, GetColor( 0,0,255 ), TRUE ); } // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }
Re: SetDrawArea ( No.14 )
名前:DXビギナー 日時:2006/12/27 20:48

管理人さんありがとうございます。 新しいほうでしても無理なようです。 Dxlibのヘッダーにもしっかりとexternで宣言されてるのに、なぜか未定義になってしまいます(>_<) パソコンのせいでしょうか? 個人のミスだったらすみません。
Re: SetDrawArea ( No.15 )
名前:管理人 日時:2006/12/28 10:51

うーん、謎ですね・・・ お使いの開発環境は何でしょうか? (VisualC++ 2005 Express Edition や BCC Developer 等)
Re: SetDrawArea ( No.16 )
名前:DXビギナー 日時:2006/12/28 12:11

BCC Developerです。 何度も試しているのですが、問題がわからないです (>_<;)
Re: SetDrawArea ( No.17 )
名前:DXビギナー 日時:2006/12/28 12:29

すいません。サンプルのプログラムだけヘッダーが同じフォルダにあったみたいです。本当にすみません<(_ _)> あと一度自分のプログラムで以下のエラーが出ました。 Error: 外部シンボル '_errno' が未解決(C:\BORLAND\BCC55\BCCDEV1221\DXLIB\VORBISFILE_STATIC.LIB|vorbisfile が参照) vorbisfile_static.libだけをいままで使っていたものに戻すと解決しました。 実行結果はかなり前回にくらべ高速でした。 本当にわざわざ作っていただきありがとうございました。
Re: SetDrawArea ( No.18 )
名前:管理人 日時:2006/12/31 20:44

 正常に動作したようで何よりです。 > あと一度自分のプログラムで以下のエラーが出ました。 >  > Error: 外部シンボル '_errno' が未解決(C:\BORLAND\BCC55\BCCDEV1221\DXLIB\VORBISFILE_STATIC.LIB|vorbisfile が参照)  了解しました、確認してみます。

Page: 1 |