第4講 ブロック崩しその2(ボールを動かして壁にぶつかると反射するようにするまで)
第9話 ボール専用の社員を雇う
第7話の問題の解答例
#include "DxLib.h"
#include "DxLib.h"
void maru(); //bar(バー)区別するためにボールをmaruとする maru用の変数はmx等と表す。
int mx, my; //bar(バー)やblock(ブロック)と区別するためにball(ボール)はmaru(まる)とする
int kiiro = GetColor(255, 255, 0); //黄色の出席番号を割り振りその番号を箱kiiroに収納
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(true); //ウィンドウモードの切り替え
  SetGraphMode(800, 600, 32); //ウインドウサイズの変更
  if (DxLib_Init() == -1)return(-1);  // DXライブラリ初期化処理

  
SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える(2017/06/28追加) 画面のちらつき対策
  while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
    maru(); //ボールの位置を計算して、その位置にボールを描く社員
  }

  WaitKey();   // キー入力待ち
  DxLib_End();  // DXライブラリ終了処理
  return 0;
}
void maru() {
  DrawCircle(mx, my, 10, kiiro, true); //ボールを描く
  mx+=4; //xの値を1つ大きくする
  my+=4; //yの値を1つ大きくする
}
コピペ用添付ファイル
では動く角度をもっと鋭くしてください。
005
横1:縦3の割合です。
解答例は30行下。























解答例
#include "DxLib.h"
#include "DxLib.h"
void maru(); //bar(バー)区別するためにボールをmaruとする maru用の変数はmx等と表す。
int mx, my; //bar(バー)やblock(ブロック)と区別するためにball(ボール)はmaru(まる)とする
int kiiro = GetColor(255, 255, 0); //黄色の出席番号を割り振りその番号を箱kiiroに収納
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  ChangeWindowMode(true); //ウィンドウモードの切り替え
  SetGraphMode(800, 600, 32); //ウインドウサイズの変更
  if (DxLib_Init() == -1)return(-1);  // DXライブラリ初期化処理

  SetDrawScreen(DX_SCREEN_BACK); //裏画像を描画対象に加える(2017/06/28追加) 画面のちらつき対策  
  while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
    maru(); //ボールの位置を計算して、その位置にボールを描く社員
  }

  WaitKey();   // キー入力待ち
  DxLib_End();  // DXライブラリ終了処理
  return 0;
}
void maru() {
  DrawCircle(mx, my, 10, kiiro, true); //ボールを描く
  mx+=2; //xの値を1つ大きくする
  my+=3; //yの値を1つ大きくする
}

さて、第4講最後の課題です。
壁にぶつかったら跳ね返るようにするです。
前に簡単に説明したif文を使います。
if(P)A;

もしPならばAの命令を実行せよです。
if(P){
  A;
  B;
}
とすれば、
もしP(が正しければ)命令AとBを実行しなさいです。
{}の中ににはいくつでも命令文を入れることができます。

以上のヒントでは初心者にはあまりにもむずかしすぎます。
壁にあったときに進む方向がチェンジできればよいのです。
グローバル定数
const int houkougage=-1; //ほうこうがえ 方向チェンジ
(constを入れると定数になります。
変数とは違いこの後いろいろな値を入れることはできません。)
です。

小学生の皆さんは−(マイナス)については、学んでいませんが、
気温で−5°などの表示を知っていますね。
0°を基準にして上の温度を+として下の温度を−としているのです。
基準の場所から見て右の方向を+と約束した場合に、
−は左の方向ということになります。
今は単純に右方向を+(+1)、
その反対方向の左を−(−1)と表すと思ってください。
−は反対の意味だと思ってください。
ですから、(−1)×(−1)=1(普通+は省略して表示します)です。
反対の反対はもとに戻りますね。
ただし、縦方向は+が下方向を示し、
−が上方向を示します。
ゲーム画面では
01
一番左で一番上の点を基準にして、
横位置(普通xで表す)と縦位置(普通yで表す)をしめします。
中学1年生で習う(x座標、y座標)とはy座標の方向が反対であることに注意が必要です。
下方向が+で上方向が−です。


int mx_houkou=-1; //-1はmxの最初の方向
int my_houkou=-1; //-1はmyの最初の方向
をヒントとしておきましょう。
_は「の」の意味を持たせることにします。
Shift+「ろ」キーで_は出せます。
出ないときは、
int mx-houkou=-1; //mxの最初の方向
int my-houkou=-1; //myの最初の方向
でもよいです。
名前自体には意味はないことを覚えください。
どんな名前を付けてもよいのです。

最初の方向がどうして-1なっているか考えてください。
また、壁にぶつかるとは横壁なら
mx==10またはmx==790
縦壁(天井または床)なら
my==10またはmy=592
です。
SetGraphMode(800, 600, 32); //ウインドウサイズの変更
の設定になっていたことを思い出してください。
それとずれているのは、ボールの半径を考慮に入れているからです。
ボールの大きさが10に設定されていますから、
my=592はmy=590のはずですが、
my += 6となっている場合に、
初期位置10から580動いた時点で、
590になりますが、myは6の倍数で変化していきますので、
ぴったり580になることはありません。
592の場合にもmyは582動くことになり、
これも6の倍数ではありませんが、
試行錯誤をして跳ね返ることを見つけたのです。
この後自由に速度を変更できる(難易度の変更)ようにするためには、
跳ね返りの条件に少し幅を持たせるといいでしょう。
例えば、
my >=587 && my<=593
(これは587≦my≦593を意味します。
≦≧の記号はキーボードにはありませんから
>=と<=を割り当てているのです。)

また初期位置は、ボールの速さを考慮に入れて
int mx=10, my=10;
としておきましょう。
もし、ゲーム画面の大きさを変えた場合にはその設定に従ってください。


第8話へ  第10話へ
a

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

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