【HSPプログラミング講座#14】画面端で100個のボールが跳ね返る
タイトルとURLをコピーしました
前回のプログラムでは1個のボールが画面端に到達したら、進む方向を反転して跳ね返るようにしてみました。ここまでできれば応用編です。配列変数を使ってボールを100個に増やせばよいのです。まずは下記のプログラムを打ち込んで実行してみてください。
それでは解説していきます。3~6行目は配列変数でボールの座標x,yを100個用意して、ボールに与える速度もx,yの100個を用意しました。 7行目の変数「繰り返し」はただのカウンターとして用意しただけです。ボールが「1000回移動したらプログラムが終了」するようにするためのものです。
9~14行目が大事なポイントです。まず100回繰り返していますね。これはスタート時のボール100個分のx,y座標を決めています。しかもスタートする座標がランダムになるように乱数を使っています。x座標の画面端が630くらいなので、rnd(630)とすることで630未満の乱数がX_BALLの配列変数に入りますね。次の11行目は同じことをy座標でもやっています。ただしy座標のほうが少し小さいので rnd(460)にしているだけです。 そして変な感じがするのが次の12行目と13行目ですよね? ここでは rnd(11) で「0~10のランダムな数字」を発生させています。その出てきた0~10の数字から5を引いています。そうすることで「マイナス5~プラス5」までの数字を作ってボールの動く速度を持たせている X_SPEED と Y_SPEED に入れています。 これがないとボールは全部同じ方向に動いちゃいますからね!? わからない人は -5 を消して実行してみてください。ボールを上方向と左方向に動かす力はマイナスですからね。 なんか文章で説明するのは伝わりにくいと思いますけど、何度も読み返しながらプログラムとにらめっこしてみてください。 とにかくここではボール100個分の位置と動く方向を作り出すプログラムだということです。
次は17~26行目を説明します。X_BALL と Y_BALL の配列変数に収められている座標を取り出して pos でボールの表示する位置を決定し、mes で表示しています。 その後ボールの次の移動先を決めています。X_SPEED と Y_SPEED が次の移動先までの距離数を持っていますからね。それを X_BALL と Y_BALL に入れているだけです。 その後の22~25行目までは当たり判定処理です。もしもボールが画面端に到達したらX_SPEEDもしくはY_SPEEDを反転させています。前回のプログラムでもやりましたね。進む方向がプラスだったらマイナスに、マイナスだったらプラスに変換しています。
はい、ココまでで1回目のボールが100個表示された状態です。
次の28~31行目で、これを1000回繰り返すまで終わらない。というプログラムになっています。7行目で用意した「繰り返し」変数がココで登場します。1000に到達したらstopします。それ以外なら cls で画面を全て消去して、ボールを100個表示するプログラムに戻れ!というプログラムになっています。
わかりましたか? 実行すると下記のような感じです。
このボールを虫の画像に変えたら面白そうですね~! ちなみに何度か実行してみて違和感を感じた人もいるかと思いますが、2つの問題がありますよ! わかるかな?
1つ目は「全く動かないボールがあること」 2つ目は「何度実行しても動きが変わらないこと」です。 1つ目の問題は rnd で乱数を発生させて -5 から 5 までの数字を作っていますが、当然 0 が発生することがあります。X_SPEED も Y_SPEED も 0 だと動かないですからね。またよく見てみるとまっすぐに縦もしくは横にしか動かないボールもありますね。X_SPEED もしくは Y_SPEED のどちらかに 0 が入ると真っ直ぐにしか動かないですからね。 2つ目の問題は rnd で乱数を発生させているにも関わらずボールの位置がいつも同じ。だということです。乱数といっても実は「連続していない数字」がでてくるだけで、何度実行しても同じ連続していない数字が出てきます! 乱数じゃねーじゃん!(笑) いや、でもたぶん他のプログラミング言語でも同じでしたよ。ワタクシの知る限りでは。