第4講 ブロック崩しその2(ボールを動かして壁にぶつかると反射するようにするまで)
第5話 画像を動かしてみよう
繰り返し処理を使って
横位置であるxと縦位置であるyを変えていけば、
画像が動くことは予想できますね。
そこで、コードを
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(true); //ウィンドウモードの切り替え
  SetGraphMode(800, 600, 32); //ウインドウサイズの変更
  if (DxLib_Init() == -1)return(-1);  // DXライブラリ初期化処理

  int h = LoadGraph("画像/00.png"); //画像に付けられた出席番号を箱hに収納
  int i; //整数型の箱iを用意
  i = 0; //箱iに0を入れる
  while (i<100 && ProcessMessage() == 0) {
    DrawGraph(20+i, 20, h, true); //画像を描く
    i = i + 1;
  }

  WaitKey();   // キー入力待ち
  DxLib_End();  // DXライブラリ終了処理
  return 0;
}
コピペ用添付ファイル
としてデバッグ開始(F5)をしてみましょう。
ところが、画像が動くどころか、

となってしまいます。
実は前の画面を消していないので、
こうなるのです。
そこで、前話でお話しした
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(true); //ウィンドウモードの切り替え
  SetGraphMode(800, 600, 32); //ウインドウサイズの変更
  if (DxLib_Init() == -1)return(-1);  // DXライブラリ初期化処理

  int h = LoadGraph("画像/00.png"); //画像に付けられた出席番号を箱hに収納
  int i; //整数型の箱iを用意
  i = 0; //箱iに0を入れる
  while (i<100 && ProcessMessage() == 0) {
    ClearDrawScreen(); //画面を消す
    DrawGraph(20+i, 20, h, true); //画像を描く
    i = i + 1;    
  }
  WaitKey();   // キー入力待ち
  DxLib_End();  // DXライブラリ終了処理
  return 0;
}
(文字単位のコピペはできます)
ところが今回画面がちらちらします。
そこで、ScreenFlip();を入れてみましょう。
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(true); //ウィンドウモードの切り替え
  SetGraphMode(800, 600, 32); //ウインドウサイズの変更
  if (DxLib_Init() == -1)return(-1);  // DXライブラリ初期化処理

  int h = LoadGraph("画像/00.png"); //画像に付けられた出席番号を箱hに収納
  int i; //整数型の箱iを用意
  i = 0; //箱iに0を入れる
  
SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える(2017/06/28追加) 画面のちらつき対策
  while (i<100 && ProcessMessage() == 0 ) {
    ClearDrawScreen(); //画面を消す
    DrawGraph(20+i, 20, h, true); //画像を描く
    i = i + 1;
    ScreenFlip(); //画面の切り替え
  }
  WaitKey();   // キー入力待ち
  DxLib_End();  // DXライブラリ終了処理
  return 0;
}
そうすると、うまくスムーズに画像が動きました。
コンピュータでも画像を描くのにある程度時間がかかるのです。
それでちらちらしてしまうので、
表画面と裏画面の2つの画面を用意しておいて、
画像が描き終わったら画面を切り替えるのです。
この記述は、
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(true); //ウィンドウモードの切り替え
  SetGraphMode(800, 600, 32); //ウインドウサイズの変更
  if (DxLib_Init() == -1)return(-1);  // DXライブラリ初期化処理

  int h = LoadGraph("画像/00.png"); //画像に付けられた出席番号を箱hに収納
  int i; //整数型の箱iを用意
  i = 0; //箱iに0を入れる
  
SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える(2017/06/28追加) 画面のちらつき対策
  while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
    DrawGraph(20+i, 20, h, true); //画像を描く
    i = i + 1;
    if (i >= 100)break;
  }
  WaitKey();   // キー入力待ち
  DxLib_End();  // DXライブラリ終了処理
  return 0;
}
コピペ用添付ファイル
とすることもできます。

  while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
    DrawGraph(20+i, 20, h, true); //画像を描く
    i = i + 1;
    if (i >= 100)break;
  }
がわかりにくいと思いますが、
()中がwhile文のループを続ける条件式でした。
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) とする場合に、
ループを続けるかどうかの判定であると同時に、
ScreenFlip()による画面の切り替えと、
ClearDrawScreen()による画面の消去が同時に行われています。
ScreenFlip() == 0によって大きさを比較するとき、
ScreenFlip()が仕事を終えていなければなりません。
社員ScreenFlip()の任務は表画面と裏画面を切り替える仕事をしてから、
その仕事がうまくいったか失敗したかを報告することです。
うまくいったときには0を報告し、失敗したときには1を報告するのでしたね。

以上の説明によって、ゲームプログラミングの骨格は第4話のようになること、
おわかりでしょうか。

尚、
  SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える(2017/06/28追加) 画面のちらつき対策
はなくても現時点ではちらつかないのですが、
画像を読み込んで入れるとちらつく場合がありますので、
入れるようにしてください。
もし、添付ファイル等に私が入れ忘れている場合にもご自分で入れてください。


さて、今回は横方向に動かしましたが、
斜めに動かすにはどうしたらよいでしょうか。
皆さん考えてみてください。

第4話へ  第6話へ
a

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ