画像(logo)

HOME/[C言語DXライブラリ]ブロック崩しの作り方 目次/三日目 ボールを反射

広告

[C言語 DXライブラリ ブロック崩しの作り方]
三日目 ボールを反射

広告

↓発売日:2018年09月22日↓

たった1日で基本が身に付く! C言語 超入門

新品価格
¥2,225から
(2018/10/8 23:10時点)

目次へ戻る

ボールを反射

今回はボールを移動させて端についたら反射させるというトコロまでをやっていきたいと思います。

ボールの移動

まずはボールを移動させてみましょう。

#include "DxLib.h"

int my_get_key(void);

int key[256];

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);

	/*ここは最初の一度だけ実行されるので*/
	/*変数の初期化などを書く*/

	int ball_x = 0;
	int ball_y = 0;
	int x_speed = 1;
	int y_speed = 1;
	int Color_White = GetColor(255,255,255);

	while (ScreenFlip()==0 && ProcessMessage()==0
		 && ClearDrawScreen()==0 && my_get_key()==0){

		/*ここにプログラムを書く*/
		
		DrawCircle(ball_x,ball_y,5,Color_White,true);
	
		ball_x = ball_x + x_speed;
		ball_y = ball_y + y_speed;
	}
	DxLib_End();
	return 0;
}
	
int my_get_key(){
	char keys[256];
	GetHitKeyStateAll(keys);
	for (int i = 0; i < 256; i++){
		if (keys[i] != 0){
			key[i]++;
		}
		else{
			key[i] = 0;
		}
	}
	return 0;
}

■実行結果■

画像(cdxb_3_1)

ボールの「x,y」座標の変数「ball_x,ball_y」とx方向、y方向の一回の移動分の変数「x_speed,y_speed」を用意してそれぞれ足し合わせる事によってボールを移動させております。

ボールの描画には

DrawCircle(x座標,y座標,半径,色,塗りつぶすかどうか);

円を描く関数「DrawCircle()」を使っております。

見たままなので説明は省略します。

最後の塗りつぶしの指定は「true」で塗りつぶす、「false」で塗りつぶさないとなります。

あとは移動分を足し合わせているだけですね。

ball_x = ball_x + x_speed;
ball_y = ball_y + y_speed;

無事に移動させる事ができました!

反射の条件

それでは反射させましょう!といきたいトコロですがその前に反射の条件を決めます。

反射の条件ですが、今回はこのウィンドウのフチで反射させたいのでそれぞれのフチの座標

「x=0,x=640,y=0,y=480」

こちらを反射の条件にしたいと思います。

そして条件式はこの座標を超えた場合なので単純に

if(ball_x >= 640){
}

if(ball_x <= 0){
}

if(ball_y >= 480){
}

if(ball_y <= 0){
}

以上(以下)になった場合という条件式でいきたいと思います。

ではここにボールの向きを変える処理を書いていきます。

広告

ボールの向きを変える

ボールの向きを変えるというのはどういう事なのでしょうか?

さきほどのプログラムを使って考えてみたいと思います。

まずさきほどのプログラムの「while」ループの手前、変数を宣言している部分を次のように書き換えてみましょう。

/*省略*/

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);

	/*ここは最初の一度だけ実行されるので*/
	/*変数の初期化などを書く*/

	int ball_x = 320;
	int ball_y = 240;
	int x_speed = -1;
	int y_speed = -1;

/*省略*/		

■実行結果■

画像(cdxb_3_2)

ボールがいなくならないように初期座標を中心からにしております。

先ほどと逆の方向に移動していったと思います。

同じように「x_speed,y_speed」のプラスマイナスを今度は「x_speed」だけプラスにしたりしてみてください。

方向が変わるのを確認できるかと思います。

つまりはこの一回の移動分「x_speed,y_speed」のプラス、マイナスでそれぞれの方向を変える事ができるんですね!

ではこのプラス、マイナスを変えるにはどうしたらいいか?

これは簡単な計算で実現できます。

x_speed = x_speed * -1;

「-1」をかけてあげるだけでプラス、マイナスが反転してくれます。

あとはこれを先ほどの条件式に書くだけですね!

if(ball_x >= 640){
	x_speed *= -1;
}

if(ball_x <= 0){
	x_speed *= -1;
}

if(ball_y >= 480){
	y_speed *= -1;
}

if(ball_y <= 0){
	y_speed *= -1;
}

座標を超えた時にプラスマイナス反転して方向を変える事ができました!

めり込みをもとに戻す

最後にボールが反射した瞬間、めり込み防止としてボールの半径サイズ分座標を内側に修正してあげます。

if(ball_x >= 640){
	ball_x = 640 - 5;
	x_speed *= -1;
}

if(ball_x <= 0){
	ball_x = 5;
	x_speed *= -1;
}

if(ball_y >= 480){
	ball_y = 480 - 5;
	y_speed *= -1;
}

if(ball_y <= 0){
	ball_y = 5;
	y_speed *= -1;
}

これでもしボールがなんらかの事情で壁にめり込みすぎて(反射条件である座標をオーバーしすぎて)、一回の移動分の反射で戻ってこれない時も、はまり込んでしまう事なくもとに戻ってくる事ができます。(一回の移動分で戻ってこれないと再びそこで反射してしまうのではまり込んでしまいます!)

画像(cdxb_3_3)

ボール反射!!!

ここまでの中間ソースになります。

中間ソース2

中間ソースのボールのスピードは少し速くなっております。

では次回は自機バーを表示、移動させたいと思います。

次回

四日目 自機バーを表示

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓発売日:2016年02月29日↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2018/10/8 23:25時点)

↓発売日:2018年06月22日↓

スッキリわかるC言語入門

新品価格
¥2,916から
(2018/10/8 23:15時点)

↓発売日:2018年03月09日↓

C言語本格入門 ~基礎知識からコンピュータの本質まで

新品価格
¥3,218から
(2018/10/8 23:16時点)

↓発売日:2017年06月14日↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2018/10/8 23:17時点)

↓発売日:2018年05月21日↓

作って身につく C言語入門

新品価格
¥2,462から
(2018/10/8 23:18時点)

↓発売日:2017年12月07日↓

新・標準プログラマーズライブラリ C言語 ポインタ完全制覇

新品価格
¥2,678から
(2018/10/8 23:19時点)

↓発売日:2017年02月08日↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2018/10/8 23:20時点)

↓発売日:2017年09月26日↓

かんたん C言語 [改訂2版] (プログラミングの教科書)

新品価格
¥2,916から
(2018/10/8 23:22時点)