プログラムの中身を詳しくみてみよう
右向き矢印ボタンを押して助走し、スペースボタンを押してボールを投げるゲームです。 それぞれのスプライトについて解説します。
概要
大まかな内容
- を押して開始します。
- キーボードの左右の矢印キーでボールを持った猫を動かし助走します。
助走が長い程、投げた時のボールの速さを速くします。
助走をまったくしない場合の速さは秒速14m、助走をすると 増えていき秒速28mを最大とします。
一度右向き矢印キーを離したり左向き矢印キーを押したりして止まったり、 左に進んだりしたら速さを秒速14mに戻します。
- スペースキーを押したらボールを投げます。
スペースキーを押したら助走をやめ、スペースキーを離したらボールを投げます。
スペースキーを押してから離すまでの時間で投げる方向(地面との角度)を決めます。
押している時間が長いほど角度を大きくします。角度は9度から90度までとします。
- ボールを投げる際に猫が踏切線を越えていたらファールにします。
ボールが最初に地面に着いた場所と踏切線との距離を記録とします。
ボールが最初に地面に着いたら判定員がそこまで移動し、記録を言います。
ボールの動き方
- 投げたときのボールの速さを上方向の速さと右方向の速さにわけます。
例えば投げた時のボールの速さが秒速28m、投げた角度が40度の場合は
上方向(y方向)の速さが28×sin(40度)=秒速18m
右方向(x方向)の速さが28×cos(40度)=秒速21.45mになります。
- ボールのx座標は右方向(x方向)の速さのぶんだけ増やし続けます
(右方向には一定の速度で移動します)。
ボールのy座標はまず上方向(y方向)の速さのぶんだけ増やし続けますが、 重力加速度(9.806m/s²)のぶんだけ上方向(y方向)の速さを減らしていきます。
上方向(y方向)の速さは徐々に0になり、その後は下方向に速くなっていきます。
y座標は減り続け、地面に落ちて止まります。
実際に地球上でボールを投げた場合には空気抵抗などの影響を受けますが、 本プログラムでは空気抵抗などの影響はないものとしています。
Startボタン
主な動き
- がクリックされたらコスチュームをStartにする。
- クリックされたら各スプライトへStart を送り、非表示にする(各スプライト Startを受け取ってゲーム開始)。
- ボールから完了が送られてきたらコスチュームをRetryにして表示する。
がクリックされたとき
-
- 説明
- ゲームスタートの準備をする。
- 必要な処理
- 座標の初期化
Startの表示
マウスポインターが上に乗ったとき色を変える - コードの詳細
-
x座標(横の表示位置)を0、 y座標(縦の表示位置)を40にします。
コスチュームをStartにして表示します。 (ゲーム終了時は非表示になっているため)
マウスポインターがこのスプライトに触れているときは色を変え、 離れたら元の色に戻します。
このスプライトがクリックされたとき
-
- 説明
スタートボタンがクリックされたら各スプライトに Startを送りゲームを開始します。
- コードの詳細
Startを送ります。
ボタンを隠します。
完了を受け取ったとき
-
- 説明
ボールが止まったらRetryボタンを表示します。
- コードの詳細
x座標を0、 y座標を40にします。
コスチュームをRetry にします。
ボール
主な動き
- がクリックされたら各変数を初期化して助走を開始。
- 助走中は左向き矢印(←)キー、右向き矢印(→)キーが押されたらPlayerと同じように左右に移動する。
- 右向き矢印(→)キーが押されている間は初速を増やしていく。
右向き矢印(→)キーが押されていなかったり、左向き矢印(←)キーも押されていたりした場合は 初速を14(m/秒)に戻す。
右へ移動している間だけ初速を増やしていき、 止まったり左へ移動したりしたら初速を初期値へ戻す。 - スペースキーを押したらボールを投げる。
この時、スペースキーを押してから離すまでの時間によって投げる角度を決める(長いほど角度が大きくなる)。
踏切線を越えてしまっていたら(x座標 > 踏切線のx座標だったら)ファールとする。 - スペースキーを離したら、投げた位置、投げた時のボールの速さ、投げた時の角度が決まる。
ボールの速さは 右方向の速さと 上方向の速さへ分解する。
右方向には右方向の速さで進み続ける。
上方向にはまず 上方向の速さで移動を開始し、 重力加速度の分だけ遅くなっていき、そのうち速さがマイナスとなり落ちていく。 - ボールの高さが0になったら跳ね返る。この時、上方向の速さを50%、
右方向の速さを40%に減らす(跳ね返る度に遅くなり最終的に止まる)。
最初に落ちた場所と踏切線との距離が記録となる。 - ファールでなかった場合のみ、最初に地面に落ちた時に 着地を計測員へ送る。
- 記録、 飛んだ距離、 投げた時の時速、 投げた角度を履歴リストへ追加する。
「Start」を受け取ったとき
-
- 説明
左右の矢印キーで助走し、スペースキーを押してボールを投げます。
- 必要な処理
- 1. 変数の初期化
- 2. ペンで書かれたボールの軌跡を消す
- 3. 助走
- 4. 投げる角度を決定
- 5. 投げた時の初速と投げる角度から右方向の速さと上方向の速さを計算
- 6. 投げた後のボールの動きの処理
- コードの詳細
このスプライトの他のスクリプトを止めます。
x座標を-210、 y座標を-144(初期位置)にします。
ペンの色と太さを設定します。
ボールの軌跡を消します。(前回投げた際の軌跡を消します)
ボールを表示します。
猫の上にボールが表示されるようにするために 最前面へ移動するを置きます。
各変数を初期化します。
スペースキーが押されるまで助走します。
投げた時のボールのx座標 を投げた場所として記憶しておきます。
スペースキーを離すまでの時間で投げる角度を決定します。
投げたボールの動きは水平方向(右方向)と垂直方向(上下方向)にわけて計算します。
ここでは投げた時のボールの速さと角度からボールの右方向の速さと上方向の速さを計算しています。
右方向の速さは「速さ×cos(地面との角度)」で求められます。
上方向の速さは「速さ×sin(地面との角度)」で求められます。
画面の左側に表示する値を計算します。
投げたを送ります。
投げるを実行します。
初期化
-
- 説明
各変数に初期値を設定します。
スペースキーが押されるまで助走
-
- 説明
スペースキーが押されるまで左向き矢印キー、右向き矢印キーで動かせるようにします。
Playerと同じように動きます。
- 必要な処理
- 1. 左右矢印キー(← / →)が押された時の左右への移動
- 2. 初速を計算
- 3. ファールの判定
- コードの詳細
スペースキーが押されるまで左向き矢印キー、 右向き矢印キーで動かせるようにします。
右向き矢印キーが押されている間、下記のAの処理をして右に動かします
- A :
x座標を2ずつ変えて右に動かします。
ただし画面の右端よりも右には進めなくするようにするために、 x座標が210よりも小さい場合のみ x座標を変えるようにします。
右に動いている間はボールの初速 を秒速0.7mずつ増やします。
もし 初速が28よりも 大きくなってしまったら28に戻します。
右向き矢印キーが押されていなかったら(右向き) 初速を秒速14mに戻します。 左向き矢印キーが押されている間、下記のBの処理をして左に動かします。
- B :
x座標を-2ずつ変えて左に動かします。
ただし画面の左端よりも左には進めなくするようにするために、 x座標が-210よりも大きい場合のみ x座標を変えるようにします。
ボールの初速を秒速14mに戻します。
ここで14に戻さないと右向き矢印キーと左向き矢印キーの両方が 押されている間も初速が増えていってしまいます。 スペースキーが押された時にx座標が 踏切線のX座標を越えていたら ファールを1にします。 ファールの 値は他のスプライトからも参照されますので、すべてのスプライト用にしています。
スペースキーを離すまでの時間で投げる角度を決定
-
- 説明
スペースキーを押している間、ボールを投げる角度を増やしていきます (スペースキーを押している時間が長いほど上に向かって投げます)。
投げる角度は最大で90度(真上)とします。
- コードの詳細
スペースが押されている間、投げた角度 (ボールと地面との角度)を2度ずつ増やします。
角度が増えるスピードが速すぎるため、2度増やす度に0.01秒待つようにしています。
1回で増やす角度を小さくして待つ時間を短くしたほうが角度を細かく変えられるのでよいのですが、 待つ時間をこれ以上短くしても実際に動かしてみると指定した待ち時間よりも長くかかってしまい、 角度が増えるスピードが遅すぎてしまうため、0.01秒ごとに2度ずつ増やすようにしています。
角度が90度を越えてしまった場合は90度に戻します。
90度に戻す処理をはずし、90度より大きい角度で投げた場合に どのようにボールが飛ぶのかをためしてみましょう。
表示する値を計算
-
- 説明
投げた時のボールの速さ、右方向の速さ、上方向の速さを秒速?mから時速?kmに変更しています。
投げる
-
- 説明
投げた時には垂直方向では上に進み、 重力によって速さが9.807m/秒(地球の場合)ずつ遅くなっていきます。
速さがプラスの間は上に向かって進みますが、 マイナスになった後は下に落ちていき、高さが0mになったら地面で跳ね返ります。
水平方向は右に同じ速さで進みます。
ボールの高さが0mになるまでに右に進んだ距離が飛距離となります。
実際に地球上でボールを投げた場合には空気抵抗などの影響を受けますが、 本プログラムでは空気抵抗などの影響はないものとしています。
- コードの詳細
ボールが止まったを0にします。
回転速度を20度にします。
ボールが止まったが 1になるまで下記のAの処理をくり返します。
- A :
ボールは飛んでいる間、右に回転するようにします。
1回のループで右に回転速度度回転させます。
最初に地面に着くまでは回転速度を20度とし、着地後は5度にしています。
飛距離は 右方向の速さ(m/秒)の分だけ増やしていきます。
飛距離を増やす量は計算上では 右方向の速さ(m/秒)×ループ1回分の時間(秒)にすべきですが、 画面上で自然な速さに見えるようにするために 右方向の速さ(m/秒)× 速度調整係数(=0.1)(秒)としています。
ボールのx座標を 投げた場所(投げた場所のx座標)+ 飛距離× 距離と座標の比にします (飛距離の単位はメートルなので画面上の座標に変換しています)。
現在のボールの高さから ループ1回分の高さの変化量を足しても0より大きい(地面につかない) 場合は空中での処理を実行します。
そうでない場合(高さが0になり地面に着く場合)は 空中での処理を実行します。
ボールが止まったが0のままであれば次のループを実行します。
そのままくり返すとボールの動きが速すぎてしまうため、 ループが1回実行されるたびに0.01秒待つようにして動きを見やすくしています。 ボールが止まったが 1になっていればくり返し処理を終了し、 完了を送ります。
空中での処理
-
- 説明
上方向の速さにしたがって ボールの高さを変更し、 ボールの高さをもとに画面上でのy座標を決定します。
上方向の速さは 重力加速度にしたがって変わっていきます。
投げてから最初に地面に着くまではボールの軌跡をペンで描画します。
- コードの詳細
上方向の速さにしたがって ボールの高さを更新します。 この時も飛距離を計算する際に使用した速度調整係数を使用します。
ボールの高さをもとにボールの y座標を更新します (ボールの高さ→Y座標を実行します)。
上方向の速さを重力加速度× 速度調整係数だけ減らしていきます (上に向かって進んでいる時は遅くなっていき、下に向かって進んでいる時 (落ちている時)は速くなっていきます)。
もしx座標 > 234または y座標>174である場合は ボールの座標が画面の外になるため、ボールを隠します。
ボールの座標が画面内である場合は表示し、 投げてから最初に地面に着くまではボールの軌跡をペンで描画します。
一度着地した後は回転速度を5度になるため、 20度であれば一度も地面に着地していないと判断して軌跡を描画しています。
着地した時の処理
-
- 説明
ボールの高さを0にし、 ボールのy座標を高さが0の時の座標にします。
着地するまでは上方向の速さはマイナスであり、 着地したらプラスにして跳ね返るような動きにします。
着地するたびに上方向の速さ、 右方向の速さの大きさを減らします。
初めて着地した際には他のスプライトへ着地を送り、 飛距離や記録を計算して履歴に追加します。
- コードの詳細
ボールの高さを 上方向の速さ ×速度調整係数の分だけ変えてしまうと マイナスになってしまうので着地した時の処理では ボールの高さを0にします。
ボールの高さ→Y座標を 実行してボールのy座標を変更します。 この時は必ず高さが0の時のy座標になります。
ボールが地面に当たって跳ねる度に上方向の速さを50%、 右方向の速さを40%に減らします。 また上方向の速さをプラス(上に向かって進む)にします。
回転速度が20度だった場合は、 初めての着地なので下記のAの処理をします。
- A :
回転速度を5度に減らします。
ボールのx座標を「落ちた場所」として記憶しておきます。
もしファールでない場合(ファールが0の場合)、 ボールが飛んだ距離と記録を計算し、 他のスプライトに着地を送ります。
飛んだ距離は 飛距離を四捨五入して整数にした値です。
記録は踏切線のX座標と 投げた場所との距離を 飛距離から引いた値になります。 「踏切線のX座標と 投げた場所との距離」の単位は座標なので 距離と座標の比(3.6)で割ってメートルに変換しています。
ファールの場合は記録の計算やメッセージの送信はしません。
履歴作成を実行して、 今回の記録を履歴に追加します。 上方向の速さの絶対値と 右方向の速さがどちらも1より小さくなった、 もしくはx座標が234より大きくなった(画面の外で着地した)ら ボールが止まったを1にします。
「x座標が234より大きい場合」を入れないと、 ボールが画面の外にあって見えない場合でもバウンドが終わるまで待たなくてはなりません。
ボールの高さ → Y座標
-
- 説明
ボールの高さ(m)をもとにボールの y座標を変更します。
履歴作成
-
- 説明
記録、飛んだ距離、投げた時の時速(km/h)と角度を履歴に追加します。
履歴は最大5件まで保存され、5件を超えると古いものから削除します。
- コードの詳細
履歴要素に 1回の投球についてのそれぞれの情報を文字列として追加して、 1つの文字列をつくり、それを履歴のリストに追加していきます。
ファールが0なら(ファールでなければ) 履歴要素に記録を追加します。
ファールが0以外なら(ファールなら)記録ではなく 「ファール」を追加します。
飛んだ距離(投げてから最初に地面に着くまでの距離)、 投げた時の時速、投げた角度を 履歴要素に追加します。
履歴要素を履歴に追加します。
履歴の長さが5を超えてしまったら5になるまで先頭から削除していきます。
プレーヤー
主な動き
- 左(←)キー、右(→)キーが押されたら左右に移動する。
- 左右に移動している間、コスチュームをくり返し切り替えて歩いているようにみせる。
- スペースボタンが押されたら止まり、それ以降は左(←)キー、右(→)キーを押しても動かないようにする。
「Start」を受け取ったとき
2つの処理を並行でおこないます。
-
- 説明
プレーヤーを開始位置に置き、スペースキーが押される (ボールを投げる)まで左向き矢印キー、右向き矢印キーで動かせるようにします。
- コードの詳細
x座標を-220、y座標を-140(初期位置)にします。
スペースキーが押されるまで下記のAの処理をくり返します。
- A :
左向き矢印キーが押されている場合、下記のBの処理をします。
逆に右向き矢印キーが押されている場合、下記のCの処理をします。 - B :
向きを-90度(左)に向けます。
x座標を-2ずつ変えて左に動かします。
ただし画面の左端よりも左には進めなくするようにするために、x座標 が-220よりも大きい場合のみx座標を変えるようにします。
Playerのx座標は常にボールのx座標-10としているため、 -220を左端としています。 - C :
向きを90度(右)に向けます。
x座標を2ずつ変えて右に動かします。
ただし画面の右端よりも右には進めなくするようにするために、 x座標が200よりも小さい場合のみ x座標を変えるようにします。
Playerのx座標は常にボールの x座標-10としているため、200を右端としています。 スペースキーが押されたら向きを90度(右)に向けます。
-
- 説明
左向き矢印キー、右向き矢印キーが押されたらcostume1と costume2をくり返し切り替え、歩いているように見せます。
- コードの詳細
コスチュームをcostume1にします。
スペースキーが押されるまで下記のAの処理をくり返します。
- A :
左向き矢印キーまたは右向き矢印キーが押されている場合、下記のBの処理をします。
左向き矢印キー、右向き矢印キーのどちらも押されていなかったらcostume1にします。 - B :
次のコスチュームにします。
切り替えが速くなりすぎないように、 コスチュームを切り替えたら0.1秒待ちます。 スペースキーが押されたら(ボールを投げたら) コスチュームをcostume1にします。
計測員
主な動き
- から着地
が送られてきたら、ボールが落ちた地点へ1秒間で移動し、
記録を言う。
移動中はコスチュームを切り替え、歩いているようにみせる。 - から 投げたが送られてきた時に、 投げた時の時速と 投げた角度がよい場合はGood!と言う。
- から投げた が送られてきた時に、踏切線を越えてしまっていたらファールと言う。
「Start」を受け取ったとき
-
- 説明
初期状態にします。
- コードの詳細
このスプライトの他のスクリプトを止めます。
x座標を210、 y座標を-145にします。
コスチュームをgiga-aにします。
前回のセリフを消すためにセリフなしを0秒言わせています。
投げたを受け取ったとき
-
- 説明
投げた時に白線を越えていたら「ファール!」と言います。
投げた時の時速と投げた角度がよかったら (98km/hより速くて39度~49度なら)「Good!」と言います。
- コードの詳細
まず0.5秒待ちます。
ファールが1ならコスチュームを> giga-dにして「ファール!」と言います。
ファールではなく、投げた時の時速が98km/hより速く且つ 投げた角度が39度~49度だったら「Good!」と1秒言います。
着地を受け取ったとき
-
- 説明
ボールが落ちた場所に移動し、記録を言います。
- コードの詳細
1秒でx座標を 落ちた場所に、 y座標を-145にします。
このスプライトの他のスクリプトを止めます。
x座標を210、 y座標を-145にします。
移動した後にコスチュームをgiga-bにします。
記録mと言います。
-
- 説明
歩いているように見せるために4つのコスチュームを0.2秒ごとに順番に切り替えています。
地球ボタン
このボタンが押されたらステージを地球にします。
主な動き
- クリックされたらコスチュームを選択
にして背景を地球にする。
重力加速度を9.807m/s²にする。月ボタンへ 地球を選択を送る。 - 月ボタンから地球を選択が送られてきたらコスチュームを 非選択にする。
がクリックされたとき
-
- 説明
右上に表示されるように座標を設定します。
コスチュームを 選択(選択されていることを示す)にします。
重力加速度を地球の重力加速度(9.806m/s²)にします。
速度調整係数を0.1にします。
「Start」を受け取ったとき
-
- 説明
右上に表示されるように座標を設定します。
基本的にはこの処理は必要ありませんが、 クリックした際に誤って位置をずらしてしまっても元の位置に戻るようにしています。
このスプライトがクリックされたとき
-
- 説明
コスチュームを選択 (選択されていることを示す)にします。
背景を地球にします。
重力加速度を地球の重力加速度(9.806m/s²)にします。
速度調整係数を0.1にします。 地球と月でどちらも0.1にしているため、 設定しなおす必要はないのですが、 違う値にした場合に備えて設定するようにしています。
地球を選択を送ります。
月を選択を受け取ったとき
-
- 説明
コスチュームを非選択 (選択されていないことを示す)にします。
月ボタン
主な動き
- クリックされたらコスチュームを選択にして
背景を月にする。
重力加速度を1.622m/s²にする。 地球ボタンへ月を選択を送る。 - 地球ボタンから月を選択が送られてきたらコスチュームを 非選択にする。
がクリックされたとき
-
- 説明
右上に表示されるように座標を設定します。
コスチュームを 非選択(選択されていないことを示す)にします。
「Start」を受け取ったとき
-
- 説明
右上に表示されるように座標を設定します。
基本的にはこの処理は必要ありませんが、 クリックした際に誤って位置をずらしてしまっても元の位置に戻るようにしています。
このスプライトがクリックされたとき
-
- 説明
コスチュームを選択(選択されていることを示す)にします。
背景を月にします。
重力加速度を月の重力加速度(1.622m/s²)にします。
速度調整係数を0.1にします(地球と月でどちらも0.1にしているため、
設定しなおす必要はないのですが、違う値にした場合に備えて設定するようにしています)。
月を選択を送ります。
地球を選択を受け取ったとき
-
- 説明
コスチュームを非選択(選択されていないことを示す)にします。
履歴表示ボタン
主な動き
- クリックされたら履歴の表示/非表示を切り替える。
がクリックされたとき
-
- 説明
右上に表示されるように座標を設定します。 履歴のすべてを削除して隠します。
履歴が表示されているを0にします。
「Start」を受け取ったとき
-
- 説明
右上に表示されるように座標を設定します。
履歴を隠します(削除はしません)。
履歴が表示されているを0にします。
このスプライトがクリックされたとき
-
- 説明
履歴が表示されていない(履歴が表示されている=0)なら 履歴を表示して 履歴が表示されているを1にします。
そうでない場合は履歴を隠して 履歴が表示されているを0にします。
踏切線
「Start」を受け取ったとき
-
- 説明
踏切線の座標を設定し、x座標を踏切線のX座標に保存しておきます。
ステージ
がクリックされたとき
-
- 説明
背景を地球にします。
「Start」を受け取ったとき
-
- 説明
すべてのスプライトで使う変数のいくつかを初期化します。
投げた角度は初期値を0度ではなく9度にしています。