ウエイト関係の関数

宣言int WaitTimer( int WaitTime ) ;

概略指定の時間だけ処理をとめる

引数WaitTime : 止める時間(ミリ秒単位)
戻り値 0:成功
 −1:エラー発生

解説  WaitTimeで指定した分だけ処理を止めます。ただそれだけです。 なお止まっている間は常にProcessMessage』関数を実行 しています。

サンプル

 ソフトの終了を3秒間待つ

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // ここで3秒まつ WaitTimer( 3000 ) ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int WaitVSync( int SyncNum ) ;

概略ディスプレイの垂直同期信号を指定回数待つ

引数SyncNum : 垂直同期信号を待つ回数
戻り値 0:成功
 −1:エラー発生

解説  ディスプレイの垂直同期信号を指定回数待ちます。
 簡単に説明しますとディスプレイの詳細で設定の出来る『リフレッシュレート』で1秒間を割った時間が回数1回につき待つ時間の長さです(正確には違いますが)。
 ともあれこの関数は現在ではあまり使う機会もないと思うので垂直同期信号が何ぞや、と言うことについて詳しく説明はしません。
 なお止まっている間は常に『ProcessMessage』関数を実行しています。

サンプル

 垂直同期信号を60回待ちます

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // ここで垂直同期信号を60回待つ WaitVSync( 60 ) ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }



宣言int WaitKey( void ) ;

概略キーの入力待ち

引数なし
戻り値入力されたキーのコード(『CheckHitKey』関数を参照)

解説  何かキーが押されるまで待ちます。それだけです。
なお止まっている間は常に『ProcessMessage』関数を実行 しています。

サンプル

 何かキーが押されるまで待つ

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // ここでキー入力を待つ WaitKey() ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。







時間関係の関数

宣言int GetNowCount( void ) ;

概略ミリ秒単位の精度を持つカウンタの現在値を得る

引数なし
戻り値Windowsが起動してから経過時間をミリ秒単位であらわした値

解説  すぐ上に書いてありますが、Windows が起動してから経過時間をミリ秒単位であらわした値が返ってきます。この関数の存在意義は時間の計測にあります。特定の時間を取得する事はこの関数では出来ません。

サンプル

 6秒間待つ

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int StartTime ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 現在経過時間を得る StartTime = GetNowCount() ; // 計測開始から6秒が過ぎるまでループ while( GetNowCount() - StartTime < 6000 ) { // メッセージ処理 if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループから抜ける } } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言LONGLONG GetNowHiPerformanceCount( void ) ;

概略GetNowCountの高精度バージョン

引数なし
戻り値Windowsが起動してから経過した時間をマイクロ秒単位で表した値

解説  GetNowCount の精度がミリ秒からマイクロ秒に向上した関数です。が、注意しなければならないのが戻り値が int型 変数の2倍の桁を持つ LONGLONG型 だと言うことです。それ以外は GetNowCount関数 と同じです。用途は同じく時間の計測ですが、より精度の高い計測を行う際に使用します

サンプル

 6秒間待つ

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { LONGLONG StartTime ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 現在経過時間を得る StartTime = GetNowHiPerformanceCount() ; // 計測開始から6秒が過ぎるまでループ while( GetNowHiPerformanceCount() - StartTime < 6000000 ) { // メッセージ処理 if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループから抜ける } } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int GetDateTime( DATEDATA *DateBuf ) ;

概略現在時刻を取得する

引数DateBuf : DXライブラリ独自のDATEDATA構造体のポインタ
戻り値 0:成功
 −1:エラー発生

解説  DXライブラリ独自の DATEDATA 構造体に現在時刻を格納します。 DATEDATA 構造体は以下のようなメンバ変数で成り立っています。

int Year ; // 年
int Mon ; // 月
int Day ; // 日
int Hour ; // 時間
int Min ; // 分
int Sec ; // 秒


サンプル

 現在時刻を取得する

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { DATEDATA Date ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 現在時刻を得る GetDateTime( &Date ) ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。







乱数取得関数

宣言int GetRand( int RandMax ) ;

概略乱数を取得する

引数RandMax : 取得する乱数の最大値
戻り値0 から RandMax で指定した数値のどれかの数値

解説  乱数を得ます。この関数は 0 から RandMax で指定した数値のどれかの数値を返します。

サンプル

 ランダムな座標で1000個の点を描画します

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int i ; int Cr ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 白色の値を取得 Cr = GetColor( 255 , 255 , 255 ) ; // 1000個の点を描く for( i = 0 ; i < 1000 ; i ++ ) { // ランダムな位置に点を描く(『GetRand』を使用) DrawPixel( GetRand( 639 ) , GetRand( 479 ) , Cr ) ; } WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SRand( int Seed ) ;

概略乱数の初期値を設定する。

引数int Seed : 乱数の初期化値
戻り値 0:成功
 −1:エラー発生

解説  GetRand 関数で取得する乱数の初期値を設定します。
 コンピューター上の乱数というものはすべて疑似的なものであり、 結果的には計算で算出するので初期値が同じであれば初期値を 設定した後に取得できる乱数は常に同じものとなります。


 例 初期値を0にした時の乱数値

1番目:18     2番目:611
 (これはいつ初期値を設定してもかならずこの結果になる)

 なので、普通ゲームソフトなどでは毎回違う結果が出るように ソフトの起動時にその時のパソコンが保持している日時データなどを 元に初期値を設定したりします。
 DXライブラリでは標準でこの処理を行うのですが、時に自分で 初期値を明示的に設定したい時などがあります。

 この関数はそんな時のためにあります。

サンプル

 ありません





ウインドウモード・フルスクリーンモード変更用関数

宣言int ChangeWindowMode( int Flag ) ;

概略ウインドウモード・フルスクリーンモードの変更を行う

引数 Flag : ウインドウモードで起動するかのフラグ情報
     TRUE : ウインドモードで起動
     FALSE : フルスクリーンモードで起動(デフォルト)
戻り値 DX_CHANGESCREEN_OK   : モードの移行は成功した
DX_CHANGESCREEN_RETURN : モードの変更は失敗し、元の画面モードに戻された
DX_CHANGESCREEN_DEFAULT : モードの変更は失敗しデフォルトの画面モードに変更された
 
解説  ソフトをウインドウモードで実行するか、フルスクリーンモードで実行するのかを変更します。 一般にはウインドウモードよりフルスクリーンで実行する方が動作条件は良くなるのですが、 ソフトのデバッグ作業をフルスクリーンで行うのはどうしても困難なので、 制作中のみウインドウモードで実行し、完成バージョンではフルスクリーン実行にする、 等の用途に使えます。
 もしソフト中でウインドウモードとフルスクリーンモードの変更が出来るようにする場合はフルスクリーンとウインドウモードとのカラービット数の違いに気を付ける必要があります。 特に256色モードで実行するソフトでの配布版での変更は望ましくありません。

<注意>
 この関数を実行するとロードしたすべてのグラフィックハンドルと3Dモデルハンドル、 作成したフォントハンドルは自動的に削除され、SetDrawArea, SetDrawScreen, SetDrawMode, SetDrawBlendMode, SetDrawBright 等の描画に関係する設定を行う関数による設定も全て初期状態に戻りますので、 画面モード変更後 LoadGraph関数や CreateFontToHandle関数等で再度ハンドルを作成し直し、 描画可能領域、描画対象画面等の各種描画系の設定も再度行う必要があります。

次にフルスクリーンモードとウインドウモードの違いを示します

FullWindow
マウスカーソル
初期状態
表示されない表示される
ScreenFlip関数 表画面と裏画面を
交換する
裏画面の内容を
表画面にコピーする
画面モード SetGraphMode関数
変更可能、及び標準で
640×480 16bit Color
SetGraphMode関数での
変更不可、常に起動時の
デスクトップの画面モードとなる


追記
 なおこの関数を DxLib_Init 関数を使用する前に呼び出すことにより初期状態を変更することが出来ます。

サンプル

 ウインドウモード起動して文字列を描画する

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Cr ; // ウインドウモードに変更 ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 白色の値を取得 Cr = GetColor( 255 , 255 , 255 ) ; // 文字列の描画 DrawString( 250 , 240 - 16 , "Hello C World!" , Cr ); WaitKey() ; // キーの入力待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }



宣言int SetMainWindowText( char *WindowText ) ;

概略 ウインドウのタイトルを変更する

引数 char *WindowText : 変更後のタイトルの文字列が入った先頭アドレス
戻り値 0:成功
 −1:エラー発生

解説  ウインドウのタイトルとはウインドウのシステムバー(×ボタンや縮小 ・拡大ボタンがある一番上のバー)の左端に表示されている文字列で、 この関数はこの文字列を変更する時に使用します。

 尚、この関数を DxLib_Init 使用前に呼び出すことにより、初期状態の タイトルを設定することが出来ます。

サンプル

 ウインドウモードで起動し、ウインドウのタイトルを『test』に変更して、ボタンが押されるまで待ちます

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // タイトルを test に変更 SetMainWindowText( "test" ) ; // ウインドウモードに変更 ChangeWindowMode( TRUE ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // エラーが起きたら直ちに終了 // キーの入力待ち(『WaitKey』を使用) WaitKey() ; // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }



宣言int SetWindowIconID( int ID ) ;

概略 ウインドウのアイコンを変更する

引数 int ID : 変更後のアイコンのID
戻り値 0:成功
 −1:エラー発生

解説  この関数は、ソフトを起動したときにタスクバーの左端やウインドウの 左上端に表示されるアイコンを変更する時に使用します。
 まず、ソフトに専用のアイコンを組み込む方法については本サイトの ミニテクコーナーの『自作ソフトにオリジナルアイコンを付ける』をご参照下さい。
 ここではアイコンが既にソフトに組み込まれていることを前提で進めます。

Borland C++ の場合
 まず、ミニテクコーナーで作成した Resource.rc を開いてください。
 この中で、『MAINICON』と書かれている部分がありますが、実はここは 数値でも問題がありません。というわけで、MAINICON の代わりに 101 や 102 等の適当な数値に置き換えて下さい。
 そして次に SetWindowIconID に先ほど『MAINICON』の代わりに入力した 数値を引数として渡して下さい。恐らくそれでウインドウのアイコンが 変わるはずです。

VisualC++ の場合
 ミニテクコーナーの一連の作業を行った場合、VisualC++ はプロジェクトの フォルダに勝手に『resource.h』というヘッダファイルを作成します。
 このファイルを開くと、色々書かれていますが、その中で

#define IDI_ICON1  101

 等のような定義が何処かにされていると思いますが、正にこれが SetWindowIconID の引数として渡すべきアイコンのIDとなります。
 なので、徐に resource.h をインクルードして、SetWindowIconID にこのIDを渡せばウインドウのアイコンが変わります。


 尚、この関数を DxLib_Init より前に呼び出すことにより、初期状態の アイコンを変更することが出来ます。

サンプル

 ありません。



宣言int SetWindowSizeChangeEnableFlag( int Flag ) ;

概略 ウインドウモードの時にウインドウのサイズを自由に変更出来るようにするかどうかを設定する

引数 int Flag : ウインドウのサイズを変更出来るようにするかどうかのフラグ情報
      TRUE : 変更出来るようにする
      FALSE : 変更出来ないようにする(デフォルト)
戻り値 0:成功
 −1:エラー発生

解説  この関数はウインドウモードでソフトを動かしている時に ウインドウの枠を左クリックで抓まんで、ウインドウのサイズを自由に 変更できるようにするかどうかを設定する関数です。
 TRUE を渡すと変更できるようになり、FALSE を渡すと変更出来ないように なります。(起動時には FALSE の状態になっています)

《注意》
 この関数に TRUE を渡してサイズを自由に変更出来るようにした時は、 SetDrawScreen 関数に DX_SCREEN_BACK を渡して、 絶対に表画面に直接描画しないようにして下さい。(表画面に直接描画すると正しい描画結果が得られません)

サンプル

 ありません。



宣言int SetWindowSizeExtendRate( double ExRate ) ;

概略 ウインドウモードの時のウインドウの大きさと描画画面の大きさの比率を設定する

引数 double ExRate : ウインドウのサイズと描画画面のサイズの比率
戻り値 0:成功
 −1:エラー発生

解説  ウインドウモード時のウインドウの大きさをゲーム画面の ExRate 倍にします。
 ゲーム画面のサイズが小さく、ウインドウモードにすると迫力が無い、という時に使用します。

《注意》
 この関数に 1.0 以外の値を渡した場合は SetDrawScreen 関数に DX_SCREEN_BACK を渡して、 絶対に表画面に直接描画しないようにして下さい。(表画面に直接描画すると正しい描画結果が得られません)

サンプル

 ありません。




通信関係

宣言int ConnectNetWork( IPDATA IPData, int Port ) ;

概略他マシンに接続する

引数 IPDATA IPData : 接続先マシンのIPアドレスデータ
int Port : 通信に使用するポート番号
戻り値0以上:確立した接続を示すネットワークハンドル(int型の識別値)
 −1:エラー発生

解説   LANやインターネット等で繋がっている他のマシンと通信状態を確立します。

 当たり前ですが、相手と自分がともにインターネットをしていないと接続を確立することは出来ません。 (LANなら相手のマシンと繋がっていないとだめです)

 接続先のマシンはIPアドレスを使って指定します。 IPアドレスとはネットワーク環境に接続しているマシンすべてに割り当てられる電話番号みたいなもので、 電話回線を使ったネット環境ではインターネットをする度にIPアドレスは変動します。(LANなら固定です)

 ですのでまず接続したい相手のマシンのIPアドレスを知る必要がありますが、 相手のマシンのIPアドレスを自分で調べることは出来ないので、 接続したい相手の方に自分のマシンのIPアドレスを調べてもらう必要があります。

   調べ方はインターネットネットワークの場合は調べるためのソフトなどがフリーソフトとして公開されていますのでそれを使って調べます。

 LANの場合はコントロールパネルのネットワークを開いて、 リストの中のTCP/IPをダブルクリックすればそこにIPアドレスが載っています。

 ちなみにIPアドレスとは以下のようなものです

 IPアドレスの例 192.168.5.226

 4つの数値が『.』で区切られている、という形であらわされます。

 次に相手のマシンは接続されるのを待つ状態にしなくてはなりません、 接続を待つ状態にするには PreparationListenNetWork関数を実行ます、 この関数は引数のないただ実行するだけの関数です。

 さて、IPアドレスがわかり、相手のマシンが接続を待つ状態になったらいよいよ ConnectNetWork 関数で相手に接続することが出来ます。
 接続には接続先のマシンのIPアドレスと通信に使用するポート番号をDXライブラリの構造体の IPDATA 構造体を使って指定します。  IPDATA 構造体の中には以下のデータが入っています。

{
  unsigned char d1 ;
  unsigned char d2 ;
  unsigned char d3 ;
  unsigned char d4 ;
}

 1バイトデータ型である unsigned char 型の変数が4つ、ピンときた方もいると思いますが、 そうです、IPアドレスが『 192.168.5.226 』だった場合 IPDATA 構造体には以下のようにデータを代入します。



IPDATA ip ;

ip.d1 = 192 ;
ip.d2 = 168 ;
ip.d3 = 5 ;
ip.d4 = 226 ;

 おわかりいただけたでしょうか?要はIPアドレスの左から順にd1.d2.d3.d4に対応しているのです。 こうして代入したIPデータを ConnectNetWork関数に渡します。
 もう一つの引数 Port ですが、こちらは通信に使用するポート番号です、 ポート番号は 0 から 65535 までの値を指定することができますが、 メール送受信用に使われている番号( 465 )やWebサイトの情報の送受信に使用されている番号( 80 )など、 使用すると他のソフトの挙動に支障をきたす番号が沢山ありますので、 使用しても問題ない番号はインターネットで調べてみてください。

 これで接続が成功したらネットワークハンドルが返ってきます。 ネットワークハンドルとは int 型の識別番号値で、データを送信するときや、 通信を終了するときなどに相手のマシンを決定するときに使いますので保存しておいてください。 接続に失敗したら−1が返ります。(ハンドルは0以上の数値です)

 接続が終わったらこちらは接続されたかすぐわかりますが、相手のマシンは 接続されたことを知りませんので、接続を待っているマシンは一定周期で GetNewAcceptNetWork関数 を使って誰かが接続してきたか調べる必要が あります。

 接続が完了したら後はデータを送信したり、受信したりするだけです。  それらについてはそれぞれの関数の解説を参照してください。

サンプル

 接続を確立して相手に『繋がったか〜!?』という文字列を送り、相手は届いたら 『繋がったぞ〜!!』という文字列を送り返してきます。


-- 接続側プログラム ----------------------------------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char StrBuf[ 256 ] ; // データバッファ IPDATA Ip ; // 接続用IPアドレスデータ int NetHandle ; // ネットワークハンドル int DataLength ; // 受信データ量保存用変数 if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // IPアドレスを設定( ここにある4つのIP値は仮です ) Ip.d1 = 192 ; Ip.d2 = 168 ; Ip.d3 = 5 ; Ip.d4 = 227 ; // 通信を確立 NetHandle = ConnectNetWork( Ip, 9850 ) ; // 確立が成功した場合のみ中の処理をする if( NetHandle != -1 ) { // データ送信 NetWorkSend( NetHandle , "繋がったか〜!?" , 17 ) ; // データがくるのを待つ while( !ProcessMessage() ) { // 取得していない受信データ量を得る DataLength = GetNetWorkDataLength( NetHandle ) ; // 取得してない受信データ量が0じゃない場合はループを抜ける if( DataLength != 0 ) break ; } // データ受信 NetWorkRecv( NetHandle , StrBuf , DataLength ) ; // データをバッファに取得 // 受信したデータを描画 DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ; // キー入力待ち WaitKey() ; // 接続を断つ CloseNetWork( NetHandle ) ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } -- 接続待ち側プログラム ----------------------------------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char StrBuf[ 256 ] ; // データバッファ int NetHandle , LostHandle ; // ネットワークハンドル int DataLength ; // 受信データ量保存用変数 IPDATA Ip ; // 接続先IPアドレスデータ if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 接続してくるのを待つ状態にする PreparationListenNetWork( 9850 ) ; // 接続してくるかESCキーが押されるまでループ NetHandle = -1 ; while( !ProcessMessage() && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 新しい接続があったらそのネットワークハンドルを得る NetHandle = GetNewAcceptNetWork() ; if( NetHandle != -1 ) break ; } // 接続されていたら次に進む if( NetHandle != -1 ) { // 接続の受付を終了する StopListenNetWork() ; // 接続してきたマシンのIPアドレスを得る GetNetWorkIP( NetHandle , &Ip ) ; // データが送られて来るまで待つ while( !ProcessMessage() ) { // 取得していない受信データ量が0以外のときはループから抜ける if( GetNetWorkDataLength( NetHandle ) != 0 ) break ; } // データ受信 DataLength = GetNetWorkDataLength( NetHandle ) ; // データの量を取得 NetWorkRecv( NetHandle , StrBuf , DataLength ); // データをバッファに取得 // 受信したデータを描画 DrawString( 0 , 0 , StrBuf , GetColor( 255 , 255 , 255 ) ) ; // 受信成功のデータを送信 NetWorkSend( NetHandle , "繋がったぞ〜!!" , 17 ) ; // 相手が通信を切断するまで待つ while( !ProcessMessage() ) { // 新たに切断されたネットワークハンドルを得る LostHandle = GetLostNetWork() ; // 切断された接続が今まで通信してた相手だった場合ループを抜ける if( LostHandle == NetHandle ) break ; } // 切断確認表示 DrawString( 0 , 16 , "切断しました" , GetColor( 255 , 255 , 255 ) ) ; // キー入力待ち WaitKey() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }




宣言 int CloseNetWork( int NetHandle ) ;

概略接続を終了する

引数 int NetHandle : 接続を終了するネットワークハンドル
戻り値 0:成功
 −1:エラー発生

解説  ConnectNetWork関数で確立した接続状態を終了し、データの送受信を 終了します。
 ネットワーク送受信に関する説明はConnectNetWork関数の解説を参照 してください。

サンプル

 ConnectNetWork関数のサンプルを参照して下さい



宣言 int PreparationListenNetWork( int Port ) ;

概略接続を受けられる状態にする

引数 int Port : 通信に使用するポート番号
戻り値 0:成功
 −1:エラー発生

解説  自分のマシンが他マシンからのConnectNetWork関数によって接続を確立出来る状態にします。
 この関数は別に接続を受けるまで関数から出て来ないわけでは無いので、この関数を使用後、接続があったかどうかを、 そして新たに確立した接続を示すネットワークハンドルを得るためにGetNewAcceptNetWork関数を使用する必要があります。
 取得したネットワークハンドルはConnectNetWork関数で取得できるものと区別はありませんので接続を終了したい場合はCloseNetWork関数で切断することが出来ます。

 引数の Port では通信に使用するポート番号を指定します、この番号は ConnectNetWork関数で接続を試みる側が指定するポート番号と一致している必要がありますので注意してください。

サンプル

 ConnectNetWork関数のサンプルを参照して下さい。



宣言 int StopListenNetWork( void ) ;

概略接続を受け付けている状態を解除する

引数なし
戻り値 0:成功
 −1:エラー発生

解説  PreparationListenNetWork関数によって接続受けつけ状態になったマシンの 受けつけ状態を解除します。以降ConnectNetWork関数による通信接続要求には 反応しなくなります。

サンプル

 ConnectNetWork関数のサンプルを参照して下さい



宣言 int NetWorkSend( int NetHandle, void *Buffer, int Length ) ;

概略データを送信する

引数 int NetHandle : データを送信する接続先を示すネットワークハンドル
void *Buffer : 送信するデータがあるアドレス
int Length  : 送信するデータの量(バイト単位)
戻り値 0:成功
 −1:エラー発生

解説  ConnectNetWork関数GetNewAcceptNetWork関数によって取得 したネットワークハンドルの示す接続先マシンに Buffer の示すアドレスから Length の バイト数分だけデータを送信します。

 送られたデータは相手の受信データ一時記憶バッファに蓄えられ、NetWorkRecv 関数によって晴れて相手マシンの処理プログラムに渡されることとなります。

サンプル

 ConnectNetWork関数のサンプルを参照して下さい



宣言 int GetNetWorkDataLength( int NetHandle ) ;

概略受信データ一時記憶バッファに溜まっているデータの量を得る

引数 int NetHandle : 受信データの量を調べたい接続を示すネットワークハンドル
戻り値  0以上:受信データ一時記憶バッファに溜まっているデータの量(バイト単位)
 −1:エラー発生

解説  相手マシンがNetWorkSend関数を使用して送信してきたデータは 自機の受信データ一時記憶バッファに格納されます。この関数は NetHandle が 示す接続先マシンが送ってきたデータを溜める一時記憶バッファに溜まっている データの量を得ます。(すごいわかりにくいですね)

 因みにNetWorkRecv関数によってバッファから読み出されたデータは バッファから順次消去されます。

サンプル

 ConnectNetWork関数のサンプルを参照して下さい



宣言 int GetNetWorkSendDataLength( int NetHandle ) ;

概略未送信のデータの量を得る

引数 int NetHandle : 未送信データ量を得たいネットのハンドル
戻り値  0以上:未送信のデータ量(バイト単位)
 −1:エラー発生

解説  NetWorkSend 関数で送信をしたデータはすぐに 送信されるわけではない場合があり、その場合はライブラリ内部のメモリ領域に 一時的に保存されます、この関数はそうしてたまっているデータ量を取得するた めにあります。

サンプル

 ありません



宣言 int NetWorkRecv( int NetHandle, void *Buffer, int Length ) ;

概略受信データ一時記憶バッファに溜まっているデータを取得する

引数 int NetHandle : 受信データを読み取りたい接続先を示すネットワークハンドル
void *Buffer : バッファに溜まったデータをコピーする先のアドレス
int Length  : バッファからコピーするデータの量(バイト単位)
戻り値 0:成功
 −1:エラー発生

解説  相手マシンがNetWorkSend関数を使用して送信してきたデータは 自機の受信データ一時記憶バッファに格納されます。この関数はそうして一時記憶 バッファに溜まったデータを読み取る目的で使用します。

 関数は NetHandle が示す接続先が送ってきたデータを Buffer が示すアドレスに Length バイト数分だけコピーします。

 もし Length の示す要求データ量よりも一時記憶バッファに保存されている データ量の方が少ない場合はこの関数は失敗します。

サンプル

 ConnectNetWork関数のサンプルを参照して下さい



宣言 int NetWorkRecvToPeek( int NetHandle, void *Buffer, int Length ) ;

概略受信したデータを読み込む、読み込んだデータはバッファから削除されない

引数 int NetHandle : 受信データを読み取りたい接続先を示すネットワークハンドル
void *Buffer : バッファに溜まったデータをコピーする先のアドレス
int Length  : バッファからコピーするデータの量(バイト単位)
戻り値 0:成功
 −1:エラー発生

解説  相手マシンがNetWorkSend関数を使用して送信してきたデータは 自機の受信データ一時記憶バッファに格納されます。この関数はそうして一時記憶 バッファに溜まったデータを読み取る目的で使用します。

 関数は NetHandle が示す接続先が送ってきたデータを Buffer が示すアドレスに Length バイト数分だけコピーします。

 もし Length の示す要求データ量よりも一時記憶バッファに保存されている データ量の方が少ない場合はこの関数は失敗します。

 などなど、NetWorkRecv に非常によくにていますがこの関数は NetWorkRecv と違い受信したデータを受信バッファから取得しても受信バッファから読み 出したデータが失われません。
 ただそれだけです。

サンプル

 特に有りません



宣言 int GetNewAcceptNetWork( void ) ;

概略新たに確立した接続を示すネットワークハンドルを得る

引数なし
戻り値0以上 : 新たに確立された接続を示すネットワークハンドル( int型 識別番号 )
 −1:新たに確立された接続は無い

解説  PreparationListenNetWork関数によって接続受けつけ状態に なったマシンは、別に接続されるまで関数から返って来ないわけでは無いので この関数によってPreparationListenNetWork関数使用後に新たに確立 された接続のネットワークハンドルを得る必要があるのです。

 上記のように、−1が返ってきた場合は新たに確立された接続はない事を示し 0以上の値が返ってきた場合はネットワークハンドルであることを示します。

《注意》

 新たに確立された接続があった場合、この関数はその接続のネットワークハンドルを 1度しか返してきません。
 ですので次のようなプログラムで、新たな接続があるのを確認してからそのネット ワークハンドルを受け取るなどのようなことは出来ないので注意してください。


 出来ない例

int NetHandle ; // 新たな接続があるまでループしている while( !ProcessMessage() && GetNewAcceptNetWork() == -1 ){} // あったのを確認後その接続のネットワークハンドルを受け取る。 // はずなのだが一度しかネットワークハンドルは返って来ないので // これでは駄目。 NetHandle = GetNewAcceptNetWork() ;


 実際はこのようにする必要があります。

 正解

int NetHandle ; // 新たな接続があるか調べると同時に // あった場合はそのままネットワークハンドルを受け取れるようにする while( !ProcessMessage() ) { NetHandle = GetNewAcceptNetWork() ; if( NetHandle != -1 ) break ; }


サンプル

 ConnectNetWork関数のサンプルを参照して下さい



宣言 int GetLostNetWork( void ) ;

概略新たに破棄された接続を示すネットワークハンドルを得る

引数なし
戻り値0以上 : 新たに絶たれた接続を示すネットワークハンドル
 −1 : 新たに切断された接続は無い

解説  通信エラーや、相手側のCloseNetWork関数使用などにより 絶たれた接続を示すネットワークハンドルを得ます。
 接続を絶たれたマシンと再び通信状態を確立するには再度 ConnectNetWork関数がどちらかが行う必要があります。


《注意》

 この関数もGetNewAcceptNetWork関数同様、絶たれた接続の ネットワークハンドルは一度しか通知されませんので注意してください。

 因みに、接続は絶たれてもこの関数での確認が出来るように接続データ 自体は生きているので、切断確認後CloseNetWork関数を使用して 明示的に接続処理を終了する必要があります。

 さらに、自分でCloseNetWork関数を使用して切断した 接続はこの関数には引っかからないので心得ておいてください。

サンプル

 ConnectNetWork関数のサンプルを参照して下さい



宣言 int GetNetWorkAcceptState( int NetHandle ) ;

概略接続状態を取得する

引数 int NetHandle : 状態を得たい接続を示すネットワークハンドル
戻り値0 : 接続されていない
 1 : 接続されている

解説  GetLostNetWork関数GetNewAcceptNetWork関数 によって接続状態の変化情報は漏れなく得ることが出きるのですが、 ダイレクトに現在接続状態にあるのかどうかを知りたいときにこの 関数を使用します。

サンプル

 ありません



宣言 int GetNetWorkIP( int NetHandle , IPDATA *IpBuf ) ;

概略接続先のIPアドレスを得る

引数 int NetHandle : IPアドレスを得たい接続を示すネットワークハンドル
IPDATA *IpBuf : 取得したIPアドレスを保存する IPDATA 構造体のポインタ
戻り値 0:成功
 −1:エラー発生

解説  接続してきた、又はしたマシンのIPアドレスを得ます。
 主に接続された側は、接続してきた側のマシンのIPアドレスはわから ないので、接続してきた側のIPアドレスを得るために使用します。
 使用目的としては、接続された側が、何らかの形で接続が絶たれてしまった ときに接続された側から再度接続を試みる際に必要なIPアドレスを取得 する場合等で使用します。

サンプル

 ConnectNetWork関数のサンプルを参照して下さい。







宣言int MakeUDPSocket( int RecvPort )

概略UDPを使用して通信するためのソケットを作成する

引数 int RecvPort : 受信に使用するポート番号
戻り値0以上:UDP通信用のソケットハンドル(int型の識別値)
 −1:エラー発生

解説  送受信が高速なUDPを使用してデータ通信を行うためのソケットハンドルを作成します。
 戻り値の「UDP通信用のソケットハンドル」を使用してデータの送受信を行いますので、 戻り値は変数などに保存するようにしてください。

 ConnectNetWork 関数で作成するネットハンドルは通信品質の高い代わりに通信速度の遅いTCPを使用して通信を行いますが、 この MakeUDPSocket 関数を含め関数名に「UDP」が付いている関数は全て通信品質が低い代わりに通信速度が高速なUDPを使用して通信を行うための関数です。

 ConnectNetWork, NetWorkSend, NetWorkRecv 等の関数が使用するTCPに対する、MakeUDPSocket, NetWorkSendUDP, NetWorkRecvUDP 等の関数が使用するUDPとの違いは以下の通りです。


・「接続を確立する」という手順が無い

  UDPはデータを送信する度に送信先のIPとポート番号をしていするので、
 接続を確立する、接続を解除する( 切断する )といったような「接続状態」
 というものがありません。


・データが相手に届かないことがある

  TCPの場合は NetWorkSend で送信されたデータが何処かで無くなってしまった
 場合は自動的に再送信する仕様になっているので、NetWorkSend したデータが
 相手に届かないことがあることはあまり想定する必要はありませんが、UDPでは
 そのような仕組みが無いので NetWorkSendUDP で送信したデータが必ず相手に
 届かないことがあります。( その代わり早いです )


・データが順番通りに届かないことがある

  TCPの場合は NetWorkSend で送信したデータは、送信した順番通りに相手の
 NetWorkRecv で取得できる受信データとして届きますが、UDPの場合は後から
 NetWorkSendUDP で送信したデータが先に NetWorkSendUDP で送信したデータ
 より早く相手に届く、ということがあります。


・一度に送信できる最大データサイズは 65507byte

  TCPを使用する NetWorkSend では基本的に一度に送信できるデータの
 最大サイズに制限はありませんが、UDPを使用する NetWorkSendUDP
 では一度に送信できるデータの最大サイズは 65507byte となります。
  ただ、UDPでは一度に送信するデータのサイズが大きくなれば
 なるほど相手に届く確率が低くなるので、一般的にはこのサイズの
 データを一度に送信することはありません。
 ( インターネットを介してデータの送受信を行う場合は、一度に送信する
 データのサイズは 500byte 程度に抑えた方が良いです )


・データは送信時のサイズそのまま受信側に届く

  例えばTCPを使用する NetWorkSend の場合 100byteのデータを
 2回に分けて送信しても、受信側では一回の NetWorkRecv で 200byteの
 データを受信することがありますが、UDPを使用する NetWorkSendUDP で
 同じことをした場合は必ず NetWorkRecvUDP 側では 100byteづつ取得する
 ことになります。
  この点はTCPより扱いやすいかもしれません。


 以上のように制限が多いですが、 基本的に対戦格闘ゲームのオンライン対戦のようなリアルタイム性の高いゲームの通信対戦では必ずUDPを使うことになりますので( TCPでは速度が追いつかない )、 そのような通信対戦機能をソフトに搭載したい場合は何とか使いこなす必要があります。

 引数で指定するポート番号はデータを受信するポート番号となります。
UDPではデータを送信する関数 NetWorkSendUDP でその都度送信先のIPとポート番号を指定しますので、 RecvPort に -1 を渡すことで送信専用のソケットにすることができます。
 尚、一つのマシンではソフトが違っても同じポート番号を持つソケットを同時に複数作成・保持することはできませんので注意してください

サンプル

 送信側は『メッセージ!!』という文字列を送り、受信側は送られてきた文字列を画面に表示します。


-- 送信側プログラム ----------------------------------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { IPDATA Ip ; // 送信用IPアドレスデータ int NetUDPHandle ; // ネットワークハンドル if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // UDP通信用のソケットハンドルを作成 NetUDPHandle = MakeUDPSocket( -1 ) ; // IPアドレスを設定( ここにある4つのIP値は仮です ) Ip.d1 = 192 ; Ip.d2 = 168 ; Ip.d3 = 0 ; Ip.d4 = 14 ; // 文字列の送信 NetWorkSendUDP( NetUDPHandle, Ip, 9850, "メッセージ!!", 15 ) ; // 送信したよと表示 DrawString( 0, 0, "文字列を送信しました、何かキーを押すと終了します", GetColor( 255,255,255 ) ) ; // キー入力待ち WaitKey() ; // UDPソケットハンドルの削除 DeleteUDPSocket( NetUDPHandle ) ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } -- 受信側プログラム ----------------------------------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char StrBuf[ 256 ] ; // データバッファ int NetUDPHandle ; // ネットワークハンドル if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // UDP通信用のソケットハンドルを作成 NetUDPHandle = MakeUDPSocket( 9850 ) ; // 受信待ちだよと表示 DrawString( 0, 0, "受信待ち", GetColor( 255,255,255 ) ) ; // 文字列の受信を待つ while( CheckNetWorkRecvUDP( NetUDPHandle ) == FALSE ) { // ウインドウズメッセージ処理 if( ProcessMessage() < 0 ) break ; } // 受信 NetWorkRecvUDP( NetUDPHandle, NULL, NULL, StrBuf, 256, FALSE ) ; // 受信した文字列を画面に描画 ClearDrawScreen() ; DrawString( 0, 0, StrBuf, GetColor( 255,255,255 ) ) ; // キー入力待ち WaitKey() ; // UDPソケットハンドルの削除 DeleteUDPSocket( NetUDPHandle ) ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }




宣言 int DeleteUDPSocket( int NetUDPHandle ) ;

概略UDPを使用して通信するためのソケットを削除する

引数 int NetUDPHandle : UDPを使用して通信するためのソケットハンドル
戻り値 0:成功
 −1:エラー発生

解説  MakeUDPSocket関数で作成したUDPを使用した通信を行うためのソケットハンドルを削除します。
 UDPを使用したデータ送受信についての説明はMakeUDPSocket関数の解説を参照してください。

サンプル

 MakeUDPSocket関数のサンプルを参照して下さい



宣言 int NetWorkSendUDP( int NetUDPHandle, IPDATA SendIP, int SendPort, void *Buffer, int Length ) ;

概略UDPを使用して他のマシンにデータを送信する

引数 int NetUDPHandle : データ送信に使用するUDPソケットハンドル
IPDATA SendIP : 送信先のIP
int SendPort : 送信先のポート番号
void *Buffer : 送信するデータがあるアドレス
int Length : 送信するデータのサイズ(バイト単位)
戻り値0以上:送信したデータのサイズ
 −1:エラー発生
 −2:エラー(送信データのサイズが大きすぎる)
 −3:エラー(送信準備が完了していない)

解説  MakeUDPSocket関数で作成したUDPによるデータ送受信用のソケットハンドルを使用して指定のIPに Buffer の示すアドレスから Length のバイト数分だけデータを送信します。

 MakeUDPSocket関数 の解説にもありますが、 一度に送信できるデータのサイズは最大で 65507byte ですが、 一度に送信するデータのサイズが大きくなればなるほど相手に届く確率が下がりますので、 なるべくなら500byte以内にしてください。( 尚、LANなど信頼性の高い通信環境の場合はもっと大きくても大丈夫だと思います )

 戻り値は、0以上の場合は送信できたサイズです、−2の場合は送信データが大きすぎるというエラーです、 −3の場合は送信準備が完了していない場合に返ってきます、間隔を空けずに NetWorkSendUDP を使用した場合や、 送信先のIPが有効ではない場合に返ってきます。

 エラーが発生した場合はデータは1バイトも送信されませんので、再度送信するようにしてください。

サンプル

 MakeUDPSocket関数のサンプルを参照して下さい



宣言 int NetWorkRecvUDP( int NetUDPHandle, IPDATA *RecvIP, int *RecvPort, void *Buffer, int Length, int Peek ) ;

概略UDPを使用して他のマシンからのデータを受信する

引数 int NetUDPHandle : データ受信に使用するUDPソケットハンドル
IPDATA *RecvIP : 送信側のIPアドレスを格納するための IPDATA 構造体のアドレス
int *RecvPort : 送信側が指定したポート番号を格納するための int型変数のアドレス
void *Buffer : 受信データを格納するためのバッファへのアドレス
int Length  : 受信データを格納するためのバッファのサイズ(バイト単位)
int Peek   : 受信データをキューから削除するかどうかのフラグ
戻り値0以上:受信データのサイズ
 −1:エラー発生
 −2:エラー発生(受信データよりバッファのサイズの方が小さい)
 −3:エラー発生(受信データが無い)

解説  MakeUDPSocket関数で作成したUDPによるデータ送受信用のソケットハンドルを使用して MakeUDPSocket 関数を呼び出す際に RecvPort で指定したポート番号に送られてきたデータを Buffer が示すアドレスに受信します。

 受信に成功した場合の受信データのサイズは必ず NetWorkSendUDP で指定した送信サイズと等しくなります。
 関数が成功すると通常受信データは受信データキューから削除されますが、 引数 Peek を TRUE にすると受信データがキューにそのまま残ります。 この場合、次に NetWorkRecvUDP を呼んだ場合も前回と同じデータを取得することになります。

 戻り値は、0以上の場合は受信データのサイズです、この値は必ず NetWorkSendUDP で指定した送信サイズと等しくなります 、 −2は受信データが引数 Length で指定された受信データ格納用のバッファより大きかったときに返ってきます NetWorkRecv関数とは違い受信データより大きなサイズのバッファを指定してもエラーにはなりませんので、 受信予定のデータのサイズより十分大きなバッファを用意してください、−3は受信データが無かった場合に返ってきます。

サンプル

 MakeUDPSocket関数のサンプルを参照して下さい



宣言 int CheckNetWorkRecvUDP( int NetUDPHandle ) ;

概略UDPを使用した他のマシンから受信データがあるかどうかを取得する

引数 int NetUDPHandle : チェックするUDPソケットハンドル
戻り値TRUE:受信データがある FALSE:受信データはない
 −1:エラー発生

解説  MakeUDPSocket関数で作成したUDPによるデータ送受信用のソケットハンドルを使用して MakeUDPSocket 関数を呼び出す際に RecvPort で指定したポート番号に送られてきたデータが存在するかどうかを取得するための関数です。

 受信データがある場合は TRUE が、無い場合は FALSE が返ります。

サンプル

 MakeUDPSocket関数のサンプルを参照して下さい






ファイル読み込み関係

宣言int FileRead_open( char *FilePath, int ASync ) ;

概略 ファイルを開く

引数 char *FilePath : 開くファイルのパス
int ASync : 非同期読み込みを行うかどうか
      ( TRUE:非同期読み込み FALSE:同期読み込み( デフォルト ) )

戻り値0以外:ファイルハンドル
 0:エラー発生

解説  FilePath で指定したファイルを開きます。
 関数が成功すると戻り値として得られるファイルハンドルを使用してファイルの読み込み操作を行います。
 ファイルの読み込み操作が終わったらFileRead_close関数でファイルを閉じる必要があります。

 この関数は SetUseASyncLoadFlag 関数で非同期読み込みに設定にすると、非同期で行うことができます。
 ファイルを開く処理が完了したかどうかは CheckHandleASyncLoad で確認することができます。

サンプル

 test.cpp を開いて、一行読んで画面に描画します。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int FileHandle ; char String[256] ; // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1 ; // test.cpp ファイルを開く FileHandle = FileRead_open( "test.cpp" ) ; // 一行読む FileRead_gets( String, 256, FileHandle ) ; // 画面に描画 DrawString( 0, 0, String, GetColor( 255,255,255 ) ) ; // キー入力を待つ WaitKey() ; // ファイルを閉じる FileRead_close( FileHandle ) ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言LONGLONG FileRead_size( char *FilePath ) ;

概略 ファイルのサイズを得る

引数 char *FilePath : ファイルサイズを得るファイルのパス

戻り値 −1以外:ファイルのサイズ
 −1:エラー発生

解説  FilePath で指定したファイルのサイズをバイト単位で得ます

サンプル

 FileRead_read関数のサンプルを参照してください。



宣言int FileRead_close( int FileHandle ) ;

概略 ファイルを閉じる

引数 int FileHandle : 閉じるファイルハンドル

戻り値 0:成功
 −1:エラー発生

解説  FileRead_open関数で開いたファイルを閉じます。

サンプル

 FileRead_open関数のサンプルを参照して下さい。



宣言LONGLONG FileRead_tell( int FileHandle ) ;

概略 ファイルポインタの位置を得る

引数 int FileHandle : ファイルハンドル

戻り値 0:成功
 −1:エラー発生

解説  FileRead_open関数で開いたファイルの現在のファイルポインタの位置をバイト単位で得ます。

サンプル

ありません


宣言int FileRead_seek( int FileHandle, LONGLONG Offset, int Origin ) ;

概略 ファイルポインタの位置を変更する

引数 int FileHandle : ファイルハンドル
LONGLONG Offset : Origin からのバイト数
int Origin : 初期位置
       SEEK_SET=ファイルの先頭
       SEEK_CUR=現在のファイルポインタの位置
       SEEK_END=ファイルの終端

戻り値 0:成功
 −1:エラー発生

解説  FileRead_open関数で開いたファイルの現在のファイルポインタの位置を変更します。
 Origin で指定した初期位置からの相対位置を Offset で指定します。 (例えば Origin を SEEK_END にして、Offset を -10 にすればファイルの終端から10バイト戻った位置を指定したことになります)

 この関数は SetUseASyncLoadFlag 関数で非同期読み込みに設定にすると、非同期で行うことができます。
 ファイルポインタの位置変更が完了したかどうかは CheckHandleASyncLoad で確認することができます。

サンプル

test.cpp の11バイト目から一行読み込み描画する。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int FileHandle ; char String[256] ; // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1 ; // test.cpp ファイルを開く FileHandle = FileRead_open( "test.cpp" ) ; // 11バイト目までファイルポインタを移動する FileRead_seek( FileHandle, 11, SEEK_SET ) ; // 一行読む FileRead_gets( String, 256, FileHandle ) ; // 画面に描画 DrawString( 0, 0, String, GetColor( 255,255,255 ) ) ; // キー入力を待つ WaitKey() ; // ファイルを閉じる FileRead_close( FileHandle ) ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int FileRead_read( void *Buffer, int ReadSize, int FileHandle ) ;

概略 ファイルからデータを読み込む

引数 void *Buffer : データを読み込むバッファの先頭アドレス
int ReadSize : 読み出すサイズ(バイト数)
int FileHandle : ファイルハンドル

戻り値 −1以外:読み出したサイズ
 −1:エラー発生

解説  FileRead_open関数で開いたファイルからデータを読み込みます。
 主にバイナリデータを読み出す用途で使用します。

 この関数は SetUseASyncLoadFlag 関数で非同期読み込みに設定にすると、非同期で行うことができます。
 データの読み込みが完了したかどうかは CheckHandleASyncLoad で確認することができます。

サンプル

test1.bmp を丸ごとメモリに読み込んで、グラフィックハンドルを作成して描画する。
Windows用
#include "DxLib.h" #include <malloc.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { void *Buffer ; int FileSize, FileHandle, GrHandle ; // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1 ; // ファイルのサイズを得る FileSize = FileRead_size( "test1.bmp" ) ; // ファイルを格納するメモリ領域の確保 Buffer = malloc( FileSize ) ; // test1.bmp を開く FileHandle = FileRead_open( "test1.bmp" ) ; // ファイルを丸ごとメモリに読み込む FileRead_read( Buffer, FileSize, FileHandle ) ; // ファイルを閉じる FileRead_close( FileHandle ) ; // グラフィックハンドルの作成 GrHandle = CreateGraphFromMem( Buffer, FileSize ) ; // メモリの解放 free( Buffer ) ; // 画面に描画 DrawGraph( 0, 0, GrHandle, TRUE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int FileRead_eof( int FileHandle ) ;

概略 ファイルの終端かどうかを調べる

引数 int FileHandle : ファイルハンドル

戻り値 0:ファイルの終端ではない
 0以外:ファイルの終端

解説  FileRead_open関数で開いたファイルのファイルポインタが終端に達しているかどうかを調べたい時に使用します。

サンプル

 test.cpp をファイルの終端に達するまで一行読み込み、描画を繰り返す
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char String[256] ; int FileHandle, y ; // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1 ; // test.cpp を開く FileHandle = FileRead_open( "test.cpp" ) ; // 表示Y座標の初期化 y = 0 ; // ファイルの終端が来るまで表示する while( FileRead_eof( FileHandle ) == 0 ) { // 一行読み込み FileRead_gets( String, 256, FileHandle ) ; // 画面に描画 DrawString( 0, y, String, GetColor( 255,255,255 ) ) ; // 表示Y座標を下にずらす y += 16 ; } // ファイルを閉じる FileRead_close( FileHandle ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int FileRead_gets( char *Buffer, int Num, int FileHandle ) ;

概略 ファイルから一行読み出す

引数 char *Buffer : 読み出した文字列を格納するメモリ領域の先頭アドレス
int Num : 文字列を格納するメモリ領域のサイズ
int FileHandle : ファイルハンドル

戻り値 −1以外:読み出した文字列の長さ
 −1:エラー発生

解説  FileRead_open関数で開いたファイルから文字列を一行読み込みます。
 改行があるか、ファイルの終端に達するか、Num で指定されたサイズ−1バイト分の文字列があった所までの文字列を Buffer に格納します。
(文字列の終端にはヌル文字(\0)が格納されるので、最大でも Num で指定されたサイズ−1バイト分となります)
 読み込み後のファイルポインタは、改行があった場合は次の行の先頭、ファイルの終端に達した場合はファイルの終端、Num で指定されたサイズを超えたために読み込み終了となった場合は、 読み込んだ最後の文字の次の文字となります。
(読み込んだ最後の文字の次が改行コードの場合は、次の FileRead_gets では Buffer にヌル文字(\0)のみ格納されることになります)
サンプル

 FileRead_open関数のサンプルを参照してください。


宣言int FileRead_getc( int FileHandle ) ;

概略 ファイルから一文字読み出す

引数 int FileHandle : ファイルハンドル

戻り値 −1以外:読み出した文字コード
 −1:エラー発生

解説  FileRead_open関数で開いたファイルから一文字読み込みます。
 正常に読み込めるのは1バイト文字だけで、一文字2バイトの全角文字などは正常に読み込めません。(1バイト目だけが返ってきます)
サンプル

 ありません





宣言int FileRead_scanf( int FileHandle , char *Format , ... ) ;

概略 ファイルから書式付きデータを読み出す

引数 int FileHandle : ファイルハンドル
char *Format : 書式制御文字列

戻り値 −1以外:読み出した文字数
 −1:エラー発生

解説  FileRead_open関数で開いたファイルから書式付きで文字列を読み込みます。
 C言語標準ライブラリの fscanf と同等の機能を FileRead_ 系の関数に実装したものですので、 書式制御文字列についてはC言語の書籍や解説サイトをご参照ください。(すいません、説明が大変なんです・・・orz)
サンプル

 ありません





ドット単位で画像にアクセスしたい関係

宣言int LoadSoftImage( char *FileName ) ;

概略 CPUで扱うイメージの読み込み

引数 char *FileName : 読み込むファイルのパス

戻り値 −1:エラー
 −1以外:ソフトウェアイメージハンドル

解説  たまに LoadGraph で読み込んだ画像をドット単位でアクセスしたい、ということがあると思います。
 画像をマップデータの代わりに使うとか、格闘ゲームでパレットだけいじって2Pキャラ用にしたい、など。
 ですが LoadGraph で読み込まれた画像は描画に適した形式に変換され、読み込みアクセスが低速なVRAMへと転送されているので内容を参照したりいじったりということに向いていません。

 また、オリジナルの画像データ形式で画像を管理したい、ということもあるとおもいます。
 ですがDXライブラリで読み込むには LoadGraph で対応している画像形式にする必要がある・・・なんとかならないかぁと・・・

 そこで登場するのが LoadSoftImage で LoadGraph 感覚で読み込んで作成するソフトウエアイメージハンドルです。
 この関数で読み込まれた画像はグラフィックハンドルの様に DrawGraphDrawRotaGraph 等の描画関数を使って描画することはできませんが、 代わりに画像内容を参照したり書き換えたりする機能と、編集したソフトウエアイメージハンドルからグラフィックハンドルを作成する機能を備えています。
 なので、主に画像を描画目的以外で使用したいとき、パレットだけいじってグラフィックハンドルを作成したいとき、 独自の画像形式のデータをDXライブラリで使用したいときなどに有効です。

 具体的な使い方としては LoadSoftImage 関数でソフトウェアイメージハンドルを作成し、GetPixelSoftImage 関数でドットの色を取得したり、 DrawPixelSoftImage 関数でドットを書き込んだりします。
 LoadSoftImage で読み込んだ画像がパレット画像の場合は GetPaletteSoftImage 関数でパレットを参照したり、SetPaletteSoftImage 関数でパレットを変更したりすることも可能です。
 その後、編集した画像をグラフィックハンドルにしたい場合は CreateGraphFromSoftImage 関数や CreateDivGraphFromSoftImage 関数でグラフィックハンドルにする、という感じです。

 なお、ソフトウエアイメージハンドルは LoadGraph で読み込むグラフィックハンドルと異なり DxLib_End を実行しても自動的に解放されることはありませんので、使用後は必ず DeleteSoftImage 関数でハンドルを削除するようにしてください。
サンプル

 test.bmp をソフトウエアイメージハンドルとして読み込んで1ドット毎に DrawBox を使って描画する
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, i, j, w, h, r, g, b, a ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 画像の読み込み handle = LoadSoftImage( "Test1.bmp" ) ; // 画像のサイズを取得 GetSoftImageSize( handle, &w, &h ) ; // 画像の色を1ドットづつ参照して DrawBox で3倍の大きさにして描画 for( i = 0; i < h; i ++ ) { for( j = 0; j < w; j ++ ) { // 1ドットの色を取得 GetPixelSoftImage( handle, j, i, &r, &g, &b, &a ) ; // DrawBox で描画 DrawBox( j * 3, i * 3, j * 3 + 3, i * 3 + 3, GetColor( r, g, b ), TRUE ) ; } } // 使い終わったら解放 DeleteSoftImage( handle ) ; // キー入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int LoadSoftImageToMem( void *FileImage, int FileImageSize ) ;

概略 CPUで扱うイメージのメモリからの読み込み

引数 void *FileImage : ファイルイメージの先頭アドレス
int FileImageSize : ファイルイメージのサイズ

戻り値 −1:エラー
 −1以外:ソフトウェアイメージハンドル

解説  LoadSoftImage は画像ファイルからソフトウエアイメージハンドルを作成しますが、 仮に暗号化された状態でファイルを保存していて、メモリに読み込んでから暗号化を解除した、ということもソフトウエア開発に慣れた方ならあると思います。
 そんなときは暗号化解除した画像ファイルを一々ファイルに書き出して LoadSoftImage で読み込む、というのは無駄なので、この関数で読み込むことになります。
 引数の FileImage は画像ファイルイメージが格納されたメモリ領域の先頭アドレスを、FileImageSize は格納されているファイルイメージのサイズを渡します。
 まあ、対応している画像形式は LoadGraph で読み込める画像形式と一緒ですので、独自の暗号化をされる方がこの関数を使うことは無いかもしれませんが一応・・・
サンプル

 test.bmp をメモリに読み込んで LoadSoftImageToMem でソフトウエアイメージハンドルとして読み込んでみる
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, i, j, w, h, r, g, b, a, fhandle ; void *image ; int image_size ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 画像ファイルを丸ごとメモリに読み込む fhandle = FileRead_open( "test1.bmp" ) ; image_size = FileRead_size( "test1.bmp" ) ; image = malloc( image_size ) ; FileRead_read( image, image_size, fhandle ) ; FileRead_close( fhandle ) ; // LoadSoftImageToMem で読み込む handle = LoadSoftImageToMem( image, image_size ) ; // 読み込んでしまった後はファイルイメージは必要なし free( image ) ; // 画像のサイズを取得 GetSoftImageSize( handle, &w, &h ) ; // 画像の色を1ドットづつ参照して DrawBox で3倍の大きさにして描画 for( i = 0; i < h; i ++ ) { for( j = 0; j < w; j ++ ) { // 1ドットの色を取得 GetPixelSoftImage( handle, j, i, &r, &g, &b, &a ) ; // DrawBox で描画 DrawBox( j * 3, i * 3, j * 3 + 3, i * 3 + 3, GetColor( r, g, b ), TRUE ) ; } } // 使い終わったら解放 DeleteSoftImage( handle ) ; // キー入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MakeARGB8ColorSoftImage( int SizeX, int SizeY ) ;

概略 CPUで扱うイメージの作成( RGBA8 カラー )

引数 int SizeX : 作成する画像の横幅
int SizeY : 作成する画像の縦幅

戻り値 −1:エラー
 −1以外:ソフトウェアイメージハンドル

解説  この関数や MakePAL8ColorSoftImage 関数、 MakeXRGB8ColorSoftImage 関数は何も書かれていないソフトウエアイメージハンドルを作成します。
 主にソフトウエアイメージハンドルの機能を使って独自の画像フォーマットのイメージデータをDXライブラリで使用したい場合や、 プログラムで動的に画像を作成して使いたいときに、この関数で作成したソフトウエアイメージハンドルに対して DrawPixelSoftImage 関数で描画を行い、 CreateGraphFromSoftImage 関数でグラフィックハンドルにする、というような使い方をします。

 この MakeARGB8ColorSoftImage 関数は、透明情報(アルファチャンネル)つきのフルカラー画像を作成する関数で、 MakePAL8ColorSoftImage 関数は256色のパレット画像を作成する関数、 MakeXRGB8ColorSoftImage 関数は透明情報なしのフルカラー画像を作成する関数となりますので、 用途に応じて使い分けてください。
(アルファチャンネル付きの画像はアルファチャンネル無しの画像に比べて描画負荷が高くなりますので、 1個の透過色で済む画像を作成する場合や、そもそも画像を一切透過させる必要が無い場合等は MakeXRGB8ColorSoftImage 関数で画像を作成するようにした方がお得です)
サンプル

 空のソフトウエアイメージハンドルを作成して、プログラムで透明なグラデーションの画像を作成して描画する
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, i, j, grhandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 空のフルカラー画像を作成する handle = MakeARGB8ColorSoftImage( 256, 256 ) ; // 縦方向に透明グラデーションした真っ赤な画像を作成する for( i = 0; i < 256; i ++ ) { for( j = 0; j < 256; j ++ ) { // 色をセット DrawPixelSoftImage( handle, j, i, 255, 0, 0, i ) ; } } // 透明かどうかわかるように画面を緑で塗りつぶす DrawBox( 0, 0, 640, 480, GetColor( 0, 255, 0 ), TRUE ) ; // グラフィックハンドルを作成 grhandle = CreateGraphFromSoftImage( handle ) ; // 使い終わったら解放 DeleteSoftImage( handle ) ; // グラフィックハンドルを描画 DrawGraph( 0, 0, grhandle, TRUE ) ; // キー入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MakeXRGB8ColorSoftImage( int SizeX, int SizeY ) ;

概略 CPUで扱うイメージの作成( RGBA8 カラー )

引数 int SizeX : 作成する画像の横幅
int SizeY : 作成する画像の縦幅

戻り値 −1:エラー
 −1以外:ソフトウェアイメージハンドル

解説  MakeARGB8ColorSoftImage 関数と同様に空のソフトウエアイメージハンドルを作成するための関数です。
透明情報(アルファチャンネル)が必要ない場合にはこちらを使った方が、ソフトウエアイメージハンドルからグラフィックハンドルを作成した際に、 作成したグラフィックハンドルの描画負荷が低くなります。
サンプル

 空のソフトウエアイメージハンドルを作成して、プログラムで黒から赤になるグラデーションの画像を作成して描画する
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, i, j, grhandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 空のフルカラー画像を作成する handle = MakeXRGB8ColorSoftImage( 256, 256 ) ; // 縦方向に黒から赤にグラデーションした画像を作成する for( i = 0; i < 256; i ++ ) { for( j = 0; j < 256; j ++ ) { // 色をセット DrawPixelSoftImage( handle, j, i, i, 0, 0, 0 ) ; } } // グラフィックハンドルを作成 grhandle = CreateGraphFromSoftImage( handle ) ; // 使い終わったら解放 DeleteSoftImage( handle ) ; // グラフィックハンドルを描画 DrawGraph( 0, 0, grhandle, TRUE ) ; // キー入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int MakePAL8ColorSoftImage( int SizeX, int SizeY ) ;

概略 CPUで扱うイメージの作成( RGBA8 カラー )

引数 int SizeX : 作成する画像の横幅
int SizeY : 作成する画像の縦幅

戻り値 −1:エラー
 −1以外:ソフトウェアイメージハンドル

解説  MakeARGB8ColorSoftImage 関数と同様に空のソフトウエアイメージハンドルを作成するための関数です。
 この関数は他の二つの空イメージ作成関数とは違い、パレット画像を作成する関数となっています。

 初期状態ではRGBを満遍なく満たしたパレットとなっていますが、恐らくこの関数をお使いになる方は独自のパレットをご用意されると思いますので、 SetPaletteSoftImage 関数でパレットを変更することになると思います。
 また、パレット画像に限り画像内容の参照・描画もRGBA値の取得ではなくパレット番号の取得・描画の方が都合が良いことが多いので、 RGBA値を指定・取得する DrawPixelSoftImage 関数や GetPixelSoftImage 関数の代わりにパレット番号を指定・取得する DrawPixelPalCodeSoftImage 関数, GetPixelPalCodeSoftImage を使用することになると思います。
( パレット画像で DrawPixelSoftImage が使用された場合は指定された色に最も近いパレット番号が書き込まれます、あと、現在パレット画像ではアルファ値は無視されます )

サンプル

 空のソフトウエアイメージハンドルを作成して、プログラムで黒から緑になるグラデーションの画像を作成して描画する
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, i, j, grhandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 空のパレット画像を作成する handle = MakePAL8ColorSoftImage( 256, 256 ) ; // パレット0から255に掛けて緑色のグラデーションをセットする for( i = 0 ; i < 256 ; i ++ ) SetPaletteSoftImage( handle, i, 0, i, 0, 0 ) ; // 縦方向に黒から赤にグラデーションした画像を作成する for( i = 0; i < 256; i ++ ) { for( j = 0; j < 256; j ++ ) { // パレット番号をセット DrawPixelPalCodeSoftImage( handle, j, i, i ) ; } } // グラフィックハンドルを作成 grhandle = CreateGraphFromSoftImage( handle ) ; // 使い終わったら解放 DeleteSoftImage( handle ) ; // グラフィックハンドルを描画 DrawGraph( 0, 0, grhandle, TRUE ) ; // キー入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int DeleteSoftImage( int SIHandle ) ;

概略 CPUで扱うイメージの解放

引数 int SIHandle : ソフトウエアイメージハンドル

戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数や、MakeARGB8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルをメモリ上から解放するときに使用します。

サンプル

 ありません。



宣言int InitSoftImage( void ) ;

概略 CPUで扱うイメージを全て解放

引数なし
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数や、MakeARGB8ColorSoftImage 関数等で作成した全てのソフトウエアイメージハンドルをメモリ上から解放するときに使用します。
 作成したソフトウエアイメージハンドル全部に DeleteSoftImage を実行するのと効果は同じです。

サンプル

 ありません。



宣言int GetSoftImageSize( int SIHandle, int *Width, int *Height ) ;

概略 CPUで扱うイメージのサイズを取得する

引数 int SIHandle : サイズを調べるソフトウエアイメージハンドル
int Width  : イメージの幅を保存するint型変数のアドレス
int Height  : イメージの高さを保存するint型変数のアドレス
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数や、MakeARGB8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルの幅と高さを取得するために使用します。
使い方は GetGraphSize 関数と同じです。

サンプル

 LoadSoftImage 関数のサンプルで使用していますので、そちらを参照してください。



宣言int FillSoftImage( int SIHandle, int r, int g, int b, int a ) ;

概略 CPUで扱うイメージを指定色で塗りつぶす(各色要素は0〜255)

引数 int SIHandle : 指定色で塗りつぶすソフトウエアイメージハンドル
int r : 塗りつぶす色の赤成分( 0〜255 )
int g : 塗りつぶす色の緑成分( 0〜255 )
int b : 塗りつぶす色の青成分( 0〜255 )
int a : 塗りつぶす色の透明度( 0〜255 )
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数や、MakeARGB8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルを指定の色で塗りつぶします。
 普通に考えて LoadSoftImage で読み込んだ画像を塗りつぶすということは無いと思いますので、主に MakeARGB8ColorSoftImage 関数などで作成した空イメージを初期化する場合に使用する、というのが主だと思います。
 ただ、空イメージを作成した場合も全ドットを埋める場合は使う必要がないという、謎の関数です。
 DrawLine や DrawBox に相当する関数がソフトウエアイメージハンドルには存在していないので、ふと初期化したいときに困るかもしれないから追加した代物だったりします。

サンプル

 ありません。



宣言int SetPaletteSoftImage( int SIHandle, int PaletteNo, int r, int g, int b, int a ) ;

概略 CPUで扱うイメージのパレットをセットする(各色要素は0〜255)

引数 int SIHandle : ソフトウエアイメージハンドル
int PaletteNo : 色を変更するパレット番号
int r : 変更後のパレットの赤成分( 0〜255 )
int g : 変更後のパレットの緑成分( 0〜255 )
int b : 変更後のパレットの青成分( 0〜255 )
int a : 0 を指定してください
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数で読み込んだパレット画像のソフトウエアイメージハンドルや、MakePAL8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルが持つパレットの指定番号の色を変更します。
 各色成分の値は0から255です。今のところ a の値は何も意味が無いので、0を指定して下さい。

サンプル

 MakePAL8ColorSoftImage 関数のサンプルで使用していますので、そちらを参照してください。



宣言int GetPaletteSoftImage( int SIHandle, int PaletteNo, int *r, int *g, int *b, int *a ) ;

概略 CPUで扱うイメージのパレットを取得する(各色要素は0〜255)

引数 int SIHandle : ソフトウエアイメージハンドル
int PaletteNo : 色を取得するパレット番号
int *r : パレットの赤成分を保存する変数のアドレス
int *g : パレットの緑成分を保存する変数のアドレス
int *b : パレットの青成分を保存する変数のアドレス
int *a : 0 を指定してください
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数で読み込んだパレット画像のソフトウエアイメージハンドルや、MakePAL8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルが持つパレットの指定番号の色を取得します。
 各色成分の値は0から255です。今のところ a の値は何も意味が無いので、0を指定して下さい。

サンプル

 パレット画像である Test1.bmp のパレットの一覧を16x16マス使って表示する
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, i, j, r, g, b ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 画像の読み込み handle = LoadSoftImage( "Test1.bmp" ) ; // パレットの一覧を描画 for( i = 0 ; i < 16 ; i ++ ) { for( j = 0 ; j < 16 ; j ++ ) { // パレットの色を取得する GetPaletteSoftImage( handle, j + i * 16, &r, &g, &b, 0 ) ; // DrawBox を使って描画 DrawBox( j * 16, i * 16, j * 16 + 16, i * 16 + 16, GetColor( r, g, b ), TRUE ) ; } } // 使い終わったら解放 DeleteSoftImage( handle ) ; // キー入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int DrawPixelPalCodeSoftImage( int SIHandle, int x, int y, int palNo ) ;

概略 CPUで扱うイメージの指定座標にドットを描画する(パレット画像用、有効値は0〜255)

引数 int SIHandle : ソフトウエアイメージハンドル
int x, int y : 書き込む座標
int palNo : 書き込むパレット番号
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数で読み込んだパレット画像のソフトウエアイメージハンドルや、MakePAL8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルの指定の座標にパレット番号を書き込みます。
 パレット画像は各ドット0〜255の値を持ちますので、渡せる値も0から255となります。

サンプル

 MakePAL8ColorSoftImage 関数のサンプルで使用していますので、そちらを参照してください。



宣言int GetPixelPalCodeSoftImage( int SIHandle, int x, int y ) ;

概略 CPUで扱うイメージのパレットを取得する(各色要素は0〜255)

引数 int SIHandle : ソフトウエアイメージハンドル
int x, int y : パレット番号を取得する座標
戻り値パレット番号

解説  LoadSoftImage 関数で読み込んだパレット画像のソフトウエアイメージハンドルや、MakePAL8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルの指定の座標のパレット番号を取得します。
 パレット画像は各ドット0〜255の値を持ちますので、返ってくる値も0から255となります。

サンプル

 ありません



宣言int DrawPixelSoftImage( int SIHandle, int x, int y, int r, int g, int b, int a ) ;

概略 CPUで扱うイメージの指定座標にドットを描画する(各色要素は0〜255)

引数 int SIHandle : ソフトウエアイメージハンドル
int x, int y : 色を書き込む座標
int r : 書き込む色の赤成分( 0〜255 )
int g : 書き込む色の緑成分( 0〜255 )
int b : 書き込む色の青成分( 0〜255 )
int a : 書き込む色の透明度( 0〜255 )
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数や、MakeARGB8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルの指定の座標の色を変更します。
 赤・緑・青・透明度各成分の値は0〜255です。透明情報の無い画像形式の場合は透明度は無視されます。書き込み対象がパレット画像の場合は指定された色に一番近いパレットの番号が書き込まれます。

サンプル

 MakeARGB8ColorSoftImage 関数のサンプルで使用していますので、そちらを参照してください。



宣言int GetPixelSoftImage( int SIHandle, int x, int y, int *r, int *g, int *b, int *a ) ;

概略 CPUで扱うイメージの指定座標の色を取得する(各色要素は0〜255)

引数 int SIHandle : ソフトウエアイメージハンドル
int x, int y : 色を取得する座標
int *r : 取得した色の赤成分を書き込む変数のアドレス
int *g : 取得した色の緑成分を書き込む変数のアドレス
int *b : 取得した色の青成分を書き込む変数のアドレス
int *a : 取得した色の透明度を書き込む変数のアドレス
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数や、MakeARGB8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルの指定の座標の色を取得します。
 赤・緑・青・透明度各成分の値は0〜255です。透明情報の無い画像形式の場合の透明度は不定です。読み込み対象がパレット画像の場合は指定された座標のパレットの色が変数に代入されます。

サンプル

 LoadSoftImage 関数のサンプルで使用していますので、そちらを参照してください。



宣言int BltSoftImage( int SrcX, int SrcY, int SrcSizeX, int SrcSizeY, int SrcSIHandle, int DestX, int DestY, int DestSIHandle ) ;

概略 CPUで扱うイメージを別のイメージ上に転送する

引数 int SrcX, int SrcY : 転送元から転送する画像領域の左上座標
int SrcSizeX, int SrcSizeY : 転送元から転送する画像領域の幅と高さ
int SrcSIHandle : 転送元のソフトウエアイメージハンドル
int DestX, int DestY : 転送元の画像を格納する転送先の座標
int DestSIHandle : 転送先のソフトウエアイメージハンドル
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数や、MakeARGB8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルを他のソフトウエアイメージハンドルにコピーしたいときに使用します。
 転送元から転送先にコピーしたい領域の左上座標を SrcX, SrcY で指定し、領域の幅と高さを SrcSizeX, SrcSizeY で指定します。
 転送先の座標は、転送元からコピーする領域の左上座標に対応する座標を DestX, DestY で指定します。
 転送元と転送先のピクセルフォーマットやパレットが違う場合は、カラーマッチングが行われエラーになることはありませんが、低速です。

 用途は・・・なんでしょう。パッとは思いつきませんが、無いと困ることがあるような気がします。

サンプル

 Test1.bmp を読み込んで、MakePAL8ColorSoftImage で作成した空画像に転送します
( MakePAL8ColorSoftImage で用意されるパレットは Test1.bmp に最適化されていないので見た目が悪くなるのがわかると思います )
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, w, h, handle2 ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 画像の読み込み handle = LoadSoftImage( "Test1.bmp" ) ; // 画像のサイズを取得 GetSoftImageSize( handle, &w, &h ) ; // 読み込んだ画像と同じサイズの空パレット画像の作成 handle2 = MakePAL8ColorSoftImage( w, h ) ; // 空パレット画像に読み込んだ画像を転送 BltSoftImage( 0, 0, w, h, handle, 0, 0, handle2 ) ; // 画面に描画 DrawSoftImage( 0, 0, handle2 ) ; // 使い終わったら解放 DeleteSoftImage( handle ) ; DeleteSoftImage( handle2 ) ; // キー入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int DrawSoftImage( int x, int y, int SIHandle ) ;

概略 CPUで扱うイメージを画面に描画する

引数 int x, int y : ソフトウエアイメージハンドルを描画する座標
int SIHandle : ソフトウエアイメージハンドル
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数や、MakeARGB8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルを SetDrawScreen 関数で設定されている描画先に描画します。
 主に編集した画像が正しいかどうかを確認するためにしようするものです。
 グラフィックハンドルの描画に比べて負荷が非常に高いので、確認以外の用途で使用することは避けた方が賢明です。

サンプル

 BltSoftImage 関数のサンプルで使用していますので、そちらを参照してください。



宣言int CreateGraphFromSoftImage( int SIHandle ) ;

概略 CPUで扱うイメージからグラフィックハンドルを作成する

引数 int SIHandle : ソフトウエアイメージハンドル
戻り値−1以外:グラフィックハンドル −1:エラー

解説  LoadSoftImage 関数や、MakeARGB8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルからグラフィックハンドルを作成します。
 主に編集したソフトウエアイメージハンドルから描画に適したグラフィックハンドルを作成するために使用します。
 作成後のグラフィックハンドルを使うにあたって、作成に使用したソフトウエアイメージハンドルは必要ありませんので、作成後にソフトウエアイメージハンドルの内容を弄っても、解放してしまっても大丈夫です。

サンプル

 MakeARGB8ColorSoftImage 関数のサンプルで使用していますので、そちらを参照してください。



宣言int CreateDivGraphFromSoftImage( int SIHandle, int AllNum, int XNum, int YNum, int SizeX, int SizeY, int *HandleBuf ) ;

概略 CPUで扱うイメージから分割グラフィックハンドルを作成する

引数 int SIHandle     : ソフトウエアイメージハンドル
int AllNum      : 画像の分割総数
int XNum ,int YNum : 画像の横向きに対する分割数と縦に対する分割数
int SizeX ,int SizeY : 分割された画像一つの大きさ
int *HandleBuf    : 分割読み込みして得たグラフィックハンドルを
             保存するint型の配列へのポインタ
戻り値0:正常終了 −1:エラー

解説  LoadSoftImage 関数や、MakeARGB8ColorSoftImage 関数等で作成したソフトウエアイメージハンドルから分割グラフィックハンドルを作成します。
 主に編集したソフトウエアイメージハンドルから描画に適したグラフィックハンドルを作成するために使用します。
 作成後のグラフィックハンドルを使うにあたって、作成に使用したソフトウエアイメージハンドルは必要ありませんので、作成後にソフトウエアイメージハンドルの内容を弄っても、解放してしまっても大丈夫です。

 使用方法に関しては LoadDivGraph 関数と同じですので、引数については LoadDivGraph 関数の解説をご参照下さい。
サンプル

 ありません。




非同期読み込み関係

宣言int SetUseASyncLoadFlag( int Flag ) ;

概略非同期読み込みを行うかどうかを設定する

引数 int Flag : 非同期読み込みを行うかどうか
      ( TRUE:非同期読み込み FALSE:同期読み込み( デフォルト ) )
戻り値 0:成功
 −1:エラー発生

解説  ゲームソフトではよくロード中に「Now Loading」と表示しながら、その文字が動いていたり、何か画面が動いていたりします。
 それはゲームに必要な情報をディスクから読み込んでいる間も平行して演出用のプログラムが動いているからです。
 DXライブラリのデータ読み込み関数である LoadGraphLoadSoundMem は標準動作ではデータを読み込み終わるまで関数から出てこない「同期読み込み」ですが、 この関数を使って設定を「非同期読み込み」にすると、データの読み込みが終わる前に関数から出てきます。
 当然読み込みが終わっていないので別途 CheckHandleASyncLoadGetASyncLoadNum で読み込みが終わるのを確認してからではないとハンドルを使えるようにはなりませんが、 読み込みが終わるまでの間、前述の「Now Loading」のアニメーションなどを行うことができます。

 非同期読み込みを使用して読み込んでいる間も画面上で演出を行うことで、 主にプレイヤーが「データが読み込み終わるまで止まった画面を見続けなければならない」という状態を回避することができます。

 因みに非同期読み込みはそれなりに負荷の高い処理なので、 パワーがあまり無いCPU( ノートパソコン搭載のCPUや、その中でも特にシングルコアのCPU )では、 非同期読み込みの間ガクッガクッと度々高負荷で動きがぎこちなくなると思います。
 なので、ゲームのプレイ中に次のステージのデータを先読みしてステージをクリア後読み込み画面無しで次のステージに移行! みたいな格好良いことをしようと思った場合は、それなりに性能の高いCPUではないとスムーズに処理されないと考えてください。


<使い方>

 非同期読み込みを行いたいファイルを読み込む前に SetUseASyncLoadFlag( TRUE ) ; を実行して、 非同期読み込み設定にします。
 その上で後述の非同期読み込みに対応した関数を使用してデータ読み込みを行うことで非同期読み込みを行うことができます。

 非同期読み込みが完了したかどうかは CheckHandleASyncLoad か、GetASyncLoadNum を使用して確認します。
 CheckHandleASyncLoad は特定のハンドルの非同期読み込みが完了したかどうかをチェックすることができ、 GetASyncLoadNum は行っている非同期読み込みの数を取得することができます。
 ハンドル別にチェックしたいときは CheckHandleASyncLoad、 全体の非同期読み込みが完了しているかだけチェックしたいときは GetASyncLoadNum を使う、といった感じです。

 尚、非同期読み込みを開始してみたもののファイルが無かったりメモリが足りなかったりして読み込みが失敗した場合は、 ハンドルは自動的に削除されます。
 その場合は CheckHandleASyncLoad の戻り値が -1 になりますので、読み込みが失敗したかどうかはそれで判断してください。


<非同期読み込みに対応している関数>

( 主な関数 )
MakeGraph, MakeScreen, LoadGraph, LoadDivGraph, LoadBlendGraph,
LoadMask, LoadDivMask,
LoadSoundMem, LoadMusicMen,
MV1LoadModel,
CreateFontToHandle,
LoadSoftImage,
LoadPixelShader, LoadVertexShader
FileRead_open, FileRead_seek, FileRead_read

( リファレンスには載っていない関数も含めた一覧 )
MaekGraph, MaekScreen, LoadGraph, LoadReverseGraph, LoadDivGraph, LoadReverseDivGraph, LoadBlendGraph,
ReloadGraph, ReloadDivGraph, ReloadReverseGraph, ReloadReverseDivGraph,
CreateGraphFromMem, CreateDivGraphFromMem, ReCreateGraphFromMem, ReCreateDivGraphFromMem,
CreateGraphFromBmp, CreateDivGraphFromBmp, ReCreateGraphFromBmp, ReCreateDivGraphFromBmp,
CreateGraphFromGraphImage, CreateDivGraphFromGraphImage, ReCreateGraphFromGraphImage, ReCreateDivGraphFromGraphImage,
CreateGraphFromBaseImage, CreateDivGraphFromBaseImage, ReCreateGraphFromBaseImage, ReCreateDivGraphFromBaseImage,
CreateGraphFromSoftImage, CreateDivGraphFromSoftImage, ReCreateGraphFromSoftImage, ReCreateDivGraphFromSoftImage,
MakeMask, LoadMask, LoadDivMask,
LoadSoftImage, LoadSoftImageToMem,
LoadVertexShader, LoadVertexShaderFromMem, LoadPixelShader, LoadPixelShaderFromMem,
LoadSoundMem, LoadSoundMem2, LoadSoundMemBase, LoadSoundMemToBufNumSitei,
LoadSoundMemByMemImageBase, LoadSoundMemByMemImage, LoadSoundMemByMemImage2,
LoadSoundMemByMemImageToBufNumSitei, LoadSoundMem2ByMemImage, LoadBGM,
LoadSoftSound, LoadSoftSoundFromMemImage,
LoadMusicMem, LoadMusicMemByMemImage,
MV1LoadModel,
CreateFontToHandle,
FileRead_open, FileRead_read,

サンプル

 Test1.bmp を 20回読み込んで、読み込みが終わったグラフィックハンドルから描画する

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GrHandle[ 20 ] ; int i ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 非同期読み込み設定に変更 SetUseASyncLoadFlag( TRUE ) ; // Test1.bmp を 20回読み込む for( i = 0 ; i < 20 ; i ++ ) { GrHandle[ i ] = LoadGraph( "Test1.bmp" ) ; } // 同期読み込み設定に変更 SetUseASyncLoadFlag( FALSE ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ(何かキーが押されたらループを抜ける) while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 画面のクリア ClearDrawScreen() ; // 読み込みが終わっていたら画像を描画する for( i = 0 ; i < 20 ; i ++ ) { if( CheckHandleASyncLoad( GrHandle[ i ] ) == FALSE ) { DrawGraph( i * 32, 0, GrHandle[ i ], TRUE ) ; } } // 非同期読み込みの数を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "非同期読み込みの数 %d", GetASyncLoadNum() ) ; // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int CheckHandleASyncLoad( int Handle ) ;

概略 ハンドルの非同期読み込みが完了しているかどうかを取得する

引数 int Handle : チェックしたいハンドル
戻り値TRUE:非同期読み込み中 FALSE:非同期読み込みは終了している -1:エラー

解説  SetUseASyncLoadFlag 関数で非同期読み込みの設定にした状態で非同期読み込みに対応した関数を使用した場合は、 返ってくるハンドルは読み込みが完了するまで使うことができません。
 この関数は、ハンドルの非同期読み込みが終わったかどうかをチェックするために使用します。
 引数にハンドル( グラフィックハンドル、サウンドハンドル、フォントハンドル、ハンドルはなんでも )を渡すと、 非同期読み込みがまだ終わっていない場合は TRUE が、終わっている場合は FALSE が返ってきます。
 尚、確かに正しいハンドルを渡しているはずなのに戻り値がエラーを示す -1 だ、という場合は、非同期読み込みが失敗したことを示します。 ( 非同期読み込みが失敗するとハンドルは自動的に削除されます )

サンプル

 SetUseASyncLoadFlag 関数のサンプルで使用していますので、そちらを参照してください。





宣言int GetASyncLoadNum( void ) ;

概略 非同期読み込み中の処理の数を取得する

引数 なし
戻り値実行しいる非同期読み込み処理の数

解説  SetUseASyncLoadFlag 関数で非同期読み込みの設定にした状態で非同期読み込みに対応した関数を使用して非同期読み込みを開始した場合は、 読み込みが終了するまで少し時間が掛かります。
 各ハンドルが読み込みが完了したかどうかは CheckHandleASyncLoad で確認することができますが、 もっと大雑把に非同期読み込みが終わったかどうかを確認したいときはこの GetASyncLoadNum を使用します。
 この関数は非同期読み込みが終わっていない処理の数を取得します、 単純に戻り値が0なら全ての非同期読み込みは完了していて、 1以上ならまだ非同期読み込みが終わっていないと判断することができます。

 因みに、非同期読み込みが終わっていないハンドルの数ではなく、処理の数です。
 例えば LoadDivGraph で 1000個のハンドルを生成する非同期読み込みが実行されていても、 GetASyncLoadNum では LoadDivGraph の処理一つ分ということで 1 が返ってきます。

 尚、非同期読み込みがファイルが無かったりメモリが足りなかったりして失敗した場合も「非同期読み込み終了」として GetASyncLoadNum の戻り値は小さくなりますので、 エラーが発生したかどうかの確認は CheckHandleASyncLoad を使用する必要があります。

サンプル

 SetUseASyncLoadFlag 関数のサンプルで使用していますので、そちらを参照してください。










文字関係関数

宣言int SetUseCharCodeFormat( int CharCodeFormat ) ;

概略  文字列の引数の文字コードを設定する

引数 int CharCodeFormat : 文字列の引数として使用する文字コード、以下の何れか
  DX_CHARCODEFORMAT_SHIFTJIS     : シフトJIS( デフォルト )
  DX_CHARCODEFORMAT_GB2312       : 簡体字文字
  DX_CHARCODEFORMAT_UHC        : ハングル文字
  DX_CHARCODEFORMAT_BIG5       : 繁体文字
  DX_CHARCODEFORMAT_UTF16LE     : UTF-16 リトルエンディアン
  DX_CHARCODEFORMAT_UTF16BE     : UTF-16 ビッグエンディアン
  DX_CHARCODEFORMAT_WINDOWS_1252 : 欧文( ラテン文字 )
  DX_CHARCODEFORMAT_ISO_IEC_8859_15 : 欧文( ラテン文字 )
  DX_CHARCODEFORMAT_UTF8       : UTF-8
  DX_CHARCODEFORMAT_ASCII       : アスキー文字
  DX_CHARCODEFORMAT_UTF32LE     : UTF-32 リトルエンディアン
  DX_CHARCODEFORMAT_UTF32BE     : UTF-32 ビッグエンディアン
     
戻り値 −1:エラー発生
0:成功

解説  DXライブラリの関数は初期状態では引数として受け取る文字列は文字コード『シフトJIS』形式として処理しますが( Androidアプリの場合は文字コード『UTF-8』形式 )、 『シフトJIS』は主に日本語文字用の文字コードなので、他の言語に対応させたい場合や、 Androidアプリと同じ『UTF-8』を使用したい場合などにこの関数を使用して関数の引数として渡す文字列の文字コードを変更します。
 なお、この関数はいつでも使用できますが、不都合が無ければ DxLib_Init を呼ぶ前の個所でこの関数を呼び、設定を変更しておくことをお勧めします。

サンプル

 ありません



宣言int GetCharBytes( int CharCodeFormat, void *String ) ;

概略  文字列の先頭の文字のバイト数を取得する

引数 int CharCodeFormat : 引数の文字列の文字コード、以下の何れか
  DX_CHARCODEFORMAT_SHIFTJIS     : シフトJIS( デフォルト )
  DX_CHARCODEFORMAT_GB2312       : 簡体字文字
  DX_CHARCODEFORMAT_UHC        : ハングル文字
  DX_CHARCODEFORMAT_BIG5       : 繁体文字
  DX_CHARCODEFORMAT_UTF16LE     : UTF-16 リトルエンディアン
  DX_CHARCODEFORMAT_UTF16BE     : UTF-16 ビッグエンディアン
  DX_CHARCODEFORMAT_WINDOWS_1252 : 欧文( ラテン文字 )
  DX_CHARCODEFORMAT_ISO_IEC_8859_15 : 欧文( ラテン文字 )
  DX_CHARCODEFORMAT_UTF8       : UTF-8
  DX_CHARCODEFORMAT_ASCII       : アスキー文字
  DX_CHARCODEFORMAT_UTF32LE     : UTF-32 リトルエンディアン
  DX_CHARCODEFORMAT_UTF32BE     : UTF-32 ビッグエンディアン
void *String : 先頭の文字のバイト数を取得したい文字列
     
戻り値 −1:エラー発生
0以上:先頭の文字のバイト数

解説  コンピュータ上では文字も数値で扱います( 例えば『A』という文字は数値の『65 ( 16進数の 41 )』として扱うなど )が、 1文字当たりのバイト数は、文字コードや文字によって異なります。( 例えば、文字コード『シフトJIS』では、半角文字は 1文字 1バイト、全角文字は 1文字 2バイト、といった具合にです )
 1文字が何バイトなのかを判別する方法も文字コードによって異なるので、 「何種類もある文字コード毎に何バイトか調べるプログラムを書くのは面倒!」という場合にこの関数を使用すると便利です。

サンプル

 1文字のバイト数が異なる文字が混ざっている文字列『aあbいcうdえeお』の文字の数を数える

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int CharBytes ; int CharNum ; int i ; const char *String = "aあbいcうdえeお" ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 文字の数を数える i = 0 ; CharNum = 0 ; while( String[ i ] != '\0' ) { // 文字のバイト数を取得 CharBytes = GetCharBytes( DX_CHARCODEFORMAT_SHIFTJIS, &String[ i ] ) ; // 文字の数を増やす CharNum ++ ; // 調べる位置を移動する i += CharBytes ; } // 結果を表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "「%s」の文字数は %d です", String, CharNum ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Android用
( 実行には cppファイルを文字コード『Unicode(UTF-8 シグネチャ付き)』で保存する必要があります )
Windows用
#include "DxLib.h" int android_main( void ) { int CharBytes ; int CharNum ; int i ; const char *String = "aあbいcうdえeお" ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 文字の数を数える i = 0 ; CharNum = 0 ; while( String[ i ] != '\0' ) { // 文字のバイト数を取得 CharBytes = GetCharBytes( DX_CHARCODEFORMAT_UTF8, &String[ i ] ) ; // 文字の数を増やす CharNum ++ ; // 調べる位置を移動する i += CharBytes ; } // 結果を表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "「%s」の文字数は %d です", String, CharNum ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }








マイナー関数

宣言int SetAlwaysRunFlag( int Flag ) ;

概略  ウインドウがアクティブではない状態でも処理を続行するか、フラグをセットする

引数 int Flag : 非アクティブでも処理を続行するかを決定するフラグ
     ( TRUE:続行する FALSE:非アクティブの間は処理を停止(標準) )
戻り値 −1:エラー発生
0:成功

解説  DXライブラリをウインドウモードで起動した場合、ソフトのウインドウが 非アクティブ状態になるとデフォルトの状態では再びウインドウがアクティブに なるまでソフトの処理は停止します。
 が、この関数で非アクティブ時にも処理を続行する設定にすることにより、 ウインドウが非アクティブ時でもソフトの処理を実行しつづけることが出来ます。  DXライブラリでバックグラウンドで何か処理を行うといった用途のソフトを 作成されることは非常にまれですが、そのようなソフトを作る場合に有効です。

サンプル

 ありません



宣言int SetOutApplicationLogValidFlag( int Flag ) ;

概略 ログ出力を行うか否かのセット

引数 int Flag : ログ出力を行うか否かのフラグ(TRUE:行う FALSE:行わない)
戻り値 0:成功
 −1:エラー発生

解説  DXライブラリは通常デバッグ情報用のログファイルである『Log.txt』にデバッグ情報を出力します。この関数はその出力を抑制する場合に使用します。

 なおこの関数を他の全てのDXライブラリの関数より先に( DxLib_Init や ChangeWindowMode よりも先に ) FALSE を渡して呼び出すことにより、『Log.txt』を作成しないようにすることができます。

サンプル

 ありません



宣言 int SetUseDXArchiveFlag( int Flag ) ;

概略  DXアーカイブファイルの読み込み機能を使うかどうかを設定する

引数 int Flag : アーカイブファイルの読み込み機能を使用するかどうかのフラグ
          ( TRUE:使用する FALSE:使用しない )
戻り値 −1:エラー発生
0:成功

解説  DXライブラリは DxaEncode.exe で作成できるアーカイブファイルをフォルダに見立てて使うことが出来ますが、 この関数はその機能を使うかどうかを設定します。
サンプル

 ありません




宣言 int SetDXArchiveExtension( char *Extension ) ;

概略  検索するDXアーカイブファイルの拡張子を変更する

引数 char *Extension : 変更後の検索拡張子
戻り値 −1:エラー発生
0:成功

解説  DXライブラリは DxaEncode.exe で作成できるアーカイブファイルをフォルダに見立てて使うことが出来ますが、 拡張子が標準の『dxa』のままだと如何にも『DXライブラリを使ってます』と言っているようなものなので、 それが嫌なときにDXアーカイブファイルの拡張子を変更すると同時にこの関数で変更後の拡張子のファイルをDXライブラリがアーカイブファイルだと見なすように設定してやります。
サンプル

 ありません




宣言 int SetDXArchiveKeyString( char *KeyString ) ;

概略  DXアーカイブファイルの鍵文字列を設定する

引数 char *KeyString : 鍵文字列
戻り値 −1:エラー発生
0:成功

解説  DXライブラリは DxaEncode.exe で作成できるアーカイブファイルを使うことが出来ますが、 そのアーカイブファイルには作成時にパスワード(鍵文字列)を設定することが出来ます。(詳しくは DXArchive の readme.txt を参照して下さい)
 ただ、アーカイブファイルにパスワードが設定されている場合は、DXライブラリで使用する際も予めこの関数で使用するアーカイブファイルのパスワードを教えておく必要がある、というわけです。
サンプル

 ありません




宣言 int SetEmulation320x240( int Flag ) ;

概略  640x480の画面で320x240の画面解像度にするかどうかのフラグをセットする、640x480以外の解像度では無効

引数 int Flag : この機能を有効にするかどうか( TRUE:有効 FALSE:無効 )
戻り値 −1:エラー発生
0:成功

解説  320x240という低解像度の画面を使用して古きよきファミコン位の頃のゲーム画面を表現してみたいと思うときがあります。
 ですが、最近のグラフィックチップやモニタでは320x240という解像度に対応していないことが偶にあり(ノートPCで多いようです)そのような環境では SetGraphMode 関数で320x240画面にしても正常にフルスクリーン表示されません。
 それでもどうしてもフルスクリーン表示したいという場合は別の方法を使って320x240の画面をモニタ一杯に表示する必要があるわけですが、 この関数はその手段の内の一つです。

 まず SetGraphMode( 640, 480, 32 ) ; を実行して、画面モードが640x480にします、次にこの関数に TRUE を渡して呼び出すと640x480の画面に320x240の画面を2倍拡大して表示されます。
 要は320x240の画面モードに対応していないなら、640x480の画面に320x240の画面を2倍拡大して、擬似的に320x240の画面を表現しようというわけです。
 ただ、320x240の画面には対応しているけど、この関数の機能( 320x240を2倍拡大表示する機能 )には対応していない、という場合もありますので、 この関数を使用する際は、必ずソフトウエア側にオプションとして付けるようにして下さい。( デフォルトでは320x240の画面を使用して、 オプションとしてこの関数を使用するかどうかを決められる等 )

サンプル

 ありません




宣言int SetUse3DFlag( int Flag ) ;

概略3D機能を使うか、のフラグをセット

引数 Flag : 3D機能を使うかを指定するフラグ情報
    TRUE  : 使用する(デフォルト)
    FALSE : 使用しない
戻り値 0:成功
 −1:エラー発生

解説  DXライブラリの回転描画、拡大描画、半透明描画加算ブレンド描画、 描画輝度設定等はすべてグラフィックカードの3D機能を用いて実現して います。ですが、グラフィックカードは色々かメーカーが製造しており 機能や性能はメーカーごと、機種ごとにそれぞれ違いますので、3D機能も 機種によって結果に違いが出たり時には利用者の全く意図しない結果が 出てしまったりすることがあります。
 そこでこの関数はグラフィックカード同士の結果の差異が多い3Dの 機能を使用するか否かを設定する事が出来ます。3Dの機能を停止する 事により描画機能の低下は免れませんが、その分ソフトの安定性は高まる ことになります。
(とはいえ3D機能を使わないことによる機能制限の概念などには技術的な 話がついて回るので、ある程度これらの話に詳しい方のみ使うように してください)


 3D機能を停止する事により発生する機能制限は描画関数全般の速度低下、です。 それだけと言えばそれだけですが、DXライブラリ利用目的の殆どは描画関係だと 思いますので、かなり大きい制限だと思います。

サンプル

 ありません。



宣言int SetWaitVSyncFlag( int Flag ) ;

概略 ScreenFlip関数 実行時にCRTの垂直同期信号待ちをするかのフラグセット

引数 Flag : CRTの垂直同期信号を待つか否かを決めるフラグ情報
      TRUE : 待つ(デフォルト)
      FALSE : 待たない
戻り値 0:成功
 −1:エラー発生

解説  ScreenFlip関数の実行時にCRTの垂直同期信号を待つか、を 決めるフラグを設定する関数です。基本的に待ったほうが画面の ちらつきが減り綺麗に表示されます。
 この関数は垂直同期信号の意味を理解していて、その上で状態を 変更したい方だけが使用してください。恐らく普通は変更する必要は ないと思います。

!注意!

 この関数は Ver3.0 以降( DirectX9版以降 )では DxLib_Init の前に呼んだ場合のみ効果が現れる関数に仕様が変更となりました。
 DxLib_Init を呼んだ後にこの関数を呼んでも効果はありませんので注意してください。

サンプル

 ありません



宣言int SetUseDivGraphFlag( int Flag ) ;

概略  必要ならグラフィックの分割を行うか否かを設定する

引数 int Flag : 必要ならグラフィックの分割を行うか否かを決定するフラグ
        ( TRUE : 行う(デフォルト)   FALSE : 行わない )
戻り値 −1:エラー発生
0:成功

解説  DXライブラリでは標準でパソコンに搭載されているグラフィックカードに 3Dアクセラレータ機能が搭載されている場合は、その高速なハードウエア機能を 使い2Dグラフィック描画を実現します。(3Dアクセラレータ機能は当然 3D空間を描画するためにあるのですが、使いようによっては平面的な2D 描画にもつかえるのです。)
 そして3Dアクセラレータを使って絵を画面に描画する場合、描画する絵の サイズは3Dアクセラレータの仕様上 幅・高さ共に2の n 乗でなければ なりません。( 2のn乗の数値 → 1 2 4 8 16 32 64 128 ... )  つまり、幅300 高さ200 の絵や、幅640 高さ480 の絵などは、そのままでは 描画することが出来ないのです。

 この問題を解決する方法は2つあります。

1. 描画したい絵を、描画したい絵より大きい2のn乗の大きさを持つ絵として
  処理する。
2. 複数の2のn乗の大きさを持つ絵に分解して、結果的にひとつの絵に見える
  ように処理する。

 1の方法は、たとえば幅300 高さ300(以後 300x300 と記述します)の大きさを 持つグラフィックを表示したい場合、2のn乗で300より大きい数値である512 の値を採用し、512x512 の大きさを持つ絵として扱う方法です。

 2の方法は、たとえば 300x300 の大きさをもつ絵を、2のn乗の大きさを持つ 複数の絵で扱う方法で、具体的には 256x256 の絵と、64x256 の絵、 256x64 の絵、 64x64 の絵の合計4つの絵を継ぎはぎして 300x300 というひとつの絵を処理 する方法です。

 どちらも一長一短で、まず1の方法は 300x300 の絵を 512x512 の絵として扱う ため、使われていない 幅212 高さ212 の部分はそのまま無駄になってしまいます。 2の方法では複数の絵で表現するために1の方法よりも無駄は省けますが、沢山の 絵を扱うことになり、その分1の方法よりも処理速度は遅くなります。

 DXライブラリはデフォルトでは2の方法を使いますが、描画速度を優先させ たい場合にはこの関数で処理形態を変更することが出来ます。
 この関数に TRUE を渡した場合は2、FALSE を渡した場合は1の処理で絵が 描画されますので、状況に応じて使い分けてください。
(この設定をどうするにしろ、もともとの絵が2のn乗の大きさだった場合は どちらの設定でも同じ処理がされるのですが…)

 なお、この関数を使用して処理形態を変えた後に LoadGraph 関数などを使って 作られたグラフィックから変更が適用されます。1の処理形態になるか2の処理 形態になるかはグラフィックを読み込んだ時に決定され、既にメモリに読み込ま れていグラフィックに対しては SetUseDivGraphFlag 関数は何の影響も及ぼしま せんので注意してください。

サンプル

 ありません



宣言int LoadPauseGraph( char *FileName ) ;

概略 フォーカスが他のソフトに移っているときにバックグラウンドに表示するグラフィックのロード、登録(NULL で解除)

引数 char *FileName : バックグラウンドに描画するグラフィックファイルパス
戻り値 0:成功
 −1:エラー発生

解説   ウインドウモード時に他のソフトのウインドウがアクティブになって
DXライブラリソフトが一時停止している間常にバックグラウンドで
表示しておくグラフィックのロード、および登録を行います。

サンプル

 ありません



宣言int ScreenCopy( void ) ;

概略  画面コピー関数、画面の裏ページ(普段は表示されていない)を 表ページ(普段表示されている)にコピーする

引数 なし
戻り値 −1:エラー発生
0:成功

解説  ScreenFlip 関数は裏画面と表画面の内容を取りかえる関数 でしたが、この関数は『取りかえる』のではなくコピーします、複写 です。
 『取りかえる』場合、裏画面に来る画像は前々回フレームで扱った ものとなり、その画像をリサイクルすることは困難ですが、複写では 裏画面には今の今まで扱っていた画像が残りますので、画面の一部だけ 更新して再び表画面にコピー表示する等のことが出来、このような場合 画面すべてを更新するよりも大幅な処理負荷の軽減を果たす事が出来ます。

 基本的には ScreenCopy関数 は ScreenFlip関数 よりも多少処理負荷が ありますので上記のような処理をしない場合は ScreenCopy関数 を使う ことによるご利益はありません。

サンプル

 ありません



宣言int GetColorBitDepth( void ) ;

概略 画面の色ビット数を得る

引数 なし
戻り値画面モードのカラービット数

解説  画面モードのカラービット数を得ます。これはSetGraphMode関数で言うところの ColorBitNum 引数に当たる数値です。
 これは主にウインドウモードで実行するソフト等で実行時にはどのカラービット数 かわからない時等に使います。

サンプル

 ありません



宣言int SaveDrawScreen( int x1, int y1, int x2, int y2, char *FileName ) ;

概略 現在描画対象になっている画面をBMP形式で保存する

引数 int x1 ,y1 : 保存する領域の左上座標
int x2 ,y2 : 保存する領域の右下+1座標
char *FileName : 保存時のファイル名
戻り値 0:成功
 −1:エラー発生

解説  現在描画対象になっている画面の特定領域をBMP形式の画像 ファイルにして記憶装置(ハードディスク等)に保存します。

 保存したい領域の一番左上に位置するドット座標を x1,y1 に 保存したい領域の一番右下+1に位置するドット座標を x2,y2 に セットします。

 例 640×480の画面全体を Save.bmp として保存する

SaveDrawScreen( 0 , 0 , 640 , 480 ) ;

 x2,y2 の値を『保存したい領域の一番右下+1に位置するドット 座標』にしたのはその方が直感的である、と判断したためです。 ( 例 『保存したい領域の一番右下に位置するドット座標』にした場合
SaveDrawScreen( 0 , 0 , 639 , 479 ) ;
 のように分かりにくく、間違いやすい記述をしなくてはならない。)

<補足>
 拡張子『.bmp』は自動的には付きませんので注意してください。

サンプル

 test1.bmp を読み込み、赤成分を抜いた状態で画面に描画し、その結果を Save.bmp というファイル名で保存します。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GraphHandle ; // 画面モードを16ビットカラーにセット SetGraphMode( 640 , 480 , 16 ) ; // DXライブラリ初期化 if( DxLib_Init() == -1 ) return -1 ; // 画像のロード GraphHandle = LoadGraph( "test1.bmp" ) ; // 描画輝度を設定、赤成分を0にする SetDrawBright( 0 , 255 , 255 ) ; // 画面に描画 DrawGraph( 0 , 0 , GraphHandle , FALSE ) ; // 画面全体を Save.bmp として保存 SaveDrawScreen( 0 , 0 , 640 , 480 , "Save.bmp" ) ; // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int EnumFontName( char *NameBuffer , int NameBufferNum ) ;

概略  使用可能なフォントの名前を列挙する

引数 char *NameBuffer : フォントの名前を格納する2次元配列の先頭アドレス
int NameBufferNum : 列挙するフォント名の最大数
戻り値 列挙したフォント名の数

解説  この関数は、パソコンにインストールされているフォントの名前を 列挙することが出来ます。
 ChangeFontCreateFontToHandle 等の関数は任意の名前を持つフォントの データハンドルを作成することが出来るものの、標準以外のフォントは パソコン個々でインストールされているものが違ったり、又はなかったり するので、あるかどうかもわからないフォントを下手に指定することは あまり望ましくありません。

 そんな時にこの関数です。
 この関数はパソコンにインストールされているDXライブラリで使用 可能なフォントの名前をすべて列挙し、指定の文字列配列に格納することが 出来ます。
 この関数で列挙したフォントはすべて ChangeFont や CreateFontToHandle 等で 使うことが出来るので、自分の使いたいフォントがパソコンにインストール されているか調べたい時や、サウンドノベルなどの文章表示に使うフォントを プレイヤーに選択してもらったりする時に利用できます。

 さて使い方です。
 まず一つのフォントの名前を格納するのに、DXライブラリでは余裕を 持って半角63文字分入る char 型配列を一つを使います。

char NameBuffer[64] ; // フォント一個分
 つまり、十個分のフォント名を格納するためにはこれが十個必要なわけ ですから

char NameBuffer[10][64] ; // フォント十個分

 という2次元配列になります。
 とりあえずパソコンにインストールされているフォント10個分の名前を 取得する例を次に示します。
char NameBuffer[10][64] ; EnumFontName( &NameBuffer[0][0] , 10 ) ;
 とまあこんな感じです。これで NameBuffer[0] から NameBuffer[9] までの 文字列配列にフォント名が入ります。
 もしインストールされているフォントが10個以下だった場合はすべての 配列にはフォント名は格納されません、実際列挙されたフォントの数は EnumFontName 関数の戻り値として返って来るので、この値を参照することに より幾つのフォントが列挙されたのか知ることが出来ます。

char NameBuffer[10][64] ; int FontNum ; FontNum = EnumFontName( &NameBuffer[0][0] , 10 ) ;
 これでもし FontNum に5が代入されたら、10個分のフォント名が列挙 出来る配列を渡したものの、実際には5個のフォント名しか列挙されなかった、 ということになります。

 次に列挙したフォントをDXライブラリの文字列描画で使う方法を示します。
 例えば上の例で列挙した一番最初のフォントを描画用フォントにしたい場合は

ChangeFont( NameBuffer[0] ) ;
 とすることで変更できます。もし0番目に『MS 明朝』というフォント名が 格納されていたらこれ以後文字列描画に使われるフォントは MS 明朝体 に 変更されます。


 これで列挙して利用するまでの一通りの説明は終りましたが、次に数を限定せずに すべてのフォントを列挙する方法を解説したいと思います。
 実際はバッファの数を200個などにしてしまえば、恐らくインストールされている すべてのフォントを列挙することが出来るとは思いますが、世の中どれだけ沢山の フォントをパソコンにインストールしている人がいるのかわかりませんので、一応 どんな状況でもすべてのフォント名を列挙する方法を示しておきたいと思います。

 まず EnumFontName 関数の第1引数、つまりフォントネームを格納する配列 のアドレスを NULL にし、第2引数を0にして関数を呼び、戻り値を得ます。

int FontNum ; FontNum = EnumFontName( NULL , 0 ) ;
 すると、フォントネームは取得できないものの、フォントの数だけはしっかり 戻り値として返ってきます。この時戻り値として返ってくるのはパソコンに インストールされているすべてのフォントの数です。
 つまりこの戻り値の数分だけフォント名を格納出来るサイズを持った配列が あればすべてのフォント名を列挙することが出来ます。が、実際にはプログラムの 実行中に動的にサイズを変えられる配列は存在しません。
 ので、ここはCの標準関数である malloc を使います。この関数はパソコン上の 空きメモリから任意のサイズのメモリ領域を確保することが出来るので、これを 使ってすべてのフォント名を格納できるメモリ領域を確保することにします。

 確保すべきメモリの量は 64バイト×戻り値 となります。64バイトというのは 言うまでもなく一つのフォント名に必要なメモリ領域です。(半角1文字の情報を 表現するのに必要なデータサイズは1バイト)
 確保したメモリ領域のアドレスは char 型のポインタに格納します。

#include <malloc.h> char *NameBuffer ; int FontNum ; FontNum = EnumFontName( NULL , 0 ) ; // フォント名の数分だけメモリを確保 NameBuffer = ( char * )malloc( 64 * FontNum ) ;
 次に確保したこのメモリ領域にフォント名を列挙し格納します。


#include <malloc.h> char *NameBuffer ; int FontNum ; FontNum = EnumFontName( NULL , 0 ) ; NameBuffer = ( char * )malloc( 64 * FontNum ) ; EnumFontName( NameBuffer , FontNum ) ;
 これで確保したメモリ領域にデータを格納することができました。
 実際に使う時の注意としては、確保したメモリ領域は二次元配列ではないので、 フォント名を指定する時は

確保したメモリの先頭アドレス + 取得したフォント名の番号 × 64

 と指定してやる必要があると言うことです。


例 3番目に列挙されたフォント名を持つフォントに変更する


ChangeFont( NumeBuffer + 3 * 64 ) ;


 もう一つ注意すべきことは、列挙したフォント名が要らなくなったら確保した メモリ領域を開放してやる必要があると言うことです。最後にはしっかり free 関数でメモリ領域を開放するということを忘れないで下さい。


free( NameBuffer ) ;

サンプル

 10個分のフォント名が入る配列にフォント名を最大10個列挙し、4番目に 列挙されたフォントを描画用フォントにして画面に文字を描画します。
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char NameBuffer[10][64] ; int FontNum ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1 ; // フォントを最大10個列挙 FontNum = EnumFontName( &NameBuffer[0][0] , 10 ) ; // 4個以下しかフォント名が列挙されなかったら次の処理は行わない if( FontNum >= 4 ) { // 4個目に列挙されたフォント名を持つフォントに変更 ChangeFont( NameBuffer[3] ) ; // 変更したフォントで文字を描画し、その後フォント名も描画 DrawString( 100, 100, "4個目のフォントはなんだろう" , GetColor( 255, 255, 255 ) ) ; DrawString( 100, 130, NameBuffer[3] , GetColor( 255, 255, 255 ) ) ; } // キー入力を待つ WaitKey() ; // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }



 インストールされているすべてのフォントの名前を列挙し、列挙に必要なメモリを 確保したあと、フォント名を格納します。その後フォントのサイズを大きくし、 列挙した一番目から十番目までのフォント名を画面に描画します。
Windows用
#include "DxLib.h" #include <malloc.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char *NameBuffer ; int FontNum ; int i ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1 ; // フォントの数を取得 FontNum = EnumFontName( NULL , 0 ) ; // メモリの確保 NameBuffer = ( char * )malloc( FontNum * 64 ) ; // フォント名の取得 EnumFontName( NameBuffer , FontNum ) ; // フォントのサイズを変更 SetFontSize( 32 ) ; // 最初から10番目までのフォント名を画面に描画 if( FontNum >= 10 ) FontNum = 10 ; for( i = 0 ; i < FontNum ; i ++ ) { // フォントの変更 ChangeFont( NameBuffer + 64 * i ) ; // フォント名の描画 DrawString( 100 , i * 40 , NameBuffer + 64 * i , GetColor( 255, 255, 255 ) ) ; } // 確保したメモリの解放 free( NameBuffer ) ; // キー入力を待つ WaitKey() ; // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }



宣言int DrawVString( int x, int y, char *String, int Color ) ;

概略 文字列を縦に描画する

引数 x , y  : 文字列を描画する領域の左上の座標
String : 描画する文字列のポインタ
Color  : 描画する文字列の色
戻り値 0:成功
 −1:エラー発生

解説   DrawString 関数の縦書きバージョンです。
 具体的には文字列が90度回転した状態で描画されます。
 なので、縦書き用フォントを使用しないと日本語は横向きに描画されてしまいます。
(縦書き用フォントはフォント名の前に『@』を付けることによって縦書き 用フォントを指定したことになります。(縦書き用フォントが用意されていない フォントもありますのでご注意ください))

サンプル

 描画用フォントを縦書き用フォントに変更した後、文字列を描画する

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 return -1; // エラーが起きたら直ちに終了 // 縦書きフォントを指定 ChangeFont( "@MS 明朝" ) ; // 文字列を縦書き DrawVString( 0, 0, "縦書きフォント", GetColor( 255,255,255 ) ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int DrawVStringToHandle( int x, int y, const char *String, int Color, int FontHandle ) ;

概略 フォントハンドルを使用して文字列を縦に描画する

引数 int x , y : 文字列を描画する起点座標
char *String : 描画したい文字列のポインタ
int Color : 描画する文字列の色を示すカラーコード
int FontHandle : 描画に使用するフォントのデータ識別番号(フォントハンドル)
戻り値 0:成功
 −1:エラー発生

解説   DrawStringToHandle 関数の縦書きバージョンです。
 具体的には文字列が90度回転した状態で描画されます。
 なので、縦書き用フォントを使用しないと日本語は横向きに描画されてしまいます。
(縦書き用フォントはフォント名の前に『@』を付けることによって縦書き 用フォントを指定したことになります。(縦書き用フォントが用意されていない フォントもありますのでご注意ください))

サンプル

 縦書き用フォントを使用したフォントハンドルを作成した、文字列を描画する

Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int FontHandle ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 return -1; // エラーが起きたら直ちに終了 // 縦書きフォントを作成 FontHandle = CreateFontToHandle( "@MS 明朝", -1, -1, -1 ) ; // 文字列を縦書き DrawVStringToHandle( 0, 0, "縦書きフォント", GetColor( 255,255,255 ), FontHandle ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int CreateGraphFromMem( void *MemImage, int MemImageSize ) ;

概略  メモリ上の画像ファイルイメージからグラフィックハンドルを作成する

引数 MemImage : 画像ファイルの内容が丸々存在するメモリ上のアドレス
MemImageSize : 画像ファイルのサイズ
戻り値 −1:エラー発生
0以上:新しいグラフィックハンドル

解説  グラフィックハンドルの作成は主に LoadGraph などで行い ますが、これらの関数ではDXライブラリが読み込みに対応した グラフィック形式(BMP,PNG,JPEG,ARGB,TGA, DDS)で保存されたファイルが誰でもアクセス出来るディスク(又は それ以外の補助記憶装置)上に存在していなければなりません。
 DXライブラリが対応しているグラフィック形式は決して特別な ものではないので、グラフィックが保存されているディスクに アクセスすれば誰でもソフトで使われている画像を閲覧する事が 出来てしまいます。ゲーム中では苦労しないと見れない画像も 同じように簡単に見れてしまうので、普通に考えてもこの状況は あまり好ましくありません。

 と、いうところで思いつくのがファイルの暗号化です。
 例えば、画像ファイルのデータ全てにNOT演算( ~ )を掛けて おけば、NOT演算されたデータを元に戻さない限り誰も画像 ファイルの中身を覗く事は出来ません。
 しかし、そのままではDXライブラリでも読み込むことが 出来ませんので、読み込む前にデータを元に戻す必要があります。

 その手順は、ファイルをまずメモリ上に読み込み、元のデータに 戻す処理を施した後・・・・後、どうすればいいのでしょうか?
 LoadGraph で読み込むにはファイルとしてディスク上に存在して いなければなりませんので、例えば一時的に元に戻したデータを ファイルに保存して、LoadGraph でグラフィックハンドルを作成 した直後に削除する・・・確かにこの方法であれば実現可能です。
 ・・・ですが、あんまり良い方法とはとても思えません。さて どうしましょう。

 という時に役に立つのがこの CreateGraphFromMem という関数です。
 この関数は、DXライブラリが読み込むことが出来るグラフィック ファイル(BMP,PNG,JPEG,ARGB,TGA,DDS) のデータを、ファイルからではなくメモリ上から読み込んで グラフィックハンドルを作成出来ます。

 第一引数の MemImage にはグラフィックファイルのデータが 丸々存在するメモリ領域の先頭アドレスを、第二引数の MemImageSize にはメモリ上に存在するグラフィックファイルデータのサイズを バイト単位で渡します。

 用途は主に先ほどの例の通り、閲覧可能なファイル形式のまま ディスクに画像データを保存しておきたくない時等に使用します。

 尚、CreateGraphFromMem 関数に渡したグラフィックファイル データはグラフィックハンドルが作成し終わった後は必要あり ませんので、データを格納していたメモリ領域を malloc や new で確保していた場合は解放してしまっても大丈夫です。

<<注意>>
 この関数で作成れたグラフィックハンドルはフルスクリーン画面からタスク切り替え等で一時的にデスクトップ画面に戻った場合、 再度フルスクリーン画面になった時に画像は自動的に復元されません。
 この場合 SetRestoreGraphCallback 関数で登録できる画像復元関数で画像を再度読み込む必要があります。
サンプル

 NOT演算で暗号化された画像ファイル Test1.enc をメモリ上に 読み込んで、元の画像データに戻した後 CreateGraphFromMem 関数を 使ってグラフィックハンドルを作成する。
Windows用
#include "DxLib.h" #include <stdio.h> #include <malloc.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { FILE *fp ; unsigned char *Data ; int Size, GrHandle, i ; // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1 ; // ファイル test1.enc を丸ごとメモリに読み込む { // バイナリモードで開く fp = fopen( "test1.enc", "rb" ) ; // ファイルのサイズを得る { // ファイルポインタをファイルの末端に fseek( fp, 0L, SEEK_END ) ; // ファイルの末端でファイルポインタのアドレスを // 取得すればそれはファイルのサイズ Size = ftell( fp ) ; // ファイルポインタをファイルの先頭に戻す fseek( fp, 0L, SEEK_SET ) ; } // ファイルを丸々読み込めるメモリ領域を確保する Data = ( unsigned char * )malloc( Size ) ; // ファイルを丸々読み込む fread( Data, Size, 1, fp ) ; // ファイルを閉じる fclose( fp ) ; } // NOT演算の暗号を解く for( i = 0 ; i < Size ; i ++ ) { // NOT演算されたデータは、もう一回NOT演算をすると元に戻る Data[i] = ~Data[i] ; } // 元に戻ったグラフィックデータでグラフィックハンドルを作成する GrHandle = CreateGraphFromMem( Data, Size ) ; // グラフィックを作成し終わったらグラフィックデータを // 格納していたメモリ領域を開放する free( Data ) ; // 画像を画面に描画 DrawGraph( 0, 0, GrHandle, FALSE ) ; // キーが押されるまで待つ WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフト終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int ReCreateGraphFromMem( void *MemImage, int MemImageSize, int GrHandle ) ;

概略  メモリ上の画像ファイルイメージから既存のグラフィックハンドルにデータを転送する

引数 MemImage : 画像ファイルの内容が丸々存在するメモリ上のアドレス
MemImageSize : 画像ファイルのサイズ
GrHandle : 画像を転送するグラフィックハンドル
戻り値 −1:エラー発生
0:成功

解説  グラフィックハンドルに、メモリ上の画像ファイルイメージを転送します。
(画像を転送するグラフィックハンドルを引数として渡す以外は基本的に CreateGraphFromMemと同じです)

 主に SetRestoreGraphCallback で登録する画像復元関数内で使用します。
サンプル

 ありません


宣言int ReloadFileGraphAll( void ) ;

概略  画像ファイルから作成したグラフィックハンドルに再度画像ファイルから画像を読み込む

引数 なし
戻り値 −1:エラー発生
0:成功

解説  LoadGraph や LoadDivGraph を使用して画像ファイルから画像を読み込み、作成したグラフィックハンドルに、 再度画像ファイルから画像を読み込み、グラフィックハンドルに転送します。
 LoadGraph や LoadDivGraph で読み込んだ画像ファイルが既に無い場合は関数は失敗します。
 主に SetRestoreGraphCallback で登録する画像復元関数内で使用します。
サンプル

 ありません


宣言int SetRestoreGraphCallback( void (* Callback )( void ) ) ;

概略  グラフィックハンドル復元関数を登録する

引数 Callback : グラフィックハンドルを復元する処理を行うコールバック関数
戻り値 −1:エラー発生
0:成功

解説  フルスクリーンモードでソフトを実行している時に、 不意に別のソフト(セキュリティソフト等)がアクティブになり一時的にデスクトップ画面に戻ってしまうことがあります。 (他にも ALT+TAB キーで自ら別のソフトをアクティブにすることでもデスクトップ画面に戻ります)
 このとき、グラフィックハンドルが持つ画像の情報は失われてしまいます。

 しかし、一時的にデスクトップ画面になった後、 再びDXライブラリを使用したソフトがアクティブになりフルスクリーン画面に戻ると、 何事も無かったかのように画像は描画されます。
 それは何故かといいますと、 DXライブラリが LoadGraph 関数 や LoadDivGraph 関数等の画像ファイルから読み込まれて作成されたグラフィックハンドルの画像を、 ひそかに再度画像ファイルから読み込んでいるからです。

 というわけで、画像ファイルから読み込まれた画像は何もしなくても問題なく復元されるのですが、 上記の復元のカラクリでは MakeGraph で作成したグラフィックハンドルに GetDrawScreenGraph で読み取った画像や、 CreateGraphFromMem で作成されたグラフィックハンドルの画像は復元されません。 というのも、これらの情報は画像ファイルのように復元しなければいけない時に、 GetDrawScreenGraph や CreateGraphFromMem が呼ばれたときに在った画像の情報は既に失われている可能性が高いからです。
(その点から言えば、画像ファイルも復元時にディスクから削除されてしまっていたりすると復元されません)

 そんなわけで、これらのグラフィックハンドルについてはDXライブラリにはフルスクリーンが解除されてしまった時点で何の画像が入っていたのかを知る術が無く、 これはグラフィックハンドルにどんな画像が在るべきなのかを一番よく知っている人、つまり、ライブラリを使用しているプログラマーに任せるしかない、 というわけでこの SetRestoreGraphCallback が登場するわけです。

 この関数は失われた画像をグラフィックハンドルに再度読み込む処理を行う関数を登録することができ、 この関数に渡した関数はデスクトップ画面からフルスクリーン画面に戻る際に呼ばれます。

 失われた画像を再度読み込む関数では、最初に LoadGraph や LoadDivGraph で画像ファイルから読み込んだグラフィックハンドルの画像を ReloadFileGraphAll を使用して再度画像ファイルから読み込み直した後、GetDrawScreenGraph で読み込んだ画像を再度同じ画像を用意して GetDrawScreenGraph で読み込みなおし、CreateGraphFromMem で作成した画像は ReCreateGraphFromMem で画像を再転送する、 ということをします。
サンプル

 CreateGraphFromMem 関数と LoadGraph 関数で読み込んだ画像を、 復元関数内でそれぞれ ReloadFileGraphAll 関数と ReCreateGraphFromMem 関数で復元するサンプルです。(ESCキーで終了)

Windows用
#include "DxLib.h" #include <stdio.h> #include <malloc.h> int GraphHandle1, GraphHandle2; // ファイルをメモリに読み込む関数 void ReadFile( const char *FilePath, void **BufferPoint, int *BufferSize ) { FILE *fp; // ファイルを開く fp = fopen( FilePath, "rb" ); // ファイルのサイズを得る fseek( fp, 0L, SEEK_END ); // ファイルの読み込み位置を終端にする *BufferSize = ftell( fp ); // 終端の位置はすなわちファイルのサイズ fseek( fp, 0L, SEEK_SET ); // ファイルの読み込み位置を先頭に戻す // メモリの確保 *BufferPoint = malloc( *BufferSize ); // ファイルの読み込み fread( *BufferPoint, *BufferSize, 1, fp ); // ファイルを閉じる fclose( fp ); } // ファイルの復元関数 void ReloadFunction( void ) { void *Buffer; int BufferSize; // ファイルから読み込んだ画像を復元する ReloadFileGraphAll(); // 画像ファイルをメモリに読み込む ReadFile( "Test1.bmp", &Buffer, &BufferSize ); // 画像をグラフィックハンドルに転送 ReCreateGraphFromMem( Buffer, BufferSize, GraphHandle1 ); // メモリの解放 free( Buffer ); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { void *Buffer ; int BufferSize ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 画像復元関数を登録 SetRestoreGraphCallback( ReloadFunction ); // 画像ファイルをメモリに読み込む ReadFile( "Test1.bmp", &Buffer, &BufferSize ); // メモリ上の画像ファイルイメージからグラフィックハンドルを作成 GraphHandle1 = CreateGraphFromMem( Buffer, BufferSize ); // ファイルから画像を直接読み込む GraphHandle2 = LoadGraph( "Test2.bmp" ); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // メインループ(ESCキーが押されたらループを抜ける) while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面のクリア ClearDrawScreen(); // 画像の描画 DrawGraph( 0, 0, GraphHandle1, FALSE ); DrawGraph( 300, 0, GraphHandle2, FALSE ); // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SetCreateSoundDataType( int SoundDataType ) ;

概略  作成する音声データの再生形式を設定する

引数 int SoundDataType : 再生形式の識別値
  ( DX_SOUNDDATATYPE_MEMNOPRESS (デフォルト)
    説明:音声データを直接再生できる状態にしてメモリ上に保存
    読み込み速度:遅い 再生負荷:速い 必要メモリ領域:大きい

   DX_SOUNDDATATYPE_MEMPRESS
    説明: 圧縮されている音声データをメモリ上に保存、再生時に
       リアルタイムで圧縮データを展開、音声データが圧縮されて
       いない場合は DX_SOUNDDATATYPE_MEMNOPRESS よりかえって
       必要メモリ容量、再生負荷、読み込み速度全ての面で不利になる
    読み込み速度:普通 再生負荷:少し重い 必要メモリ領域:普通

   DX_SOUNDDATATYPE_FILE
    説明: 音声データを再生時にファイルからリアルタイムに
       メモリ上に読み込む、音声データが圧縮されている場合は
       読み込んだ時に展開する
    読み込み速度:速い 再生負荷:重い 必要メモリ領域:軽い )
戻り値 −1:エラー発生
0:成功

解説  LoadSoundMem で読み込む音声データの扱いを設定します。
 デフォルトの状態では LoadSoundMem は読み込んだ音声ファイルを、 メモリ上にまるまる保存し、再生に備えます。この方法が一番処理効率が 良いのですが、たとえばBGMに使うような巨大な音声ファイルも この方法で再生しようとすると、とたんに大量にメモリ領域を必要とし、 ファイルからメモリに読み込む時間もかなりかかってしまい、あまり良いことが ありません。
 なので、そんな時にストリーム再生というものをつかいます。
 ストリーム再生とは、例えばBGMを再生する場合、音声データを一度に ファイルからメモリに読み込んで再生に備えるのではなく、再生するときに少し づつファイルから音声データを読み込んで、少しづつ再生するという再生 方式です。
 この方法では、音声ファイル全部をメモリに保存する必要がないので メモリ領域の節約にもなりますし、再生しながらファイルから読み込むので ロードの時間も短くてすみます。いいことがたくさんです。

 このストリーム再生をするためにあるのがこの SetCreateSoundDataType という わけです。引数は、どんな音声再生方法をとるのか、を識別するint 型の 整数値一つで、ファイルからのストリーム再生をしたい場合は、ストリーム再生 したい音声ファイルをロードする前に

SetCreateSoundDataType( DX_SOUNDDATATYPE_FILE ) ;

 としてやるだけで出来るのです。


 ですが、ストリーム再生には再生時にファイルから逐次音声データを読み 込むことになるために、デフォルトの、全て音声データをファイルから読み 込んでおく方法に比べて処理負荷が大きくなります。
 なので、『パン』や『ドカン』などのちょっとした音が保存された音声 ファイルは、ストリーム再生ではなく、デフォルトの全てメモリ上に音声 データを読み込んでおく方法をとった方が良いわけで、このあたりは使いわける 必要があります。

 ちなみに DX_SOUNDDATATYPE_MEMPRESS は DX_SOUNDDATATYPE_FILE と DX_SOUNDDATATYPE_MEMNOPRESS の中間的なものです。
 音声ファイルにはWAVEファイルの他にMP3等のWAVEファイルよりも 容量を小さくしたファイル形式があるのはご存知だと思います。このDXライブラリ でもそれらのファイルを扱う事が出来ますが、DXライブラリが音声を出力 する為に使用している DirectSound はMP3等の所謂『圧縮データ』に対応 していない為、再生する際にはMP3等のデータ形式からPCMという何の 変哲も無い音声データ形式に変換してやる必要があるのです。
 デフォルトの設定ではDXライブラリはこの『変換処理』を LoadSoundMem で ファイルをメモリに読み込んだ時に行います。ですが、MP3からPCMに変換 する処理は決して軽い物ではないので、場合によってはMP3より10倍近い データサイズを持つWAVEファイルを読み込む場合よりも LoadSoundMem に 時間が掛かってしまう場合があるのです。
 そういう時は DX_SOUNDDATATYPE_FILE の出番なわけですが、DX_SOUNDDATATYPE_FILE は『ファイルから少し読み込む』→『少しだけ変換』→『少しだけ再生』を繰り返す ので、少々マシンに掛かる負荷が高いのです。
 そこで今度は DX_SOUNDDATATYPE_MEMPRESS の出番というわけです。
 DX_SOUNDDATATYPE_MEMPRESS も DX_SOUNDDATATYPE_FILE と同じく少しづつ変換、 再生を繰り返すのですが、DX_SOUNDDATATYPE_FILE と違いファイルの中身だけは 全てメモリ上に読み込んでしまいます。これにより DX_SOUNDDATATYPE_FILE では 『ファイルから少し読み込み』→『少しだけ変換』→『少しだけ再生』だった過程が 一つ減り『少しだけ変換』→『少しだけ再生』になるわけです。

 DX_SOUNDDATATYPE_MEMPRESS と DX_SOUNDDATATYPE_FILE どちらが良いかと訊かれると 少し悩みますが、無圧縮のWAVEファイルに関しては DX_SOUNDDATATYPE_FILE を、 圧縮された音声ファイルに関しては DX_SOUNDDATATYPE_MEMPRESS をお使いになる事を お勧めしておきます。


注意!…
 この関数で DX_SOUNDDATATYPE_NOMEMPRESS 以外の選択をした場合は、 以後 ProcessMessage の呼び出し間隔を0.2秒以上空けないようにして下さい。 (0.2秒以上空け続けると再生中の音が途切れる現象が発生します)
 というのも、解説に記載されている『少し読み込んで(あと変換して)再生する』 という処理が ProcessMessage の中で行われているからです。(汗)
サンプル

 BGM.wav という音声ファイルをファイルから逐次読み込むストリーム再生方式で 再生する。(BGNM.wavというファイルはありませんので、自前で用意してください)
Windows用
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int SoundHandle ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // 再生形式をファイルからストリーム再生する、に設定 SetCreateSoundDataType( DX_SOUNDDATATYPE_FILE ) ; // BGM.wav を読み込み、ハンドルを取得する SoundHandle = LoadSoundMem( "BGM.wav" ) ; // 再生 PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ; // 何かキーが押されるまで待つ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ){} // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int LoadSoundMemByMemImage( void *FileImageBuffer, int ImageSize ) ;

概略  メモリ上の音声ファイルイメージからサウンドハンドルを作成する

引数 FileImageBuffer : 音声ファイルの内容が丸々存在するメモリ上のアドレス
ImageSize : 音声ファイルのサイズ
戻り値 −1:エラー発生
0以上:新しいサウンドハンドル

解説  用途や存在意義は CreateGraphFromMem と同じですので、 その辺りの説明は CreateGraphFromMem の解説をご参照ください。

 メモリ上にDXライブラリが読み込める音声ファイル(WAV,MP3, OGG)のデータが丸々メモリ上にある場合、この関数を使用すれば メモリ上の音声ファイルイメージからサウンドハンドルを作成出来ます。

 サウンドハンドルを作成した後は LoadSoundMemByMemImage に渡した 音声ファイルイメージは必要ありませんので、メモリ領域を確保して データを格納していた場合は解放してしまっても問題ありません。
サンプル

 NOT演算で暗号化された音声ファイル TestWav.enc をメモリ上に 読み込んで、元の音声データに戻した後 LoadSoundMemByMemImage 関数を 使ってサウンドハンドルを作成する。
Windows用
#include "DxLib.h" #include <stdio.h> #include <malloc.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { FILE *fp ; unsigned char *Data ; int Size, SoundHandle, i ; // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1 ; // ファイル testWav.enc を丸ごとメモリに読み込む { // バイナリモードで開く fp = fopen( "testWav.enc", "rb" ) ; // ファイルのサイズを得る { // ファイルポインタをファイルの末端に fseek( fp, 0L, SEEK_END ) ; // ファイルの末端でファイルポインタのアドレスを // 取得すればそれはファイルのサイズ Size = ftell( fp ) ; // ファイルポインタをファイルの先頭に戻す fseek( fp, 0L, SEEK_SET ) ; } // ファイルを丸々読み込めるメモリ領域を確保する Data = ( unsigned char * )malloc( Size ) ; // ファイルを丸々読み込む fread( Data, Size, 1, fp ) ; // ファイルを閉じる fclose( fp ) ; } // NOT演算の暗号を解く for( i = 0 ; i < Size ; i ++ ) { // NOT演算されたデータは、もう一回NOT演算をすると元に戻る Data[i] = ~Data[i] ; } // 元に戻ったサウンドデータでサウンドハンドルを作成する SoundHandle = LoadSoundMemByMemImage( Data, Size ) ; // サウンドハンドルを作成し終わったらサウンドデータを // 格納していたメモリ領域を開放する free( Data ) ; // 音声を再生 PlaySoundMem( SoundHandle, DX_PLAYTYPE_BACK ) ; // キーが押されるまで待つ WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフト終了 return 0 ; }

Android用
Windows用のプログラムの int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )int android_main( void ) に置き換える以外は Windows用のプログラムと同じです。




宣言int SelectMidiMode( int Mode ) ;

概略  MIDIの演奏形態をセットする

引数 int Mode : MIDIの演奏形態
        DX_MIDIMODE_DM : DirectMusic による演奏
        DX_MIDIMODE_MCI : MCIによる演奏(デフォルト)
戻り値 −1:エラー発生
0:成功

解説  PlayMusic 関数を使用して演奏できるMIDIファイルの演奏形態を 変更します。

DX_MIDIMODE_MCI

  MCI(Media Control Interface)を使用して演奏します。どんな音色で MIDIファイルが演奏されるかは各パソコンにインストールされている MIDIデバイスに依存します。
 ですが、処理速度は DirectMusic を使用した場合に比べてかなり速い です。


DX_MIDIMODE_DM

 DirectMusic を使用して演奏します。DirectMusic で演奏する場合は DirectMusic が用意する音色で演奏することが出来るため、MCIを使用 する場合と違いどのパソコン環境でも同一の音色で演奏することが出来ます。
 ですが、MCIを使った場合に比べて処理負荷は格段に高くなります。


 というわけで、そもそもMIDIファイルは使わない。という方は DX_MIDIMODE_MCI を、MIDIファイルは使うし、処理が重くなってもどの 環境でも同じ音色で演奏したいという方は DX_MIDIMODE_DM をお使いに なられることを推奨します。(^^;

サンプル

 ありません




戻る