トップページ > 過去ログ > 記事閲覧
グラフィックのベタ塗り描画
名前:shin 日時: 2007/01/07 11:33

はじめまして、DXライブラリを使わせていただいておりますShinと申します。 キャラクター画像をベタ塗り(たとえば赤一色)で表示したいのですが、どうすればよいでしょうか? アクションゲームなどによくある、キャラがダメージを受けたときの演出などに使いたいのです。 もとから赤く塗りつぶした画像を用意すればいいのですが、アニメーションパターンがいくつもあり非効率かと思いまして。 赤の輝度のみ100%にしたADD描画で、何回か重ねて描画してみても、元画像の黒に近い部分はいつまでも黒く残ってしまいます。 何か他に方法があれば、ご教授いただけないでしょうか?よろしくお願いいたします。

Page: 1 |

Re: グラフィックのベタ塗り描画 ( No.1 )
名前:管理人 日時:2007/01/08 14:39

 shinさん始めまして、DXライブラリの管理人です。  キャラクター画像のベタ塗りは、お察しの通り現状の DXライブラリでは全く同じ形のベタ塗りされた画像を 用意するのが一般的な方法となります・・・が、最近追加 した、マスク機能を使用すると元のキャラクター画像だけで 一応実現可能です。  宜しければこちらをダウンロードして下さい。m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)  最近追加した機能とはZバッファを使ったマスクの機能で、 通常3Dレンダリングで遠くの物体が手前の物体に隠れるように するために使うZバッファを、マスクの機能として使おう、というものです。 (詳しくはこちらのスレッドの No.11 の書き込みをご覧下さい http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=313 )  その機能を使用してベタ塗りを行うサンプルが以下になります。 (画像をベタ塗りで一枚表示するだけのサンプルです。BetaNuri という関数で 画像のベタ塗り描画をしています) #include "DxLib.h" // ベタ塗り関数 void BetaNuri( int x, int y, int GrHandle, int Color ) { int w, h; // 画像のサイズを取得する GetGraphSize( GrHandle, &w, &h ); // Zバッファを有効にする SetUseZBufferFlag( TRUE ); // Zバッファに画像と同じ大きさのマスクを書き込む DrawBoxToZBuffer( x, y, x + w, y + h, TRUE, DX_ZWRITE_MASK ); // Zバッファに画像の形でマスクを刳り貫く DrawGraphToZBuffer( x, y, GrHandle, DX_ZWRITE_CLEAR ); // 画像の大きさのボックスを描画する(マスクが刳り貫かれているところしか塗りつぶされない) DrawBox( x, y, x + w, y + h, Color, TRUE ); // Zバッファを無効にする SetUseZBufferFlag( FALSE ); } // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GraphHandle; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // 画像の読み込み GraphHandle = LoadGraph( "test1.bmp" ); // 赤色でベタ塗り描画を行う BetaNuri( 0, 0, GraphHandle, GetColor( 255,0,0 ) ); // 裏画面の内容を表画面に反映 ScreenFlip(); // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }  Zバッファを使ったマスク機能のことが分からなくても BetaNuri 関数を 使用すればベタ塗り描画は出来ます。  ただ、このZバッファのマスク機能には以下の制限がありますので、 ご使用の際には注意してください。 ・3D機能を使用した場合のみ有効なので、ソフトウエアレンダリングモードでは使えない ・表画面が描画先になっている場合も無効 ・ClearDrawScreen で DrawGraphToZBuffer 等でZバッファに描画した内容がリセットされる
Re: グラフィックのベタ塗り描画 ( No.2 )
名前:shin 日時:2007/01/08 17:52

管理人様、迅速な対応ありがとうございます。 早速こちらで試させていただきました。 サンプルは見事ベタ塗り表示が成功したのですが、いくつか気づいた点がありました。 (1)読み込む画像がBMPの場合はうまくいきましたが、PNG画像の場合は透過色が機能しませんでした。   (完全に四角いベタ塗りになってしまう) (2)左右の反転表示は出来ないのでしょうか?    DrawGraphToZBuffer()で左右反転機能があれば実現できそうなのですが・・ 以上、2点です。 お手数をおかけして申し訳無いのですが、よろしくお願いいたします。
Re: グラフィックのベタ塗り描画 ( No.3 )
名前:管理人 日時:2007/01/12 11:33

 shinさんどうも、DXライブラリの管理人です。  ご報告、ご意見を元に変更を加えたバージョンをアップしましたので、 宜しければダウンロードしてください。m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして下さい) >(1)読み込む画像がBMPの場合はうまくいきましたが、PNG画像の場合は透過色が機能しませんでした。 >  (完全に四角いベタ塗りになってしまう)    αチャンネル付き画像の場合はα値0の部分のみZバッファに対する描画ピクセル とならないようにしてみました。(Zバッファに対する半透明描画というのは無いので、 α値が128等の、普通に描画した場合は半透明になる部分はベタ塗り対象となります) >(2)左右の反転表示は出来ないのでしょうか? >   DrawGraphToZBuffer()で左右反転機能があれば実現できそうなのですが・・  DrawTurnGraphToZBuffer を追加しました。
Re: グラフィックのベタ塗り描画 ( No.4 )
名前:shin 日時:2007/01/13 16:11

管理人さん、お忙しいところわざわざありがとうございます。こちらで試してみましたところ、どちらの機能もうまく動作しました。 早速使わせていただきます!ありがとうございました。

Page: 1 |