第5講 ブロック崩しその3(ブロックを描き、ボールがブロックに当たったら跳ね返るようにする)
第7話 2次元for文でブロックを実現する
解答例
#include "DxLib.h"
void maru(); //bar(バー)区別するためにボールをmaruとする maru用の変数はmx等と表す。
void sikaku(); //bar(バー)と区別するためにblock(ブロック)をsikaku(しかく)とする。sikaku用の位置を表す変数はsy、sxとする。
int mx = 10, my = 10; //bar(バー)やblock(ブロック)と区別するためにball(ボール)はmaru(まる)とする。
int sx = 0, sy = 100; //sikaku(しかく)すなわちブロックの横位置と縦位置、初期位置の決定
const int houkougae = -1; //ほうこうがえ 方向チェンジ
int mx_houkou = -1; //mxの最初の方向
int my_houkou = -1; //myの最初の方向
int kiiro = GetColor(255, 255, 0); //黄色に出席番号を割り振りその番号を箱kiiroに収納
int aka = GetColor(255, 0, 0); //黄色に出席番号を割り振りその番号を箱kiiroに収納
int midori= GetColor(0, 255, 0); //緑色に出席番号を割り振りその番号を箱midoriに収納
int ao = GetColor(0, 0, 255); //青色に出席番号を割り振りその番号を箱aoに収納
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(true); //ウィンドウモードの切り替え
  SetGraphMode(800, 1000, 32); //ウインドウサイズの変更
  if (DxLib_Init() == -1)return(-1);  // DXライブラリ初期化処理

  SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える(2017/06/28追加) 画面のちらつき対策
  while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
    maru(); //ボールの位置を計算して、その位置にボールを描く社員
    sikaku();
    //ブロックの位置を計算して、その場所にブロックを描く社員
    //将来的には当たったら消えるようにする仕事も担当する
  }

  WaitKey();   // キー入力待ち
  DxLib_End();  // DXライブラリ終了処理
  return 0;
}
void maru() { //ボールの位置を計算して、その位置にボールを描く社員
  DrawCircle(mx, my, 10, kiiro, true); //ボールを描く
  if (mx == 10)mx_houkou *= houkougae;
  if (mx == 790)mx_houkou *= houkougae;
  if (my == 10)my_houkou *= houkougae;
  if (my == 988)my_houkou *= houkougae;
  mx += 2 * mx_houkou;
  my += 6 * my_houkou;
}
void sikaku() {
  
int i, j,a;
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 10; j++) {
      a = (10 * i + j) % 3;
      if (a == 0)DrawBox(80 * j, 40 * i + 100, 80 * (j + 1), 40 * (i + 1) + 100, aka, true);
      if (a == 1)DrawBox(80 * j, 40 * i + 100, 80 * (j + 1), 40 * (i + 1) + 100, midori, true);
      if (a == 2)DrawBox(80 * j, 40 * i + 100, 80 * (j + 1), 40 * (i + 1) + 100, ao, true);
    }
  }

}
コピペ用添付ファイル
ゲーム画面
01

F5をするとわかりますが、
ボールはブロックを通過するときに消えたようになっています。
でも賢い皆さんですから、
消えたのではなく、ブロックの下を通っていることはおわかりですよね。
ゲーム画面は何枚も画像が重ねられているのでした。
ブロックの方を後から描いていますから、
ボールよりブロックの方が上にあるわけで、
通過している間見えなくなるのは当然です。
ブロック崩しの場合には、
ブロックに当たったら跳ね返ることになっていますから、
問題はありませんね。
では、第5講最後の課題とします。
ブロックに当たったら跳ね返るようにしてください。
尚、ボールの初期位置は一番下の真ん中に変更してください。
すると、
int mx_houkou = 1; //mxの最初の方向
int my_houkou = 1; //myの最初の方向
も変更しなければなりません。
初期位置が変わったこと、ブロックで跳ね返るようにすると条件に変わったことから、
  if (mx == 10)mx_houkou *= houkougae;
  if (mx == 790)mx_houkou *= houkougae;
  if (my == 10)my_houkou *= houkougae;
  if (my == 988)my_houkou *= houkougae;
の条件式の部分をいじらなければなりません。
これも試行錯誤をしないと跳ね返る適切な値を発見することはできません。
粘り強く見つかるまで探しましょう。
mxの初期位置が奇数になるので、mxの方の条件式は奇数になることをヒントとしておきましょう。

もちろん、今の段階では当たったブロックが消えるようにすることは、
初心者には不可能に近いですね。
もし、小学生が現時点で消せたら、
あなたは天才です。
プログラミングの才能があることになります。
是非、プログラマーを目指しゲームプログラミングやAIの研究をしてください。



第6話へ
 第8話へ
a

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

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