ここではゲームループというものを紹介します。ゲームループはスクラッチプログラミングに限った話ではなくて、ゲームソフトを作るときに必要になってくるプログラムの基礎的な構造のことです。そしてゲームループと同じようなループ処理は、ゲーム以外のソフトウェアでも多くの場面で使われています。

コンピュータは私たちが何かの操作を行うとそれに反応して何らかの動きをしてくれます。また、機械をコントロールしているコンピュータはセンサーで危険を感知したりすると動作を止めたりアラームを鳴らしたりといった反応をしてくれます。

コンピュータは何かの仕事をしているときに、外の世界で起きた事を常に見張っていていなければならない事が多いです。これはプログラムが終了するまで続きます。

プログラムは何か同じ動作を繰り返すときに”ループ処理”という機能を使います。コンピュータが何かの仕事をするために、外の世界の変化を常に監視しようとするときにもこの”ループ処理”が使われます。

コンピュータは外の世界に変化がないかどうかをチェックする(確認する)動作を、ループ処理の中で繰り返し繰り返し行います。このループはプログラムを停止させるまでずっと続きます。

このようなループ処理があるために、コンピュータはいつ外の世界で変化が起きてもその瞬間に反応することができるのです。例えばゲームの場合はプレイヤーが何かキーを押した瞬間にゲームキャラクターが走ったりジャンプをしたりします。これはコンピュータがプログラム上でループ処理を行って常にキーが押されているかどうかを確認しているからできることなのです。このとき使用されるループのことをゲームループと言います。

実際にこのゲームループを使ってゲームのキャラクターを操作するプログラムを作ってみます。まず、ネコのプログラム領域に「ずっと」というブロックを配置します。「ずっと」ブロックはスクリプトタブの「制御」グループの中にあります。 

 

「ずっと」ブロックは中に入れたブロックをずっと繰り返し実行する、スクラッチが持つ基本的なループ処理の1つです。このループの中に右向き矢印キー(→)を押したときだけネコを右側へ移動させるプログラムを書いてみましょう。

スクラッチで何かのキーが押されたことを確認するブロックは、スクリプトタブの「調べる」グループの中にある「○○キーが押された」というブロックです。

 

このブロックは最初の状態では”スペース”キーが設定されています。ですので、これを”右向き矢印”キー(→)へと変更します。キー名の右端にある下向き三角マークを押すと確認できるキーの一覧が表示されますので、その中から”右向き矢印”を選択します。

 

続いて、右向き矢印キーが押されたときだけネコを移動させたいので、分岐処理のブロックを組み合わせます。スクリプトタブの「制御」グループの中にある「もし< >なら」のブロックを取り出します。

 

「もし< >なら」ブロックのような分岐処理を行うブロックには、分岐の条件を入れるための六角形の穴が空いています。この穴には同じく六角形の形をした”条件”を表すブロックをはめ込むことができます。

条件を表すブロックには主に「調べる」グループ内のブロックや、「演算」グループ内の等号不等号を表すブロックなどがあります。分岐をするかしないかを判断するための条件になる演算のブロックや、キーやマウスの状態を調べるブロックが六角形の形をしています。

今回は右向き矢印キー(→)が押されているか押されていないかを条件にして分岐処理を行いたいので、先ほど作成した「右向き矢印キーが押された」ブロックを「もし< >なら」ブロックの条件にはめ込みます。

スポンサーリンク

 

「もし< >なら」ブロックの中にキーが押されたときに行いたい処理を入れます。今回はネコを右側へ移動させたいので「動き」グループの中にある「x座標を○○ずつ変える」のブロックを「もし< >なら」ブロックの中に入れます。「x座標を○○ずつ変える」の○○の部分の数値はネコが一度に動く量を表しているので、数値が大きいとネコの移動スピードが上がります。ここでは適当な値として最初から設定されている10という数値を使います。

 

これで「もし右向き矢印キーが押されていたらネコを右側へ10だけ動かす」という処理が書けました。このブロック全体を「ずっと」というループ処理のブロックの中に入れます。

 

最後にプログラムの開始地点をループ処理の先頭に設定します。「イベント」グループの中の「(緑の旗)がクリックされたとき」のブロックを「ずっと」ブロックの頭に接続すると、スクラッチのスタートボタン(緑の旗のアイコン)を押すと、「ずっと」ブロックのループが回り始めます。「ずっと」ブロックはプログラムを停止させるまでずっとループし続けるので、終了させたいときにはスクラッチの赤丸ボタンを押して終了させてください。

 

以上でゲームループを使ったプログラムが完成しました。ただ、このままだとネコは右側へしか移動できないので、左向き矢印キー(←)が押されたときにはネコが左側へ移動する処理も追加してみたいと思います。右向き矢印キーのときと同じ要領で以下のようなブロックを作成します。先ほどと違う点は調べるキーが”左向き矢印”になっていることと、x座標の変化量が”-10”(マイナス10)になっていることです。x座標が-10(マイナス10)ずつ変化するということはネコの座標が10ずつ左側へ移動することを意味しています。(x座標は右側へ行くほどプラス、左側へ行くほどマイナスなので。)

 

上で作成した「もし<左向き矢印キーが押された>なら」ブロックを「ずっと」ブロックの中に入れます。

入れる場所に注意してください。「もし<右向き矢印キーが押された>なら」ブロックの下に「もし<左向き矢印キーが押された>なら」ブロックが連なる形にします。

 

これで右向き矢印キーを押すとネコが右へ移動し、左向き矢印キーを押すとネコが左へ移動するプログラムができました。

今回のプログラムで使用した、処理全体を囲っている「ずっと」ループのようなもののことをゲームループと言います。

ゲームではプレイヤーが行う操作などをゲームループの中で検知して、何らかの変化が検知されたときにはそれぞれ必要な処理を実行するためにプログラムが分岐していく、といった動きをします。また、プレイヤーが何も操作をしていないときでも敵キャラクターなどが動いている場合があり、このような処理もゲームループの中で行います。

このようなループはゲーム以外でも使用されています。機械制御の分野ではセンサーの値を常に監視しながら機械に適切な指示が出せるように、プログラムの中でループ処理が行われています。また、スマートフォンやパソコン、電卓なども人間が画面をタッチしたりキーボードやマウスを操作したりすることを検知するために、プログラムがループを続けています。

人間の操作に対して何らかの反応をし続けるようなプログラムを作るときには、このようなループの構造を基本にしてプログラムの構造を考えていくと良いでしょう。

 

スクラッチ研究室に戻る

スポンサーリンク