12. 画像を動かす。


ゲームは画像が動かなきゃ始まりませんよね。次は画像を動かしてみましょう。
for文によって、xの座標を少しずつ動かしていきます。急に動かないように
Sleep関数を使用します。Sleep関数はミリ秒を引数にして、引数分だけ処理を止めます。
例えばSleep(10);とすれば10ミリ秒すなわち0.01秒だけ処理が止まります。

サンプルでは0.01秒ずつx座標を1増やしながら表示し、x座標が300以上になったらブレイクしています。

↓コピー&コンパイル用サンプルプログラム↓


※注:
  この章は13章のようなプログラムが何故必要になるかを示すためのもので、
  適切ではないプログラムの例を紹介しています。
  実行結果はこれと異なる場合があり、何も表示されないかもしれません。移動終了後にだけ表示されることもあります。


#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 -