簡易画面出力関数
|
宣言 |
int printfDx( char *FormatString , ... ) ;
|
概略 | 簡易文字列出力を行う
|
引数 |
char *FormatString : 書式付き文字列のアドレス
... : 書式付き文字列に付随する引数 |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
DXライブラリで作成できるソフトをはじめとする Windows ソフトはC言語の入門書などに必ず出てくる printf という便利な画面出力関数が使えません。
DXライブラリにも DrawString や DrawFormatString
という文字列を出力する関数がありますが、色や座標を指定しなくてはなりませんし、
なにより他のグラフィック描画関数と使う順番を誤ると他のグラフィックの影になり、
見えなくなってしまったりします。
『座標や色はどうでもいいから、とにかく画面に情報を表示したい』という時は必ずあるものです。
そんなときに便利なのが printfDx 関数です。
この関数は名前こそ後ろに 『Dx』 と書かれていますが、C言語の標準出力関数である printf 関数と同じような使い方ができます。
ですので詳細はC言語の入門書、もしくは統合環境のヘルプを参照してください。
(書式付き文字列の簡単な説明は DrawFormatString関数にありますのでよろしかったら参照してください。)
≪注意!≫
printfDx では『\n』『\t』以外のエスケープシーケンスには対応していません。
また、printfDx 関数で出力された文字列はすぐには画面には表示されません。
他の描画関数によって文字列が隠れないようにするために ScreenFlip 関数が使われた瞬間に一度に画面に表示されるようになっています。
なお、画面には縁付き文字で表示されますが、この文字の描画は非常に処理負荷が重いので、あくまでちょっとした情報の表示程度に使用してください。
|
|
サンプル
画面に適当に文字列を出力する
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリ初期化
if( DxLib_Init() == -1 ) return 0;
// Hello C World!と表示、最後に改行
printfDx( "Hello C World!\n" ) ;
// 画面に適当に数値を描画
printfDx( " 600 x 800 = %d \n" , 600 * 800 ) ;
// 画面が降り切れるほど文字列を描画
printfDx( "実験実験実験実験実験実験実験実験実験" ) ;
printfDx( "実験実験実験実験実験実験実験実験実験" ) ;
printfDx( "実験実験実験実験実験実験実験実験実験実験" ) ;
// 画面を青くする
DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 0 , 255 ) , TRUE ) ;
// 出力した文字列を表示
ScreenFlip() ;
// キーが押されるまで待つ
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 clsDx( void ) ;
|
概略 | 簡易画面出力履歴をクリアする
|
引数 | なし |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
printfDx 関数で文字列を画面に表示しつづけるとやがて画面が文字でいっぱいになってしまい、とてもうっとうしくなります。
そんなうっとうしい文字列達を一掃するのがこの関数す。
なお、文字達を消す、とはいっても DrawString 等の関数で描画された文字は消えませんのでご注意下さい。
|
|
サンプル
画面に延々と文字列を表示しつづけ、キーが押されたら文字列を一掃します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリ初期化
if( DxLib_Init() == -1 ) return 0;
// 描画先画面を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// なにかキーが押されるまでループ
while( CheckHitKeyAll() == 0 )
{
// Hello C World!と表示
printfDx( "Hello C World" ) ;
// 画面を青くする
DrawBox( 0 , 0 , 640 , 480 , GetColor( 0 , 0 , 255 ) , TRUE ) ;
// 出力した文字列を表示
ScreenFlip() ;
// Windows依存処理
if( ProcessMessage() == -1 ) break ;
}
// 画面の文字達を消す
clsDx() ;
// 画面にメッセージを表示
printfDx( "消えましたか?" ) ;
// 画面を赤くする
DrawBox( 0 , 0 , 640 , 480 , GetColor( 255 , 0 , 0 ) , TRUE ) ;
// 画面の状態を更新
ScreenFlip() ;
// キーが押されるまで待つ
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 SetGraphMode( int SizeX , int SizeY , int ColorBitNum ) ;
|
概略 | 画面モードの変更
|
引数 |
SizeX , SizeY : 画面の解像度
ColorBitNum : カラービット数 |
戻り値 |
DX_CHANGESCREEN_OK : 画面変更は成功した
DX_CHANGESCREEN_RETURN : 画面の変更は失敗し元の画面モードに戻された
DX_CHANGESCREEN_DEFAULT : 画面の変更は失敗し標準の画面モードに変更された
|
解説 |
画面の解像度や最大表示色数を変更します。
<注意>
この関数を実行するとロードしたすべてのグラフィックハンドルと3Dモデルハンドル、
作成したフォントハンドルは自動的に削除され、SetDrawArea, SetDrawScreen, SetDrawMode,
SetDrawBlendMode, SetDrawBright 等の描画に関係する設定を行う関数による設定も全て初期状態に戻りますので、
画面モード変更後 LoadGraph関数や CreateFontToHandle関数等で再度ハンドルを作成し直し、
描画可能領域、描画対象画面等の各種描画系の設定も再度行う必要があります。
画面の解像度は画面を表現するのに使用されるドット(点)の数です。
パソコンのモニターが対応している解像度としては主に
640×480 800×600 1024×768 1280×1024 1280×720 1920×1080
があります。( デフォルトは640×480です )。
画面の解像度を上げると画面を構成する点の数が増え表現力も高くなりますが、
そのぶん画面の記憶に必要なメモリ容量も増えますので注意してください。
指定した解像度がモニターやグラフィックスデバイスが対応していない場合は SetFullScreenResolutionMode で設定できる解像度モードに沿ってモニターが対応している別の解像度に拡大されて表示されます。
( 別の解像度に拡大する処理は処理負荷がそこそこ高いので、モニターが対応している解像度を使用することをお勧めします )
カラービット数とは使用する画面の色の数です。
ビットとは2進数の1桁の事で、16ビットで65536色(Trueカラー)
24ビットで1677万色(フルカラー)表現できます。
ビット数が上がれば上がるほど表現できる色の数は増えますが、その分必要なデータ量も増えますので注意してください。
このライブラリで指定できるカラービット数は16ビットと32ビットの二つになります。
指定したカラービット数に対応する3D機能を持たないグラフィックスデバイスでは3D機能が使用不可になります。
16ビットはDXライブラリの標準色ビット数で、65536色を使って画像を表現します。
32ビットは内部的には24ビットを使って1667万色で画像を表現します。( 残りの8ビットは使用されません )
このモードを選択するとグラフィックデータのサイズが16bitモードに比べて2倍になります。
戻り値は、変更が成功した場合は DX_CAHNGESCREEN_OK が失敗して元の画面モードに戻された場合は DX_CHANGESCREEN_RETURN
が失敗して元の画面にも戻せず、デフォルトの画面モード( 640x480 16bit color)に変更された場合は DX_CHANGESCREEN_DEFAULT が、
それすらも失敗した場合はソフトが自動終了します。
なおこの関数を DxLib_Init 関数を使用する前に呼び出すことにより初期状態の画面モードを設定することが出来ます。
この場合は画面モードの変更は DxLib_Init が呼ばれた際に行われるので画面モードの変更が成功するかどうか分からず、
関数は必ず DX_CHANGESCREEN_OK を返します。
|
|
サンプル
解像度800×600、カラービット数32ビットで起動し、グラフィックを
グラフィックを読み込み描画します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int GHandle ;
// 画面モードの設定
SetGraphMode( 800 , 600 , 32 ) ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが発生したら終了
}
// test.bmpの読み込み
GHandle = LoadGraph( "test1.bmp" ) ;
// グラフィックの描画
DrawGraph( 0 , 0 , GHandle , FALSE ) ;
// 読み込んだ画像のグラフィックハンドルを削除
DeleteGraph( GHandle ) ;
// キー待ち(『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 SetFullScreenResolutionMode( int ResolutionMode ) ;
|
概略 | フルスクリーンモード時の解像度モードを設定する
|
引数 |
ResolutionMode : フルスクリーンモード時の解像度モード
DX_FSRESOLUTIONMODE_NATIVE
モニターの解像度を SetGraphMode で指定した解像度に変更するモード
DX_FSRESOLUTIONMODE_DESKTOP
モニターの解像度をデスクトップ画面と同じにして
SetGraphMode で指定した解像度の画面を拡大して表示するモード(デフォルト)
DX_FSRESOLUTIONMODE_MAXIMUM
モニターの解像度を最大にして、SetGraphMode で指定した解像度の画面を
拡大して表示するモード |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
フルスクリーンモードで実行する場合の画面解像度の決定に関する動作モードを設定する関数です。
DX_FSRESOLUTIONMODE_NATIVE
モニターの解像度を SetGraphMode で指定した解像度に変更します。
モニターが SetGraphMode で指定した解像度に対応していない場合は、
DX_FSRESOLUTIONMODE_DESKTOP と同じ動作をします。
モニターが SetGraphMode で指定した解像度に対応している場合は、ScreenFlip が3種類の
モードの中で最も高速に動作します。
DX_FSRESOLUTIONMODE_DESKTOP
モニターの解像度をデスクトップ画面と同じにして、SetGraphMode で指定した解像度の画面を
縦横比を維持しながら拡大して表示します。( 余分な部分は黒で塗りつぶされます )
SetGraphMode で指定した解像度がデスクトップ画面の解像度よりも高い場合は
DX_FSRESOLUTIONMODE_MAXIMUM と同じ動作をします。
モニターの縦横比と異なる縦横比の解像度を指定しても、モニターの縦横比で表示してしまう
モニターも存在するので( 結果画像が横( 又は縦 )に伸びで表示されてしまう )、
デスクトップ画面の解像度を使用することで意図した通りの表示結果が得られる
確率が上がります。( デスクトップ画面を横や縦に伸びて表示される解像度に
設定している人は少ない為 )
ただ、SetGraphMode で指定した解像度の画面をデスクトップ画面の解像度に拡大する処理が
実行されるので、ScreenFlip の動作速度は DX_FSRESOLUTIONMODE_NATIVE よりも
遅くなります。
デフォルトではこのモードになっています。
DX_FSRESOLUTIONMODE_MAXIMUM
モニターの解像度を最大にして、SetGraphMode で指定した解像度の画面を縦横比を維持しながら
拡大して表示します。( 余分な部分は黒で塗りつぶされます )
この設定と SetFullScreenScalingMode で拡大モードに
DX_FULLSCREENSCALINGMODE_NEAREST を指定すると、最もドットがくっきり
四角く表示されます。
ただ、SetGraphMode で指定した解像度の画面をモニターの最大解像度に拡大する処理が実行
されるので、ScreenFlip の動作速度は3つのモードの中で最も遅くなります。
<注意>
この関数は DxLib_Init を呼び出す前にのみ実行することが出来ます。
DxLib_Init を呼び出した後にこの関数を実行しても何も効果はありませんのでご注意ください。
|
|
サンプル
フルスクリーンモード時の解像度モードをモニターの最大解像度を使用する設定にした上で、
画面の解像度を縦横256ドットに設定、起動後に画面の中心に黄色い円を描画します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// フルスクリーンモード時の解像度モードをモニターの最大解像度を使用するモードに設定
SetFullScreenResolutionMode( DX_FSRESOLUTIONMODE_MAXIMUM ) ;
// 画面の解像度を縦横256ドットに設定
SetGraphMode( 256, 256, 32 ) ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 )
{
return -1; // エラーが発生したら終了
}
// 画面の中心に円を描画
DrawCircle( 128, 128, 48, GetColor( 255,255,0 ), FALSE ) ;
// キー待ち(『WaitKey』を使用)
WaitKey() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
|
宣言 | int SetFullScreenScalingMode( int ScalingMode ) ;
|
概略 | フルスクリーンモード時の画面拡大モードを設定する
|
引数 |
ScalingMode : フルスクリーンモード時の画面拡大モード
DX_FSSCALINGMODE_BILINEAR
バイリニアモード( ピクセルが滲んでピクセルとピクセルの
区切りがはっきりしない )( デフォルト )
DX_FSSCALINGMODE_NEAREST
最近点モード( ピクセルが四角くくっきり表示される ) |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
フルスクリーンモードで SetGraphMode で指定した解像度とモニターの解像度が一致していない場合に行われる画面拡大処理での拡大処理方式を設定する関数です。
DX_FSSCALINGMODE_BILINEAR
バイリニア補間による拡大処理を行います。ピクセルとピクセルの区切りがぼやけます。
デフォルトではこのモードになっています。
DX_FSSCALINGMODE_NEAREST
最近点法による拡大処理を行います。ピクセルとピクセルの区切りが四角くくっきり表示されます。
|
|
サンプル
フルスクリーンモード時の解像度モードをモニターの最大解像度を使用する設定に、
画面の拡大モードを最近点モードにした上で、画面の解像度を縦横256ドットに設定、
起動後に画面の中心に黄色い円を描画します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// フルスクリーンモード時の解像度モードをモニターの解像度を最大にするモードに設定
SetFullScreenResolutionMode( DX_FSRESOLUTIONMODE_MAXIMUM ) ;
// フルスクリーンモード時の画面の拡大モードを最近点モードに設定
SetFullScreenScalingMode( DX_FSSCALINGMODE_NEAREST ) ;
// 画面の解像度を縦横256ドットに設定
SetGraphMode( 256, 256, 32 ) ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 )
{
return -1; // エラーが起きたら終了
}
// 画面の中心に円を描画
DrawCircle( 128, 128, 48, GetColor( 255,255,0 ), FALSE ) ;
// キー待ち(『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 GetScreenState( int *SizeX , int *SizeY , int *ColorBitDepth ) ;
|
概略 | 現在の画面の大きさとカラービット数を得る
|
引数 |
int *SizeX , *SizeY : それぞれ画面の幅と高さを保存する int 型変数のポインタ
int *ColorBitDepth : 画面のカラービット深度を保存する int 型変数のポインタ |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
現在の画面の幅と高さ、そして1ピクセルあたりに使用されているビット数
を得ます。
例 Sx,Sy,Cb にそれぞれ画面の幅、高さ、カラービット数を取得する
int Sx , Sy , Cb ;
GetScreenState( &Sx , &Sy , &Cb ) ;
なおここでいう画面の幅、高さとはDXライブラリが実際に描きこめる
広さのことを示しており、ウインドウモード時などのデスクトップ自体の
画面の広さのことではないので注意してください。
( 例 デスクトップの広さ 1024x768 DXライブラリの画面の広さ 640x480 だった
場合、この関数で得られる数値は後者の 640x480 です)
|
|
サンプル
ありません
|
宣言 | int SetDrawArea( int x1 , int y1 , int x2 , int y2 ) ;
|
概略 | 描画可能領域のセット
|
引数 |
x1 , y1 : 描画可能領域を示す矩形の左上の頂点
x2 , y2 : 描画可能領域を示す矩形の右下+1の頂点 |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
( x1, y1 )を左上頂点、( x2 - 1, y2 - 1 ) を右下頂点とした矩形
を各描画関数で描画可能な領域として設定します。この領域をはみ出て
描画しようとした場合はその部分は描画されません。
注…『なんで右下の頂点は「-1」してるの?』と思われた方はDrawBoxの解説を読んでみて下さい。
|
|
サンプル
画面の半分を描画不可能にして画面全体に青い四角を描画しようとする
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
unsigned int Cr ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが発生したら終了
}
// 描画可能領域セット
SetDrawArea( 0 , 0 , 320 , 480 ) ;
// 青色の値を取得
Cr = GetColor( 0 , 0 , 255 ) ;
// 青い四角形の描画
DrawBox( 0 , 0 , 640 , 480 , Cr , TRUE ) ;
// キー待ち(『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 ClearDrawScreen( void ) ;
|
概略 | 画面に描かれたものを消去する
|
引数 | なし |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
各種描画関数で描画したグラフィックをすべて消し画面を初期化します。
|
|
サンプル
ランダムな座標で1000個の点を描画した後画面を消去します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int i ;
unsigned 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』を使用)
// 画面を初期化
ClearDrawScreen() ;
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 ClearDrawScreenZBuffer( void ) ;
|
概略 | 深度バッファをクリアする
|
引数 | なし |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ClearDrawScreen はカラーバッファ( 実際に画面に表示される絵の情報 )と深度バッファ( 3Dの描画物同士の前後関係の判定に使用される情報 )のどちらもクリアをしますが、この関数は深度バッファのみをクリアします。
|
|
サンプル
ありません
|
宣言 | int SetBackgroundColor( int Red, int Green, int Blue ) ;
|
概略 | 画面の背景色を設定する
|
引数 |
Red : 背景色の赤成分( 0~255 )
Green : 背景色の緑成分( 0~255 )
Blue : 背景色の青成分( 0~255 )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ウインドウの背景色、また ClearDrawScreen を使用した際の描画先画面のクリアカラーとなる色を設定します。
色は光の3原色の赤・緑・青のそれぞれの輝度の強さで指定します。
<例>
白 SetBackgroundColor( 255, 255, 255 ) ;
赤 SetBackgroundColor( 255, 0, 0 ) ;
緑 SetBackgroundColor( 0, 255, 0 ) ;
青 SetBackgroundColor( 0, 0, 255 ) ;
黄 SetBackgroundColor( 255, 255, 0 ) ;
水 SetBackgroundColor( 0, 255, 255 ) ;
紫 SetBackgroundColor( 255, 0, 255 ) ;
また、この関数を DxLib_Init を呼び出す前に呼ぶことで起動時の画面の色を設定することができます。
|
|
サンプル
ありません
|
宣言 | unsigned int GetColor( int Red , int Green , int Blue ) ;
|
概略 | 色コードを取得する
|
引数 | Red , Green , Blue : 取得したい色の各輝度値(0~255) |
戻り値 | カラーコード
|
解説 |
DrawLine、DrawPixel、DrawString、DrawBox、DrawCircleで
使用する色の値を取得します。Red、Green、Blueはそれぞれ
色の3原色に対応していてこの値を指定することで希望の
色コードが取得できます。(各色要素の上限値は255です)
<<注意!>>
色コードは画面のカラービット数によって変化しますので、画面のカラービット数が変化するとそれ以前にこの関数で得られた色コードは無効( 別の色を表す数値 )になります。
|
|
サンプル
灰色の線を描く
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
unsigned int Cr ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが発生したら終了
}
// 灰色の値を取得
Cr = GetColor( 128 , 128 , 128 ) ;
// 線の描画
DrawLine( 120 , 150 , 300 , 240 , 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 SetDrawScreen( int DrawScreen ) ;
|
概略 | 描画先グラフィック領域の指定
|
引数 |
DrawScreen : 描画する対象となるグラフィック領域を指定します。
DX_SCREEN_FRONT : 表の画面(表示されている画面)
DX_SCREEN_BACK : 裏の画面(表示されていない画面)
MakeScreen で作成したグラフィックハンドル |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
アニメーションする画像を表示するとして常に表示されている画面に対して描画処理を行うと、
画面へ描画しているところや、描画したものを消している最中の状態が見えてしまい結果として画面がちらついているように見えてしまいます。
( 注 … グラフィックカードによってはちらつかない場合もありますが、一般的にはちらつきます )
そこで画面への描画中は見えないようにして、描画処理が終った後で見えるようにすれば画面のちらつきは消えるはずです。
それを実現するためにこの関数があります。
デフォルトでは描画先は DX_SCREEN_FRONT (表の画面)となっていて描画処理中も見えてしまい画面はちらつきますが、
描画先を DX_SCREEN_BACK (裏の画面)を指定すると描画先が普段は見えない裏の画面に対して行われます。
描画が終った後で次に示す関数『ScreenFlip』を呼び出せば、
裏画面の内容が表画面に反映され、裏画面に描画していた内容が実際に表示されます。
この関数はその描画先をどちらの画面にするか、を指定するための関数です。
その他、MakeScreen 関数で作成したグラフィックハンドルを引数に渡すと、
そのグラフィックハンドルを描画先とすることができます。
( グラフィックハンドルを描画先とすることができることの利点については MakeScreen 関数の解説を参照してください )
<注意>
この関数を使用して描画対象を変更すると、SetDrawArea で設定した描画可能範囲と、
3D描画で使用するカメラの設定( SetCameraPositionAndTarget_UpVecY などの関数でパラメータを設定する )がリセットされます。
|
|
サンプル
最初に表画面を描画先にしてランダムに四角形を描き続き、次に
描画先を裏画面にして同じことをしてみます。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int i ;
unsigned int Cr ;
int x , y ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが発生したら終了
}
// 描画先画面を表にする
SetDrawScreen( DX_SCREEN_FRONT ) ;
// 10000個四角形を描きます
for( i = 0 ; i < 10000 ; i ++ )
{
// ランダムな色を取得する『GetRand』使用
Cr = GetColor( GetRand( 255 ) , GetRand( 255 ) , GetRand( 255 ) ) ;
// ランダムな位置に四角形を描く
x = GetRand( 639 ) ;
y = GetRand( 479 ) ;
DrawBox( x , y , x + GetRand( 639 ) , y + GetRand( 479 ) , Cr , TRUE ) ;
}
WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用)
// 画面を初期化
ClearDrawScreen() ;
// 描画先画面を裏にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 10000個四角形を描きます
for( i = 0 ; i < 10000 ; i ++ )
{
// ランダムな色を取得する『GetRand』使用
Cr = GetColor( GetRand( 255 ) , GetRand( 255 ) , GetRand( 255 ) ) ;
// ランダムな位置に四角形を描く
x = GetRand( 639 ) ;
y = GetRand( 479 ) ;
DrawBox( x , y , x + GetRand( 639 ) , y + GetRand( 479 ) , Cr , TRUE ) ;
}
// 裏画面の内容を表画面に反映します
ScreenFlip() ;
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 ScreenFlip( void ) ;
|
概略 |
フリップ関数、画面の裏ページ(普段は表示されていない)を
表ページ(普段表示されている)に反映する
|
引数 | なし |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
裏ページの内容を表ページに反映します。
(裏ページ、表ページについては 『SetDrawScreen』関数の解説を参照してください)
注…この関数を使用した後の裏ページの内容は環境によって変わりますので、ScreenFlip 関数を使用した後は ClearDrawScreen 等を使用して裏ページを初期化して下さい
|
|
サンプル
『SetDrawScreen』関数の解説を参照してください
|
宣言 | int SetFullSceneAntiAliasingMode( int Samples, int Quality ) ;
|
概略 |
画面のフルスクリーンアンチエイリアスモードの設定をする
|
引数 |
int Samples : マルチサンプルレベル
int Quality : マルチサンプルクオリティ
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
画面のフルスクリーンアンチエイリアスモードの設定をします。
<注意!>
1.この関数は DxLib_Init の前で実行した場合のみ効果が得られます
2.この関数は実行したPCに搭載されているグラフィックスデバイスがフルシーンアンチエイリアスに対応している場合のみ効果を得ることができます
3.フルスクリーンアンチエイリアスを有効にした場合は必ず SetDrawScreen で「裏画面」を使用して ScreenFlip で画面を更新する必要があります
フルシーンアンチエイリアスが有効なのは主に3D描画に関してで、2D描画には殆ど効果はありません。
( 寧ろぼやけて汚くなってしまうことも・・・ )
3D描画の結果は、フルシーンアンチエイリアスを有効にすることによってジャギが消え、フルシーンアンチエイリアスがOFFの時には潰れてしまっていた細かい部分も見えるようになります。
要は元の画面解像度の高い解像度の画面に描画した結果を綺麗に縮小したような効果を得ることができます。
その「画面の解像度に対して、どれくらい高い解像度の画面に描画したのと同じような結果を得るか」の「どれくらい」の部分に当たるのが引数 Samples です。
Samples の値を 1 にした場合は1倍なので、フルシーンアンチエイリアスの効果は得られません。
2にすると2倍面積の解像度の画面に描画してそれを綺麗に縮小したような効果をえることが、4にすると4倍面積の解像度の、16にすると16倍面積の解像度の画面に描画してから縮小したような効果を得ることができます。
( つまり画面の解像度が 640x480 だった場合は 2560x1920 の解像度の画面に描画してから縮小したような結果が得られる!( 解像度が倍になると面積は4倍になるので面積16倍=解像度4倍 ) )
ただ、高い解像度の画面に描画する、となると想像が付くと思いますが、引数 Samples の値が大きければ大きいだけ処理負荷は高くなります。
フルシーンアンチエイリアス無しと比べると Samples の値が 4 でもかなり見た目が違いますので、効果が得られる可能な限り小さい値を渡すのが賢明です。
引数 Quality について、Samples の値に従って「高い解像度の画面に描画して、それを綺麗に縮小した場合と同じような効果が得られる」フルシーンアンチエイリアスの機能ですが、
その「綺麗に縮小」する工程の、「どのくらい綺麗にするか」を Quality で指定します。
値の上限はグラフィックスデバイス毎に設定されていて、大体指定できる範囲は 0 ~ 3 です。この引数も Samples と同様に値が大きければ大きいほど処理負荷が高くなりますので、
満足できる効果が得られる、可能な限り小さい値を渡すのが賢明です。
尚、この関数でフルスクリーンアンチエイリアスモードの設定を行えるのは裏画面、表画面のみで、MakeScreen 関数で作成できる描画可能画像のフルスクリーンアンチエイリアスについての設定は SetCreateDrawValidGraphMultiSample で行います。
|
|
サンプル
フルスクリーンアンチエイリアスを有効にした状態で DxChara.x を読み込み、画面に表示します
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// フルシーンアンチエイリアスを設定する
SetFullSceneAntiAliasingMode( 4, 2 ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// 描画先を裏画面に設定
SetDrawScreen( DX_SCREEN_BACK ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
// キーの入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
|
動画関係
|
宣言 | int PlayMovie( char *FileName , int ExRate , int PlayType ) ;
|
概略 | 動画ファイルを再生する
|
引数 |
char *FileName : 再生する動画ファイルのパス
int ExRate : 再生時の拡大率
(1=等倍 2=2倍 など,1.5倍などは出来ません)
int PlayType : 再生のタイプ
DX_MOVIEPLAYTYPE_BCANCEL : ボタンキャンセルあり
DX_MOVIEPLAYTYPE_NORMAL : ボタンキャンセルなし
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
FileNameで指定された動画ファイルを ExRate で指定された倍率
に拡大し、画面中心に再生します。なお PlayType に DX_MOVIEPLAYTYPE_BCANCEL
を指定した場合は再生中にボタンが押されるとそこで再生を中断します。
DX_MOVIEPLAYTYPE_NORMAL を指定するとボタンを押しても中断しません。
AVI(Codecがない形式は再生できません),MPG 等
|
|
サンプル
test.aviを等倍で再生する(ボタン押しキャンセルなし)
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが発生したら終了
}
PlayMovie( "test.avi" , 1 , DX_MOVIEPLAYTYPE_NORMAL ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int PlayMovieToGraph( int GraphHandle ) ;
|
概略 | ムービーグラフィックの動画の再生を開始する
|
引数 |
int GraphHandle : ムービーグラフィックハンドル |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
LoadGraph 関数で取得したムービーグラフィックハンドルが
持っているムービーファイルの再生を開始します。
ムービーグラフィックについては LoadGraph 関数の説明書きを
参照して下さい。
ムービーグラフィックハンドルによるムービーの再生
百聞は一見にしかず、まず次のプログラムを見てください。
int MovieGraphHandle ;
MovieGraphHandle = LoadGraph( "??.mpg" ) ;
PlayMovieToGraph( MovieGraphHandle ) ;
while( ProcessMessage() == 0 )
{
DrawGraph( 0 , 0 , MovieGraphHandle , FALSE ) ;
WaitTimer( 10 ) ;
}
このプログラムを実行すると ??.mpg という動画ファイルを
再生し、画面に表示します。
まず LoadGraph 関数で動画ファイルをロードし、その
ムービーを示すムービーグラフィックハンドルを変数 MovieGraphHandle に
保存します、そして次の行の PlayMovieToGraph 関数でロードした
ムービーを再生状態にします。
次が肝です、1ループごとに DrawGraph 関数で MovieGraphHandle
変数の示すムービーを描画し、その後10ミリ秒停止しています。
この DrawGraph 関数では何が描画されるかといいますとずばり
ムービー映像が描画されます。
つまり、画像ファイルをロードして得ることが出来るグラフィック
ハンドルでは決まったグラフィックが常に描画されるわけですが、
ムービーグラフィックハンドルの場合は描画されるグラフィックが
ムービーファイルのデータに応じて次々に変更されるということです。
説明がわかりにくいので次のサンプルプログラムを見てイメージを
つかんでください。
ちなみに動画の再生のみを行う場合は PlayMovie 関数を使用すること
をお勧めします。こちらのほうがムービー再生のみであれば低負荷、
高画質で処理することが出来るからです。
<<注意>>
動画の再生処理は非同期で行われますので、
この関数から出てきた時点で動画の再生が確実に開始されていることや、
動画の再生が GetNowCount で取得できる時刻通りに正確に行われ続ける保証はありません。
なのでもし動画の映像に合わせて何かを行う処理をする場合は TellMovieToGraph
を使用して動画の再生時間に合わせて処理を行う必要があります。
<<余談>>
ムービーの『ロード』といっていますが、動画ファイルは容量が
大きいので、実際にはメモリにすべてロードしているわけではありません。
正しくはムービーの『オープン』です。
|
|
サンプル
??.mpg を画面いっぱいに拡大して再生します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int MovieGraphHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが発生したら終了
}
// ムービーファイルをロードします。
MovieGraphHandle = LoadGraph( "??.mpg" ) ;
// ムービーを再生状態にします
PlayMovieToGraph( MovieGraphHandle ) ;
// ループ、 GetMovieStateToGraph 関数はムービーの再生状態を得る関数です
// 戻り値が1の間は再生状態ですのでループを続けます
while( ProcessMessage() == 0 && GetMovieStateToGraph( MovieGraphHandle ) == 1 )
{
// ムービー映像を画面いっぱいに描画します
DrawExtendGraph( 0 , 0 , 640 , 480 , MovieGraphHandle , FALSE ) ;
// ウエイトをかけます、あまり速く描画すると画面がちらつくからです
WaitTimer( 17 ) ;
}
// 読み込んだムービーファイルのグラフィックハンドルの削除
DeleteGraph( MovieGraphHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int PauseMovieToGraph( int GraphHandle ) ;
|
概略 | ムービーグラフィックの動画再生を一時停止する
|
引数 |
int GraphHandle : ムービーグラフィックハンドル |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
PlayMovieToGraph 関数で開始したムービー再生にポーズを掛けます。
ポーズを解除するには再び PlayMovieToGraph 関数を使用します。
ムービーグラフィックについては LoadGraph 関数の説明書きを
参照して下さい。
|
|
サンプル
ありません
|
宣言 | int SeekMovieToGraph( int GraphHandle , int Time ) ;
|
概略 | ムービーグラフィックの動画の再生位置を変更する
|
引数 |
int GraphHandle : ムービーグラフィックハンドル |
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
再生する動画の再生位置を変更します。
時間は Time で指定します、単位は細かいですが 1ミリ秒単位となります。
ムービーグラフィックについては LoadGraph 関数の説明書きを
参照して下さい。
|
|
サンプル
??.avi ファイルを5秒目から再生します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int MovieGraphHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが発生したら終了
}
// ムービーファイルをロードします。
MovieGraphHandle = LoadGraph( "??.avi" ) ;
// ムービーの再生位置を5秒目に変更します
SeekMovieToGraph( MovieGraphHandle , 5000 ) ;
// ムービーを再生状態にします
PlayMovieToGraph( MovieGraphHandle ) ;
// ループ、GetMovieStateToGraph 関数はムービーの再生状態を得る関数です
// 戻り値が1の間は再生状態ですのでループを続けます
while( ProcessMessage() == 0 && GetMovieStateToGraph( MovieGraphHandle ) == 1 )
{
// ムービー映像を画面いっぱいに描画します
DrawExtendGraph( 0 , 0 , 640 , 480 , MovieGraphHandle , FALSE ) ;
// ウエイトをかけます、あまり速く描画すると画面がちらつくからです
WaitTimer( 17 ) ;
}
// 読み込んだムービーファイルのグラフィックハンドルの削除
DeleteGraph( MovieGraphHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int TellMovieToGraph( int GraphHandle ) ;
|
概略 | ムービーグラフィックの動画の再生位置を得る
|
引数 |
int GraphHandle : ムービーグラフィックハンドル |
戻り値 | 0以上:再生時間(単位はミリ秒) |
| -1:エラー発生
|
解説 |
再生している動画の再生位置を取得します。
戻り値は GetNowCount と同じくミリ秒単位です。
|
|
サンプル
??.mpg ファイルを再生しながら、画面左上に再生時間を表示します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int MovieGraphHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが発生したら終了
}
// ムービーファイルをロードします。
MovieGraphHandle = LoadGraph( "??.mpg" ) ;
// ムービーを再生状態にします
PlayMovieToGraph( MovieGraphHandle ) ;
// 描画先の画面を裏画面に
SetDrawScreen( DX_SCREEN_BACK ) ;
// ループ、 GetMovieStateToGraph 関数はムービーの再生状態を得る関数です
// 戻り値が1の間は再生状態ですのでループを続けます
while( ProcessMessage() == 0 && GetMovieStateToGraph( MovieGraphHandle ) == 1 )
{
// ムービー映像を画面いっぱいに描画します
DrawExtendGraph( 0 , 0 , 640 , 480 , MovieGraphHandle , FALSE ) ;
// 画面左上に再生時間を描画します
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Time:%d", TellMovieToGraph( MovieGraphHandle ) ) ;
// 裏画面の内容を表画面に反映します
ScreenFlip() ;
}
// 読み込んだムービーファイルのグラフィックハンドルの削除
DeleteGraph( MovieGraphHandle ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int GetMovieStateToGraph( int GraphHandle ) ;
|
概略 | ムービーグラフィックの動画の再生状態を得る
|
引数 |
int GraphHandle : ムービーグラフィックハンドル |
戻り値 |
0 :再生は停止している |
| 1 :再生中 -1:エラー発生
|
解説 |
ムービーグラフィックの再生状態を得ます。
もし0が返ってきたら停止中、1なら再生中となります。
因みに動画の再生が終了するか PauseMovieGraph 関数で再生に
ポーズを掛けると停止中となります。
ムービーグラフィックについては LoadGraph 関数の説明書きを
参照して下さい。
|
|
サンプル
PlayMovieToGraph 関数のサンプルを参照して下さい
|
戻る
|