広告
↓発売日:2018年09月22日↓
新品価格 |
今回はボールを移動させて端についたら反射させるというトコロまでをやっていきたいと思います。
まずはボールを移動させてみましょう。
#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; }
ボールの「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; /*省略*/
ボールがいなくならないように初期座標を中心からにしております。
先ほどと逆の方向に移動していったと思います。
同じように「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; }
これでもしボールがなんらかの事情で壁にめり込みすぎて(反射条件である座標をオーバーしすぎて)、一回の移動分の反射で戻ってこれない時も、はまり込んでしまう事なくもとに戻ってくる事ができます。(一回の移動分で戻ってこれないと再びそこで反射してしまうのではまり込んでしまいます!)
ボール反射!!!
ここまでの中間ソースになります。
中間ソースのボールのスピードは少し速くなっております。
では次回は自機バーを表示、移動させたいと思います。
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |