マスク関係関数
|
宣言 | int CreateMaskScreen( void ) ;
|
概略 | マスク画面を作成する
|
引数 |
なし |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
マスク情報を保持するためのマスク画面を作成します。
マスク画面とは
マスク画面とは普通のグラフィックを表示する画面のように存在し、
LoadMask 等で画像ファイルをマスクデータとして読みこんだマスクを
DrawMask , DrawFillMask 等でマスク画面に描画できます。
マスク画面はグラフィック画面とは違い黒と白の2つ(2色)の状態しかない
ピクセル(点)で構成されていて、マスク画面の状態はグラフィック画面に
描画作業を行う際に影響を及ぼします。
例えば画面座標(10,10)の位置のマスク画面での点の状態が白の時、グラフィ
ック画面に DrawPixel やその他の関数で描画しようとしても座標(10,10)の状態は
変化しません、逆に状態が黒ですと通常通り描画できることとなります。
( 尚、CreateMaskScreen の直後のマスク画面は黒で塗りつぶされています )
このマスク機能は画面のフェードインや、グラフィックの描画にアクセントを
付ける場合などに有効な機能といえます。
この関数を使用しなければマスク画面を使用できない主な理由には
マスク画面を使用するにはビデオメモリ(VRAM)をグラフィック画面
1つ分、メインメモリもグラフィック画面一つ分必要とするので、マスク
画面を必要としない場合にもこれだけの資源を占有されてしまうのは単純に
もったいないから、及び、マスク処理というのはかなりのCPUパワーを
必要とし、描画処理に多大な負担を与える事となるので使用しない時にも
常にマスク画面が存在するのは不都合極まりないからです。
|
|
サンプル
マスク画面を作成し、マスクデータを testMask.bmp から読みこみ、
マスク画面の左上に描画した後、画面を赤色で埋め尽くします。
するとマスクを描画した画面左上の部分だけ赤くなりません。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int MaskHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// マスク画面を作成します
CreateMaskScreen() ;
// マスクデータをロードします
MaskHandle = LoadMask( "testMask.bmp" ) ;
// ロードしたマスクデータを画面の左上に描画します
DrawMask( 0 , 0 , MaskHandle , DX_MASKTRANS_NONE ) ;
// 画面いっぱいに赤い四角を描きます
DrawBox( 0 , 0 , 640 , 480 , GetColor( 255 , 0 , 0 ) , TRUE ) ;
// キーの入力待ちをします
WaitKey() ;
// マスクデータを削除します
DeleteMask( MaskHandle ) ;
// マスク画面を削除します
DeleteMaskScreen() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int DeleteMaskScreen( void ) ;
|
概略 | マスク画面を削除する
|
引数 |
なし |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
CreateMaskScreen で作成したマスク画面を削除します。
以降マスク関係の機能は使用不可になりますので、再びマスクの機能を
使用したい場合は CreateMaskScreen 関数を使用します。
|
|
サンプル
CreateMaskScreen のサンプルを参照して下さい
|
宣言 | int LoadMask( char *FileName ) ;
|
概略 | マスクデータを画像ファイル(BMP.JPEG.PNG)から構築する
|
引数 |
char *FileName : マスクとしてロードする画像ファイル(BMP or
PNG or JPG ファイル)のパス |
戻り値 | -1以外:マスクデータハンドル |
| -1:エラー発生
|
解説 |
マスク画面に描画するためのマスクデータを FileName で指定した画像
ファイルから構築します。
画像ファイル中の真っ黒の部分と真っ白の部分をそれぞれマスクなし、
ありとして判別しマスクデータを構築します。この関数を使用すると
返り値としてマスクデータハンドル(識別番号)が返ってきます。この
ハンドルを使用して DrawMask や DrawFillMask 等の関数で構築した
マスクデータをマスク画面に書きこむことが出来ます。
|
|
サンプル
testMask.bmp を読みこみ画面上のランダムな場所に10回描画し、その後
画面全体を青い四角で描画する。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int MaskHandle ;
int i ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// マスク画面を作成します
CreateMaskScreen() ;
// マスクデータをロードします
MaskHandle = LoadMask( "testMask.bmp" ) ;
// ロードしたマスクデータを画面のランダムな位置に10個描画します
for( i = 0 ; i < 10 ; i ++ )
DrawMask( GetRand( 639 ) , GetRand( 479 ) , MaskHandle , DX_MASKTRANS_NONE ) ;
// 画面いっぱいに青い四角を描きます
DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 0 , 255 ) , TRUE ) ;
// キーの入力待ちをします
WaitKey() ;
// マスクデータを削除します
DeleteMask( MaskHandle ) ;
// マスク画面を削除します
DeleteMaskScreen() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 |
int LoadDivMask( char *FileName , int AllNum , int XNum , int YNum ,
int XSize , int YSize , int *HandleBuf ) ;
|
概略 | マスクデータを画像ファイル(BMP.JPEG.PNG)から分割構築する
|
引数 |
char FileName : マスクとしてロードする画像ファイルのパス
int AllNum : 画像を分割して読みこむ総数
int XNum : 画像をX軸に対して分割する数
int YNum : 画像をY軸に対して分割する数
int XSize : 分割された画像一つの幅
int YSize : 分割された画像一つの高さ
int *HandleBuf : 分割した画像一つ一つに割り当てられるマスクハンドル
(識別番号)を格納する int 型配列のアドレス |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
FileName で指定された画像ファイルを各パラメータに応じて分割し、
分割された画像一つ一つに LoadMask で得られるマスクハンドルと同様の
マスクハンドル(識別番号)を割り当てます。
LoadMask 関数と違い一度に得られるハンドルが複数あるので最後の
引数 HandleBuf の示す int 型配列に順次格納していきます。この int 型
配列は分割総数分だけ確保しておく必要があります。分割総数以下の数しか
ない配列をこの関数に渡した場合の動作保証はいたしかねますので気を付け
てください。
読みこみ、作られたマスクハンドルはHandleBufで指定したint型変数配列
には以下のような順にマスクハンドルが格納されていきます。
XNum = 4 ; YNum = 4 ; AllNum = 14 ;
AllNum = 14
|
|
サンプル
testMask2.bmp を 横 8 縦 2 、分割される一つの画像サイズを 8 × 16 、分割
画像の総数 16 として読みこみ、得られたマスクハンドルを配列に保存しその後
0から順番に画面全体にマスクグラフィックを描画しアニメーションさせます。
いちいち画面を消去するので裏画面を使用しています。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int MaskHandle[ 16 ] ;
int i ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 描画先画面を裏画面にします
SetDrawScreen( DX_SCREEN_BACK ) ;
// マスク画面を作成します
CreateMaskScreen() ;
// マスクデータをロードします
LoadDivMask( "testMask2.bmp", 16, 8, 2, 8, 16, MaskHandle ) ;
// マスクを画面全体にタイル上に描画しアニメーションさせます
for( i = 0 ; i < 16 ; i ++ )
{
// 画面初期化
ClearDrawScreen() ;
// 画面全体にタイル上描画
DrawFillMask( 0 , 0 , 640 , 480 , MaskHandle[ i ] ) ;
// 画面いっぱいに青い四角を描きます
DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 0 , 255 ) , TRUE ) ;
// 時間待ち
WaitTimer( 100 ) ;
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
// 最後の時間待ち
WaitTimer( 1000 ) ;
// マスクデータを削除します
for( i = 0 ; i < 16 ; i ++ )
{
DeleteMask( MaskHandle[ i ] ) ;
}
// マスク画面を削除します
DeleteMaskScreen() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int DrawMask( int x , int y , int MaskHandle , int TransMode ) ;
|
概略 | マスクデータをマスク画面に描画する
|
引数 |
int x , y : マスクを描画する座標(マスクの左上頂点と対応)
int MaskHandle : 描画するマスクのハンドル(識別番号)
int TransMode : マスクを描画する際の透過色のタイプ
DX_MASKTRANS_NONE. 透過色なし
DX_MASKTRANS_BLACK. マスク中の黒色部分を書き込まない
DX_MASKTRANS_WHITE. マスク中の白色部分を書き込まない
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
LoadMask . LoadDivMask 等の関数で構築したマスクをマスク画面に
描画します。描画する際 TransMode で指定したパラメータに応じて
透過色処理が行われます。
透過色処理とは DX_MASKTRANS_BLACK を指定すると描画するマスクの
白い部分のみがマスク画面に書きこまれ、黒い部分は書きこまれません。
そして DX_MASKTRANS_WHITE はその逆です。
DX_MASKTRANS_NONE はそれらのマスク処理を行わないパラメータとなり
ます。
DrawGraph . DrawExtendGraph のように TRUE . FALSE の2種類では
透過色の種類数に対応できないためにこのような形を取ることになりました。
|
|
サンプル
CreateMaskScreen 関数のサンプルを参照して下さい。
|
宣言 | int DrawFillMask( int x1 , int y1 , int x2 , int y2 , int MaskHandle ) ;
|
概略 | 指定のマスク画面領域を指定のマスクデータをタイル上に並べて埋める
|
引数 |
int x1 , y1 : 埋める領域を矩形とした場合の左上の頂点となる座標
int x2 , y2 : 埋める領域を矩形とした場合の右下+1の頂点となる座標
int MaskHandle : 埋めるのに使用するマスクのハンドル(識別番号) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
概略の通り、( x1, y1 )-( x2 - 1, y2 - 1 ) の占める範囲を MaskHandle が示すマスク
をタイル上に並べて埋めます。
この関数の機能は DrawMask 関数を複数回使用することで実現可能
なのですが、如何せん小さいマスクパターンを使用して広範囲を埋める
という機会が多いマスク処理において、 DrawMask 関数でそれを実現
するのは非常に不効率、過負荷がかかるので専用の高速に処理できる
関数をという次第で用意されました。
高速な代わりに DrawMask 関数のような透過処理は出来ませんので
ご了承下さい。
注…『なんで右下の頂点は「-1」してるの?』と思われた方はDrawBoxの解説を読んでみて下さい。
|
|
サンプル
(100,200)-(640,480)の領域を testMask.bmp から構築したマスクで
埋めます。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int MaskHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// マスク画面を作成します
CreateMaskScreen() ;
// マスクデータをロードします
MaskHandle = LoadMask( "testMask.bmp" ) ;
// (100,200)-(400,400)の領域にマスクをタイル上に並べて描画します
DrawFillMask( 100 , 200 , 400 , 400 , MaskHandle ) ;
// 画面いっぱいに緑の四角を描画
DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 255 , 0 ) , TRUE ) ;
// キー入力待ち
WaitKey() ;
// マスクを削除します
DeleteMask( MaskHandle ) ;
// マスク画面を削除します
DeleteMaskScreen() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int DeleteMask( int MaskHandle ) ;
|
概略 | マスクデータを削除
|
引数 |
int MaskHandle : 削除するマスクのハンドル(識別番号) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
LoadMask . LoadDivMask 関数等で構築したマスクを削除します。
削除した後は使えなくなります。それだけです。使わなくなった
マスクデータが占有しているメモリ資源を解放するために使用する
関数です。
因みに削除せずにソフトを終了した場合は終了時に自動的にマスクは
削除されます。
|
|
サンプル
DrawFillMask 関数のサンプルを参照して下さい
|
宣言 | int InitMask( void ) ;
|
概略 | マスクデータを初期化する
|
引数 |
なし |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
LoadMask . LoadDivMask 関数等で構築したマスクをすべて削除します。
構築したマスクすべてに DeleteMask 関数を使用した場合と同じです。
一度にすべてのマスクを削除したい場合に使用します。
|
|
サンプル
ありません
|
宣言 | int FillMaskScreen( int Flag ) ;
|
概略 | マスク画面を指定の色で塗りつぶす
|
引数 |
int Flag : マスク画面を白黒どちらの色で塗りつぶすかを決める引数。
( 0:黒 1:白 ) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
マスク画面を白、又は黒で塗りつぶします。グラフィック画面で言う
ところの ClearDrawScreen 関数に相当する関数です。
各色の効果の程は CreateMaskScreen 関数の解説を参照して下さい。
|
|
サンプル
DrawFillMask 関数で一部マスクを適用し、緑の四角を描画した後、
マスク画面を白で覆い尽くしてから再び緑の四角を描画します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int MaskHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// マスク画面を作成します
CreateMaskScreen() ;
// マスクデータをロードします
MaskHandle = LoadMask( "testMask.bmp" ) ;
// (100,200)-(400,400)の領域にマスクをタイル上に並べて描画します
DrawFillMask( 100 , 200 , 400 , 400 , MaskHandle ) ;
// 画面いっぱいに緑の四角を描画
DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 255 , 0 ) , TRUE ) ;
// キー入力待ち
WaitKey() ;
// マスク画面を白で覆い尽くします
FillMaskScreen( 1 ) ;
// もう一度画面いっぱいに緑の四角を描きます
DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 255 , 0 ) , TRUE ) ;
// キー入力待ち
WaitKey() ;
// マスクを削除します
DeleteMask( MaskHandle ) ;
// マスク画面を削除します
DeleteMaskScreen() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetUseMaskScreenFlag( int ValidFlag ) ;
|
概略 | マスク画面の有効の有無を変更
|
引数 |
int ValidFlag : マスク画面の有効状態( TRUE:有効 FALSE:無効 ) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
マスク画面の有効、無効を変更します。マスク処理は常に必要ではなく
且使用する時と使用しない時が短時間の内に切り替わる場合、いくらマスク
処理がマシンに過負荷を与えるとしてもその度に CreateMaskScreen 関数
DeleteMaskScreen 関数を使用するのは効率的ではありません。
ですので一時的にマスク画面の効果を取り下げたい場合にこの関数は
有効です。当然マスク画面を作成した直後の状態ではこの関数で言うところ
の TRUE(有効) 状態になっています。
|
|
サンプル
まず testMask.bmp を DrawFillMask 関数をもって画面全体に描画します。
その後緑の四角を画面全体に、以後マスク画面を無効にして同じことを、更に再び
マスク画面を有効にして再度緑の四角を画面に描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int MaskHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// マスク画面を作成します
CreateMaskScreen() ;
// マスクデータをロードします
MaskHandle = LoadMask( "testMask.bmp" ) ;
// 画面全体にマスクをタイル上に並べて描画します
DrawFillMask( 0 , 0 , 640 , 480 , MaskHandle ) ;
// 画面いっぱいに緑の四角を描画
DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 255 , 0 ) , TRUE ) ;
ScreenFlip() ;
// キー入力待ち
WaitKey() ;
// マスク画面を無効にします
SetUseMaskScreenFlag( FALSE );
// もう一度画面いっぱいに緑の四角を描きます
ClearDrawScreen() ; // 画面初期化
DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 255 , 0 ) , TRUE ) ;
ScreenFlip() ;
// キー入力待ち
WaitKey() ;
// マスク画面を有効にします
SetUseMaskScreenFlag( TRUE ) ;
// 再び一度画面いっぱいに緑の四角を描きます
ClearDrawScreen() ; // 画面初期化
DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 255 , 0 ) , TRUE ) ;
ScreenFlip() ;
// キー入力待ち
WaitKey() ;
// マスクを削除します
DeleteMask( MaskHandle ) ;
// マスク画面を削除します
DeleteMaskScreen() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int MakeMask( int Width , int Height ) ;
|
概略 | 空のマスクデータの作成
|
引数 |
int Width , Height : それぞれ作成する空マスクの幅と高さ |
戻り値 | -1以外:マスクデータハンドル |
| -1:エラー発生
|
解説 |
LoadMask , LoadDivMask 等で構築する事の出来るマスクデータの
空っぽの何もデータのないバージョンのマスクを作成し、そのハンドル
(識別番号)を得ます。
用途としては SetDataToMask 関数で動的にプログラム中に作成した
マスクデータをセットして使用する場合などがあります。
|
|
サンプル
MakeMask 関数で 16 × 16 の大きさの空マスクを作成し、プログラム中で
動的に作成、変更を加えたマスクデータを SetDataToMask 関数 で順次転送、
そしてそのマスクデータを持ってマスク画面を埋め尽くし、マスクの結果を
確認するために画面いっぱいに白い四角を描画しています。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int MaskHandle ;
unsigned char MaskData[ 16 ][ 16 ] ;
int i , j ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 描画先を裏画面にします
SetDrawScreen( DX_SCREEN_BACK ) ;
// マスク画面を作成します
CreateMaskScreen() ;
// 空のマスクを作成します
MaskHandle = MakeMask( 16 , 16 ) ;
// マスクデータを白で埋めます
for( i = 0 ; i < 16 ; i ++ )
for( j = 0 ; j < 16 ; j ++ )
MaskData[ i ][ j ] = 0xff ;
// ループ
for( i = 0 ; i < 16 ; i ++ )
{
// 画面を初期化
ClearDrawScreen() ;
// マスクのデータを一部変更
for( j = 0 ; j < 16 ; j ++ )
MaskData[ i ][ j ] = 0 ;
// マスクにデータをセット
SetDataToMask( 16 , 16 , MaskData , MaskHandle ) ;
// マスク画面をセットしたマスクデータで埋めます
DrawFillMask( 0 , 0 , 640 , 480 , MaskHandle ) ;
// 白の四角を画面全体に描画します
DrawBox( 0 , 0 , 640 , 480 , GetColor( 255 , 255 , 255 ) , TRUE ) ;
// 裏画面の内容を表画面に反映させます
ScreenFlip() ;
// 時間待ち
WaitTimer( 100 ) ;
}
// マスクを削除します
DeleteMask( MaskHandle ) ;
// マスク画面を削除します
DeleteMaskScreen() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int GetMaskSize( int *WidthBuf , int *HeightBuf , int MaskHandle ) ;
|
概略 | マスクデータの大きさを得る
|
引数 |
int *WidthBuf , *HeightBuf : それぞれマスクデータの幅と高さを
保存するint 型変数のアドレス
int MaskHandle : サイズを取得するマスクハンドル(識別番号)
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
LoadMask , LoadDivMask 等の関数で構築したマスクデータの
サイズを得ます。主な用途はありません。
|
|
サンプル
特になし
|
宣言 |
int SetDataToMask( int Width , int Height ,
void *MaskData , int MaskHandle ) ;
|
概略 | マスクのデータをマスクデータ領域に転送する
|
引数 |
int Width ,Heiht : それぞれマスクデータの幅と高さ
void *MaskData : マスクのデータがあるアドレス
int MaskHandle : マスクのデータを転送する先となるマスクの
ハンドル(識別番号)
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
LoadMask , LoadDivMask , MakeMask 関数で構築したマスクの
データを指定のデータに置き換えます。
主な用途としてはマスクデータを画像ファイルから読みこむの
ではなく動的に生成して使用したい場合などが上げられます。
因みにWidth , Height が示すサイズは転送先となるマスクと
同サイズでなければエラーとなります。わざわざ引数として取る
のはプログラマー側の確認を取るという意味があります。
後このようなマスクのデータを直接マスク画面に転送する
DrawMaskToDirectData 関数がありますが、これは同じデータで
複数回描画する場合には SetDataToMask 関数で通常のマスクデー
タに転送してから DrawMask 等で描画したほうが速度面で有利と
なりますので注意してください。速度面での違いが起こるのは
DrawMaskToDirectData 関数ですと描画毎にデータの変換をする
必要があるからです。
データ形式
マスクのデータ形式としては 1ドット = 1 バイト、unsigned
char 型の変数一つで1ドットを表します。そしてその値が0の
場合は黒に、255(0xff)の場合は白と解釈されます。つまり幅32
高さ16のマスクデータ領域を用意し、マスクデータ上のX軸上15
Y軸上10のドットを白にしたいときは次のようになります。
unsigned char MaskData[16][32] ;
MaskData[10][15] = 255 ;
普段X,Yを指定するときとはXとYの位置関係が逆になるので
注意してください。
|
|
サンプル
MakeMask 関数のサンプルを参照して下さい
|
宣言 |
int DrawMaskToDirectData( int x , int y ,
int Width , int Height ,
void *MaskData , int TransMode ) ;
|
概略 | マスクのデータをマスク画面に直接描画する
|
引数 |
int x ,y : マスクデータの描画先のマスク画面上の座標
int Width , Height : 描画するマスクデータの幅と高さ
void *MaskData : マスクのデータが格納されているアドレス
int TransMode : 描画時の透過色モード
DX_MASKTRANS_NONE . 透過色なし
DX_MASKTRANS_BLACK . マスク中の黒色部分を透過色
DX_MASKTRANS_WHITE . マスク中の白色部分を透過色 |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
マスク画面上の( x , y )の座標を描画領域の左上頂点 として
MaskData の示す先に格納されているマスクデータを直接マスク
画面に転送します。
要は DrawMask 関数のマスクハンドルの代わりに直接データを
渡すタイプです。
透過色処理とは DX_MASKTRANS_BLACK を指定すると描画するマスクの
白い部分のみがマスク画面に書きこまれ、黒い部分は書きこまれません。
そして DX_MASKTRANS_WHITE はその逆です。
DX_MASKTRANS_NONE はそれらのマスク処理を行わないパラメータとなり
ます。
主に動的にマスクデータを用意し、複数回そのデータで描画
しない場合に有効です。複数回描画を行う場合は MakeMask 関数
で空のマスクを作成し、そこにマスクのデータを転送した後
作成したマスクのハンドルをもって描画したほうが高速です。
データ形式に付いては SetDataToMask 関数の解説を参照して
下さい。
|
|
サンプル
マスクのデータを直接マスク画面の左上に転送し、そのつど
画面全体に白い四角を描画し、マスクの状態を確認します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
unsigned char MaskData[ 16 ][ 16 ] ;
int i , j ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 描画先を裏画面にします
SetDrawScreen( DX_SCREEN_BACK ) ;
// マスク画面を作成します
CreateMaskScreen() ;
// マスクデータを白で埋めます
for( i = 0 ; i < 16 ; i ++ )
for( j = 0 ; j < 16 ; j ++ )
MaskData[ i ][ j ] = 0xff ;
// ループ
for( i = 0 ; i < 16 ; i ++ )
{
// 画面を初期化
ClearDrawScreen() ;
// マスクのデータを一部変更
for( j = 0 ; j < 16 ; j ++ )
MaskData[ i ][ j ] = 0 ;
// マスクのデータを直接画面に転送
DrawMaskToDirectData( 0 , 0 , 16 , 16 , MaskData , DX_MASKTRANS_NONE ) ;
// 白の四角を画面全体に描画します
DrawBox( 0 , 0 , 640 , 480 , GetColor( 255 , 255 , 255 ) , TRUE ) ;
// 裏画面の内容を表画面に反映させます
ScreenFlip() ;
// 時間待ち
WaitTimer( 100 ) ;
}
// マスク画面を削除します
DeleteMaskScreen() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 |
int DrawFillMaskToDirectData( int x1, int y1, int x2, int y2,
int Width, int Height, void *MaskData ) ;
|
概略 | マスクのデータをタイル上に並べた形で直接マスク画面全体に描画する
|
引数 |
int x1, y1: データを埋め尽くす領域を矩形とした場合の左上の頂点座標
int x2, y2: データを埋め尽くす領域を矩形とした場合の右下+1の頂点座標
int Width , Height : 描画するマスクデータの幅と高さ
void *MaskData : マスクのデータが格納されているアドレス |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
DrawFillMask 関数の直接データを渡すバージョンです。
( x1, y1 )-( x2 - 1, y2 - 1 ) の占める範囲を Width , Height, MaskData が示す
マスクデータをタイル上に並べて埋めます。
マスクのデータ形式に付いては SetDataToMask 関数の解説を参照
してください。
注…『なんで右下の頂点は「-1」してるの?』と思われた方はDrawBoxの解説を読んでみて下さい。
|
|
サンプル
ダイレクトにマスク画面に動的に生成した 16 × 16 の大きさのマスク
データを画面全体に描画し、その結果を確認するために描画毎に画面全体に
白い四角を描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
unsigned char MaskData[ 16 ][ 16 ] ;
int i , j ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 描画先を裏画面にします
SetDrawScreen( DX_SCREEN_BACK ) ;
// マスク画面を作成します
CreateMaskScreen() ;
// マスクデータを白で埋めます
for( i = 0 ; i < 16 ; i ++ )
for( j = 0 ; j < 16 ; j ++ )
MaskData[ i ][ j ] = 0xff ;
// ループ
for( i = 0 ; i < 16 ; i ++ )
{
// 画面を初期化
ClearDrawScreen() ;
// マスクのデータを一部変更
for( j = 0 ; j < 16 ; j ++ )
MaskData[ i ][ j ] = 0 ;
// マスクのデータを直接画面全体に転送
DrawFillMaskToDirectData( 0 , 0 , 640 , 480 , 16 , 16 , MaskData ) ;
// 白の四角を画面全体に描画します
DrawBox( 0 , 0 , 640 , 480 , GetColor( 255 , 255 , 255 ) , TRUE ) ;
// 裏画面の内容を表画面に反映させます
ScreenFlip() ;
// 時間待ち
WaitTimer( 100 ) ;
}
// マスク画面を削除します
DeleteMaskScreen() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
戻る
|