第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なっているか考えてください。

また、ボールの半径10を考慮に入れて跳ね返りの条件を
  if (mx == 10)mx_houkou *= houkougae;
  if (mx == 790)mx_houkou *= houkougae;
  if (my == 10)my_houkou *= houkougae;
  if (my == 590)my_houkou *= houkougae;
で良さそうに思います。
横壁では確かにこれで跳ね返りますが、
上下の壁(天井と床)では跳ね返りません。
理由は、縦方向(y方向)の速さが3ですから、
0→3→6→・・・→588→591→
となり、ぴったり590をとることがないからです。
3の倍数であるかどうかは、各位の数字の和が3の倍数であるかで判定できます。
各位の数字の和は3の倍数であれば、その整数は3の倍数ですし、
逆に各位の数字の和が3の倍数でなければ、その整数は3の倍数ではありません。
1+0=1
5+9+0=14
で両方とも3の倍数ではありませんから、
10も590も3の倍数でないことがわかります。

また、横壁についても横方向の速さを3に変更すれば
10と790の値になることはありませんから、
やっぱり跳ね返りません。
10も790も3の倍数ではないからです。


ゲーム級を指定するときに、
速さは変更できるようにすべきですから、
いかなる速さにも対応できるようにすべきです。
  if (mx == 10)mx_houkou *= houkougae;
  if (mx == 790)mx_houkou *= houkougae;
  if (my == 10)my_houkou *= houkougae;
  if (my == 590)my_houkou *= houkougae;
を少し変えるだけでどの速さに対しても跳ね返るようになります。



第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 入門 サイト 基礎から応用まで
本サイトトップへ