12. 画像を動かす。
ゲームは画像が動かなきゃ始まりませんよね。次は画像を動かしてみましょう。
for文によって、xの座標を少しずつ動かしていきます。急に動かないように
Sleep関数を使用します。Sleep関数はミリ秒を引数にして、引数分だけ処理を止めます。
例えばSleep(10);とすれば10ミリ秒すなわち0.01秒だけ処理が止まります。
サンプルでは0.01秒ずつx座標を1増やしながら表示し、x座標が300以上になったらブレイクしています。
↓コピー&コンパイル用サンプルプログラム↓
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更 if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 int i ; for(i=0;i<300;i++){ LoadGraphScreen( i , 0 , "char.png" , TRUE ); //画像を描画 Sleep(10); //10ミリ秒待つ } WaitKey(); // 何かキー入力があるまで待つ DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
実行結果
画像は動いていますが前に描画した画像が残ってしまっています。つまり1回書いたら消さないといけないわけですね。
そこで画面に書いたデータを全部消す関数ClearDrawScreen()関数を使用します。
↓コピー&コンパイル用サンプルプログラム↓
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更 if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 int i ; for(i=0;i<300;i++){ ClearDrawScreen(); // 画面に描画したデータを消す LoadGraphScreen( i , 0 , "char.png" , TRUE ); //画像を描画 Sleep(10); // 10ミリ秒待つ } WaitKey(); // 何かキー入力があるまで待つ DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
実行結果
注意)黄色で書かれている文字や線は表示されません。モーションが画像では伝えにくいために書いたものです。
このプログラムでは確かにキャラは動いて見えますが、画像がやけにチラチラして見えますね。
これはリフレッシュレートが合っていないために起こるものです。リフレッシュレートとはなにか?
お使いのモニタによって様々ですが、だいたい1秒間に60回位モニタはデータを書き換えて表示しています。
このことを「リフレッシュレートが60Hz(ヘルツ)だ」といいます。
1秒間に60回表示するということは1秒を60で割ると16〜17ミリ秒です。つまり16〜17ミリ秒に1回モニタは
画面に表示しているにもかかわらず、プログラムでは10ミリ秒に1度描写しているため、このような事が起こります。
その為「裏画面処理」を行う必要があります。
- Remical Soft -