簡易画面出力関数
|
宣言 |
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 関数が使われた瞬間に一度に画面に表示されるようになっています。
なお、画面には縁付き文字で表示されますが、この文字の描画は非常に処理負荷が重いので、あくまでちょっとした情報の表示程度に使用してください。
|
|
サンプル
画面に適当に文字列を出力する
#include "DxLib.h"
// WinMain関数
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 ;
}
|
宣言 |
int clsDx( void ) ;
|
概略 | 簡易画面出力履歴をクリアする
|
引数 |
char *FormatString : 書式付き文字列のアドレス
... : 書式付き文字列に付随する引数 |
戻り値 | 0:成功 |
| −1:エラー発生
|
解説 |
printfDx 関数で文字列を画面に表示しつづけるとやがて画面が
文字でいっぱいになってしまい、とてもうっとうしくなります。
そんなうっとうしい文字列達を一掃するのがこの関数す。
なお、文字達を消す、とはいっても DrawString 等の関数で
描画された文字は消えませんのでご注意下さい。
|
|
サンプル
画面に延々と文字列を表示しつづけ、キーが押されたら文字列を一掃します
#include "DxLib.h"
// WinMain関数
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 ;
}
|
その他画面操作系関数
|
宣言 | int SetGraphMode( int SizeX , int SizeY , int ColorBitNum ) ;
|
概略 | 画面モードの変更
|
引数 |
SizeX , SizeY : 画面の解像度
ColorBitNum : カラービット数 |
戻り値 |
DX_CHANGESCREEN_OK : 画面変更は成功した
DX_CHANGESCREEN_RETURN : 画面の変更は失敗し元の画面モードに戻された
DX_CHANGESCREEN_DEFAULT : 画面の変更は失敗し標準の画面モードに変更された
|
解説 |
画面の解像度や最大表示色数を変更します。
<注意>
この関数を実行するとロードしたすべてのグラフィックデータハンドル、
作成したフォントハンドルは自動的に削除され、SetDrawArea, SetDrawScreen, SetDrawMode,
SetDrawBlendMode, SetDrawBright 等の描画に関係する設定を行う関数による設定も全て初期状態に戻りますので、
画面モード変更後 LoadGraph関数や CreateFontToHandle関数等で再度ハンドルを作成し直し、
描画可能領域、描画対象画面等の各種描画系の設定も再度行う必要があります。
画面の解像度は画面を表現するのに使用されるドット(点)の数です。解像度としては主に
320×240 640×480 800×600 1024×768 1280×1024
があり、2Dのアクションゲームで1番メジャーな解像度は640×480となっています
(デフォルトは640×480です)。画面の解像度を上げると点の数が増え表現力も高まりますが、
その分画面の状態を記憶しておくデータの量も増えますので注意してください。
あと上記に記されていない解像度を指定することも出来ますが(例 300×200 512×225)
モニターやグラフィックボードが対応していない場合はウインドウモードで起動します。
カラービット数とは使用する画面の色の数です。
ビットとは要は2進数の1桁の事で、16ビットで65536色(Trueカラー)
24ビットで1677万色(フルカラー)表現できます。
ビット数が上がれば上がるほど表現できる色の数は増えますがその分必要なデータの量も増えますので注意してください。
このライブラリで指定できるカラービット数は16ビットと32ビットの二つになります。
指定したカラービット数に対応する3D機能を持たないグラフィックカードでは3D機能が使用不可になります。
16ビットはDXライブラリの標準色ビット数で、65536色を使って画像を表現します。
32ビットは内部的には24ビットを使って1667万色で画像を表現します。
このモードを選択するとグラフィックデータのサイズが16bitモードに比べて2倍になるので、ある程度ハイスペックなグラフィックカードが必要となります。
戻り値は、変更が成功した場合は DX_CAHNGESCREEN_OK が失敗して元の画面モードに戻された場合は DX_CHANGESCREEN_RETURN
が失敗して元の画面にも戻せず、デフォルトの画面モード( 640x480 16bit)に変更された場合は DX_CHANGESCREEN_DEFAULT が、
それすらも失敗した場合はソフトが自動終了します。
なおこの関数を DxLib_Init 関数を使用する前に呼び出すことにより初期状態の画面モードを設定することが出来ます。
この場合は画面モードの変更は DxLib_Init が呼ばれた際に行われるので画面モードの変更が成功するかどうか分からず、
関数は必ず DX_CHANGESCREEN_OK を返します。
|
|
サンプル
解像度800×600、カラービット数32ビットで起動し、グラフィックを
グラフィックを読み込み描画します
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int GHandle ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 画面モードの変更
SetGraphMode( 800 , 600 , 32 ) ;
// test.bmpの読み込み
GHandle = LoadGraph( "test1.bmp" ) ;
// グラフィックの描画
DrawGraph( 0 , 0 , GHandle , FALSE ) ;
// キー待ち(『WaitKey』を使用)
WaitKey() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
|
宣言 | 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の解説を読んでみて下さい。
|
|
サンプル
画面の半分を描画不可能にして画面全体に青い四角を描画しようとする
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
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 ; // ソフトの終了
}
|
宣言 | int ClearDrawScreen( void ) ;
|
概略 | 画面に描かれたものを消去する
|
引数 | なし |
戻り値 | 0:成功 |
| −1:エラー発生
|
解説 |
各種描画関数で描画したグラフィックをすべて消し画面を初期化します。
|
|
サンプル
ランダムな座標で1000個の点を描画した後画面を消去します
#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』を使用)
// 画面を初期化
ClearDrawScreen() ;
WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
|
宣言 | 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 を呼び出す前に呼ぶことで起動時の画面の色を設定することができます。
|
|
サンプル
ありません
|
宣言 | int GetColor( int Red , int Green , int Blue ) ;
|
概略 | 色コードを取得する
|
引数 | Red , Green , Blue : 取得したい色の各輝度値(0〜255) |
戻り値 | カラーコード
|
解説 |
DrawLine、DrawPixel、DrawString、DrawBox、DrawCircleで
使用する色の値を取得します。Red、Green、Blueはそれぞれ
色の3原色に対応していてこの値を指定することで希望の
色コードが取得できます。(各色要素の上限値は255です)
<<注意!>>
色コードは画面のカラービット数によって変化しますので、画面のカラービット数が変化するとそれ以前にこの関数で得られた色コードは無効( 別の色を表す数値 )になります。
|
|
サンプル
灰色の線を描く
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
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 ; // ソフトの終了
}
|
宣言 | int SetDrawScreen( int DrawScreen ) ;
|
概略 | 描画先グラフィック領域の指定
|
引数 |
DrawScreen : 描画する対象となるグラフィック領域を指定します。
DX_SCREEN_FRONT : 表の画面(表示されている画面)
DX_SCREEN_BACK : 裏の画面(表示されていない画面) |
戻り値 | 0:成功 |
| −1:エラー発生
|
解説 |
アニメーショングラフィックを表示するとして、
常に表示されている画面に対して描画処理を行うと、画面への描画、
消去が見えてしまい結果として画面がちらついているように見えます。
( 注 … グラフィックカードによってはちらつかない場合も ありますが、一般にはちらつきます )
そこで画面への描画中は見えないようにして、
描画処理が終った後で見えるようにすれば画面のちらつきは消えるはずです。
それを実現するためにこの関数があります。
デフォルトでは描画先は DX_SCREEN_FRONT (表の画面)となっていて描画処理中も見えてしまい画面はちらつきますが、
描画先を DX_SCREEN_BACK (裏の画面)を指定すると描画先が普段は見えない裏の画面に対して行われます。
描画が終った後で次に示す関数『ScreenFlip』を呼び出せば、
裏画面の内容が表画面に反映され、裏画面に描画していた内容が実際に表示されます。
この関数はその描画先をどちらの画面にするか、を指定するための関数です。
<注意>
この関数を使用して描画対象を変更すると、SetDrawArea で設定した描画可能範囲と、
3D描画で使用するカメラの設定( SetCameraPositionAndTarget_UpVecY などの関数でパラメータを設定する )がリセットされます。
|
|
サンプル
最初に表画面を描画先にしてランダムに四角形を描き続き、次に
描画先を裏画面にして同じことをしてみます。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int i ;
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 ; // ソフトの終了
}
|
宣言 | 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 関数で作成できる描画可能画像のフルスクリーンアンチエイリアスについての設定は SetDrawValidMultiSample で行います。
|
|
サンプル
フルスクリーンアンチエイリアスを有効にした状態で DxChara.x を読み込み、画面に表示します
#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 ) ;
// 裏画面の内容を表画面に反映
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を等倍で再生する(ボタン押しキャンセルなし)
#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 ; // ソフトの終了
}
|
宣言 | 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 を画面いっぱいに拡大して再生します。
#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 ) ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
|
宣言 | 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秒目から再生します。
#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 ) ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
|
宣言 | int TellMovieToGraph( int GraphHandle ) ;
|
概略 | ムービーグラフィックの動画の再生位置を得る
|
引数 |
int GraphHandle : ムービーグラフィックハンドル |
戻り値 | 0以上:再生時間(単位はミリ秒) |
| −1:エラー発生
|
解説 |
再生している動画の再生位置を取得します。
戻り値は GetNowCount と同じくミリ秒単位です。
|
|
サンプル
??.mpg ファイルを再生しながら、画面左上に再生時間を表示します。
#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() ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
|
宣言 | int GetMovieStateToGraph( int GraphHandle ) ;
|
概略 | ムービーグラフィックの動画の再生状態を得る
|
引数 |
int GraphHandle : ムービーグラフィックハンドル |
戻り値 |
0 :再生は停止している |
| 1 :再生中 −1:エラー発生
|
解説 |
ムービーグラフィックの再生状態を得ます。
もし0が返ってきたら停止中、1なら再生中となります。
因みに動画の再生が終了するか PauseMovieGraph 関数で再生に
ポーズを掛けると停止中となります。
ムービーグラフィックについては LoadGraph 関数の説明書きを
参照して下さい。
|
|
サンプル
PlayMovieToGraph 関数のサンプルを参照して下さい
|
戻る
|