画像(logo)

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

広告

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

広告

↓2016年02月29日発売↓

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

目次へ戻る

ボールを反射

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

ボールの移動

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

#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□

広告

↓2017年06月16日発売↓

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

新品価格
¥2,700から
(2017/5/1 13:05時点)

↓2014年08月09日発売↓

新・明解C言語 入門編 (明解シリーズ)

新品価格
¥2,484から
(2017/5/1 13:08時点)

↓2016年02月20日発売↓

新・解きながら学ぶC言語

新品価格
¥2,160から
(2017/5/1 13:10時点)

↓2017年02月11日発売↓

C言語プログラミング基本例題88 88

新品価格
¥3,024から
(2017/5/1 13:12時点)

↓2016年12月15日発売↓

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/5/1 13:13時点)

↓2017年02月08日発売↓

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

新品価格
¥2,700から
(2017/5/1 13:15時点)