第13講 ブロック崩しその1
第4話 ボールを壁で反射させる
を実現するコード例(変更部分だけ記載、ただし添付ファイルは全文記載)
#include "DxLib.h"
・
・
int x=10,y=10; //整数型の箱xとyを用意
・
・
const char mukikae=-1; //むきかえ 方向チェンジ
char muki[2]={1,1}; //むき [0]:xの方向 [1]:yの方向
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
・
・
void gamemain(){ //ゲーム画面
DrawCircle(x,y,10,kiiro,true);
if(x<10 || x>590)muki[0]*=mukikae;
if(y<10 || y>790)muki[1]*=mukikae;
x+=muki[0]*3;
y+=muki[1]*3;
}
・
・
コピペ用添付ファイル
if(x<10 || x>590)muki[0]*=mukikae;
if(y<10 || y>790)muki[1]*=mukikae;
の10と590と790はボールの半径10を考慮に入れているからです。
では、
if(x==10 || x==590)muki[0]*=mukikae;
if(y==10 || y==790)muki[1]*=mukikae;
とするとどうでしょうか。
皆さん実験して下さい。
だめでしたね。
理由は、xは最初10に初期化されていますから、
muki[0]*=mukikae; が無限に繰り返され、
3の幅で行ったり来たりを繰り返してしまいます。
それでは、
if(x<10 || x==590)muki[0]*=mukikae;
if(y<10 || y==790)muki[1]*=mukikae;
はどうでしょうか。
一見良さそうですね。
では皆さん変更してデバッグして下さい。
そうなんと、今回は壁を通り抜けてしまい、
永久にボールは画面から消えてしまいます。
どうしてでしょうか。
x+=muki[0]*3;
ですから、xは
10→13→16→・・・→589→592→・・・
でxの値は590を取ることはありません。
ですから、
muki[0]*=mukikae;
は1回も実行されることはありません。
yについても同様で、
y+=muki[1]*3;
から
10→13→16→・・・→799→802→・・・
となり、yは800の値を取ることはありません。
したがって、
muki[1]*=mukikae;
も1回も実行されないことになります。
後でブロックでも反射させるようにしますが、
反射の条件に幅を持たせる必要があります。
というのは、テトリスと同じで難易度を最初の画面で設定できるようにしますが、
難易度を決定する1つの条件は、ボールの速さになり、
どのような速さでも対応できるようにしなければならないからです。
次の課題です。
画面にバー(bar)を描き、←・→で動かせるようにして下さい。
x座標とy座標がそれぞれバー(bar)とボールと2つとなりますから、
int x=10,y=10; //整数型の箱xとyを用意
は
int m_x=10,m_y=10; //ボール(丸)のx座標とy座標
int b_x=0,b_y=790; //barのx座標とy座標
と変更しておくことにしましょう。
mはmaru(まる)から取っています。
barと区別するためです。
_に『の』という意味を持たせます。
_は下から2行目(横列)の右側のShiftキーの左隣の『ろ』キーを使います。
Shuft+ろ とすると出すことができます。
ただし、
のように壁を動きの限界として下さい。
壁を通り抜けない範囲で動かすということです。
第3話へ 第5話へ
第2部目次に戻る 第1部目次に戻る
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
ecliqse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
ecliqse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ