スクラッチで斜めに飛びたいとか、複雑なジャンプを作りたければ、ジャンプを上に上がると下に下がるで分けて作らないといけません。
複雑なものにするほど、関数に分けて作らないとコードが長くなりすぎてよくわからないことになってしまいます。
今回は下に下がる「重力」という関数を作ってみます。
重力は下に落ちていく動作なので、それはy座標を-10ずつ変えるでいいですね。
‐130が画面の一番下のy座標なので、それより猫が落ちてほしくないので、y座標<-130なったらyz座標を-130にしてそれより下に落ちないようにします。
注意点は関数の中に、ずっとを入れないようにしましょう。
ずっとの繰りかえす処理は、イベントハンドラーが押されたところにいれるようにしないと、重力が終わることなく続いてしまいます。
これは他の関数を作るときにも気をつけましょう。
では、重力と上に上がる動作を足して、ジャンプをしてみます。
単純に2つを組み合わせてみましょう。
こうすると、y座標が10上がっては、10下がるを繰り返すので、ねこが動かないでとまってしまいます。
ここで、高さという変数を作ります。
高さが0になるまでは、あがるという動作を繰り返し、高さが0より下になったら重力しかきかないという状況にすればいい訳です。
ここでの注意点は、ずっとの下にまず重力を持ってくることです。
実際に重力は常にかかっているので、これを最初に書いてその下に上にあがる動作を書くと10下がって、10上がるので結局0の状態で猫は動かない状況ができます。
上向き矢印が押されたときに上にあがる動作をしたいので、上にあがるブロックをもし上向き矢印が押されたらの下に置きたいところですが、そうすると重力がきかない状態になり猫が降りてきません。
なので、もしの中には、高さに関する条件だけつけておいて、高さが0になるまでは、上にあがるをいう動作が続くようにしています。
前回のシンプルなジャンプを少し改良して、斜めにジャンプできるようにします。
前回は、重力と上がるというブロックを組み合わせて、上に上がるシンプルなシャンプを作りました。
これに左に進むと、右に進むを追加します。
ブロック定義から、左に進む、右に進む関数を下の図のように作ります。
ちなみに、左に進んだ時は、コスチュームを左向きの猫にしました。
作り方は、スプライト1の猫のコスチュームボタンを押し、コスチューム1の複製を作ります。
そうするとコスチューム3にコスチューム1と同じ猫が作られます。
コスチューム3で下の図の赤枠で囲った部分を押すと、左右反転した猫ができます。
では、左に進むと右に進むブロックをシンプルなジャンプに追加しましょう。
左向き矢印が押されたら、左に進む、右向き矢印が押されたら右に進むとしました。
キーが押される条件は、ずっとの中に入れましょう。
前回で斜めジャンプはできました。
ゲームでは2段ジャンプを禁止しているゲームが多いので、2段ジャンプできないようにするジャンプも考えてみます。
最初、下の図のように上向き矢印が押されたときに高さが0のときならという条件を追加してみたのですが、これだと2段ジャンプになってしまいました。
理由は、高さはジャンプしているうちに減っていって、頂点に達したときに高さ=0になってしまうので、ここで上向き矢印を押したらさらにジャンプできてしまいます。
高さ=0のときは、頂点に達したときと地面についているときの2通りあるわけです。
そこで、地面についてるときとついていないときを区別する変数を作ることにしました。
ジャンプ中という変数を作ります。
ジャンプしているときは、ジャンプ中=1、ジャンプしていないときは、ジャンプ中=0
地面についているときは、ねこのy座標が-130のときです。
ちょうど重力の中にy=-130にするがあるので、ここにジャンプ中=0を入れて、ジャンプ中=0をy=-130と定義します。
そして、もとのコードを下記のように書き換えれば、2段ジャンプが禁止となります。
前回は高さを10にしましたが、今回は高さを20に変更しました。
残りの赤いブロックの関数のコードは、前回の斜めジャンプを参照ください。
前回のジャンプに障害物の上に載れるようにコードを加えます。
マリオ風のゲームにするには必須ですね!
最初に下のように考えてみました。
Amon(人)に触れたときに重力と上がるが一緒に並べればとどまるかと思ったのです。
が、これはAmonをすり抜けてうまくいきませんでした。
ジャンプして降りるときに障害物にふれることになるので、重力の中に条件を入れてみました。
ジャンプして下がるときは、必ず高さ=0になります。
なので、ここは気にせずこの中にさらに条件を入れます。
こうすれば下がっているときに下に10ずつさがっていAmonに触れたら上に10あがるので、±0になってとどまる訳です。
後のコードは同じです。
猫がボールに触れたら点数が入るというシンプルなコードです。
まず、猫の動きをスプライト1で作ってみます。
まずは、猫が上、下、右、左に動く関数を下のように作ります。
ずっとの中に何のキーが押されたらどう動くかを配置します。
これで猫を矢印キーを押して動かせるようになりました。
次にスプライト2にボールの絵を挿入して作ります。
まず点数という変数を作ります。
そして、ボールをいろんな角度から発進してボールが端についたら跳ね返るようにしてランダムに動くようにします。
ボールが猫に当たったら、点数が入るように下のように作ってみました。
ところが、上のように作って動かすと、猫に触れている間、ずっと点数が入るという現象が置きました。
なので、1度猫にふれると、点数が1点入って、少しの間点数が入らない仕組みが必要だと考えました。
これを、無点数時間という関数にしてみます。
まずstatusという変数を作ります。
無点数時間(点数が入らない時間)とそうでない時間(点数が入る時間)の区別をつけるための変数です。
無点数時間のときは、statusを1にして、そうでないときはstatusを0にします。
時間は、いろいろと試して0.3秒がぐらいがよさそうだったのでこの数字で設定していますが、ここは各自で試してから時間を変えてください。
後は、ボールの動きに無点数時間を設置してみます。
猫に触れたら無点数時間でstatusを1に変え、0.3秒待つ。その後、statusを0に変えてまたボールがランダムに動くようにしています。
最終的に下のようなコードにしてみました。
ボールの動きを変えただけなのですが、猫のあたり判定が弱くなりました。
この辺はまた他を試してわかったことを追記していきたいと思います。