20:イベント処理とスコープ

◆PROCESSINGで始めるゲーム作りとコンピュータ

Desktop20:イベント処理とスコープ

今日の話題

 

25:イベントドリブン

前回PROCESSINGでは、setup()関数で初期処理を行い、draw()関数でゲームループを実現していると説明しました。

ゲームループには描画処理、入力受付処理、計算処理がありましたよね?。

描画処理とは、画面に絵を描く処理の事です。計算処理とは、いろいろな計算(キャラクターの座標や、発射した弾の位置)を更新する処理の事です。

ゲームループ
(画像URL:illust-AC 様:任々堂工房 さん、acworks さん)

では入力受付処理とは何でしょうか?。

入力受付処理とは、マウスやキーボードなどの入力(人間の操作)を受け付けて、どんな操作が行われたのか(どんなキーが押されたのかなど)を判定する処理の事です。

コンピュータはとても高速に動作します。ですからコンピュータの動作速度にくらべると、人間の反応速度(操作する速度)は非常にゆっくりとしたものになります。

ところで、人間の反応速度がどの程度の速度なのかご存知でしょうか?。

いつ来るかわからない1つの刺激に対して待ち構えている場合、反応速度は普通の人で0.2秒程度だと言われています。

fpsゲームと呼ばれる反応速度を競うようなタイプのゲームで、上位プレーヤーと呼ばれる人でも0.15秒を切るのは難しいという記事もあります。
(参考:lolの最新メタなどを考察するブログ 様)

一方でPROCESSINGは、ゲームループを1/60秒(0.016秒)間隔で回すことが可能です。PCの性能とプログラミング次第では、もっと早く回す事もできます。

draw間隔
(画像URL:illust-AC 様:ほんぽさん)

高速に動作するゲームループ内で、いつ反応してくれるかわからない(のんびりした)人間の入力を待ち合わせるのは、コンピュータにしてみれば無駄が多い事になります。

そこで、人間がキーボードを押したりマウスを操作したタイミングで反応する処理を仕掛け、いつ操作されても良いように待ち構える方式が考案されました。

いうなれば罠をしかけるわけですね。いつ獲物(人間)が通過(操作)してもよいように、獲物が通過した際に確実に反応する罠(操作を検知する仕組み)を作って、待ち構えるのです。

イベントハンドラ
(画像URL:GAHAG | 著作権フリー写真・イラスト素材集 様:ivakさん、illust-AC 様:ちゃみ さん)

コンピュータでは、人間がキーボードを押した、マウスを操作した、ファイルを読み終えた、など不定期に発生する事象を「イベント」と呼びます。

そして、そのようなイベントが発生した瞬間を捕まえて処理を行うプログラミング方式を「イベントドリブン方式(イベント駆動型)」と呼びます。

こうする事で、イベント(人間の操作)が発生していない間は描画処理や計算処理に専念し、イベントが発生した(操作が行われた)時は、操作を捕まえて処理をすれば良い事になり、効率が良くなります。

そしてイベントが発生した際に、そのイベントをつかまえて動作する部分(関数)を「イベントハンドラ」とか「イベントリスナー」と呼びます。イベント処理関数と呼ぶこともあります。

PROCESSINGも、イベントドリブン方式を採用したプログラミング言語です。

PROCESSINGには、マウスの操作(ボタンが押された、離された、動いたなど)や、キーボード操作を検知して動作する沢山のイベントハンドラが用意されています。

例えばマウスクリックイベントを処理するプログラムは、以下のようになります。

void  mouseClicked() {  …  と書かれた部分が、マウスクリックに対応するイベントハンドラです。

実行結果ウィンドウ上でマウスをクリックすると、その瞬間に mouseClicked() 関数が呼び出されて動作します。

本例では、コンソール領域に「マウスがクリックされました」という文字と、クリックされた座標を表示します。

イベントハンドラサンプル
イベントハンドラは、なにもキーボードやマウスの操作だけではありません。

例えば初期処理が開始された際に自動的に呼び出される初期処理関数(setup())や、実行結果ウィンドウが表示可能になった際に呼び出される描画処理関数(draw())も、ある意味イベントハンドラの一種だと言えるでしょう。

様々なベントハンドラについては、その都度説明を行いますので心配いりません。今はそんな仕組みがあるのだと覚えておいて下さい。

 

26:スコープ

プログラムを作るにあたって、もう1つ覚えておいてほしいことがあります。それは変数のスコープについてです。スコップじゃありませんよ(笑)。スコープです。

変数のスコープとは、変数が利用できる範囲の事です。

いままで幾つかのプログラムを例示してきましたが、PROCESSINGをBASICモードで使うだけなら、変数のスコープを意識することはあまりありません。

しかしContinuousモードを利用して、関数やオブジェクトを使った構造化プログラミングを行うと、避けては通れない知識となります。

変数のスコープを理解するために、以下の様な例を挙げてみましょう。

学校の教室には、沢山の生徒がいますよね。例えば、ある教室にケンジくんと優子さんがいたとして、ケンジくんと優子さんには、それぞれの持ち物があります。ケンジくんの靴、優子さんのノートなどです。

いくら優子さんが可愛いからといって、ケンジくんが勝手に優子さんの持ち物を使ったら怒られます(笑)。その逆もしかりです。

その一方で、教室には生徒全員が使うことができる道具もあります。黒板やチョークなどです。

変数のスコープ(画像URL:illust-AC 様:poko pocket さん、Tossan さん)

このように現実世界でも、誰の持ち物なのか(誰が使えるのか)が決まっているように、プログラムの世界でも変数や定数を誰が(どの関数が)使えるのかが決っているのです。

これを変数のスコープと呼びます。

スコープでは、ある関数の内部でしか使えない変数を「ローカル変数」とか「局所変数」と呼びます。先の例で言えば、ケンジくんの靴や優子さんのノートみたいなものです。

ケンジくんの靴はケンジくんしか履けなかったように、ある関数の中に定義されたローカル変数は、その関数の内部でしか使えません。

ローカル変数(画像URL:illust-AC 様:poko pocket さん)

上記で整数型の Str という変数は、attack() 関数の中でしか使用できないローカル変数です。

その一方で、プログラム全体で使える変数を「グローバル変数」とか「大域変数」といいます。先の例なら黒板やチョークみたいなものですね。

黒板やチュークを、その教室にいる生徒なら誰でも使うことが出来るように、グローバル変数は、そのプログラムの中にある関数なら、どこからでも利用できます。

グローバル変数(画像URL:illust-AC 様:poko pocket さん、Tossan さん)

上記はグローバル変数の例です。プログラムの先頭に書かれた整数型の g_Hp がグローバル変数です。

グローバル変数なので、setup()関数、draw()関数、attack()関数のどこからでも値の設定や変更、表示が行えているのがわかると思います。

これだけを見るとグローバル変数は大変便利に思えます。便利であるがゆえにプログラムの初心者がよくやる間違いなのですが、全ての変数をグローバル変数にしてはいけません。

グローバル変数はそのプログラムの中にある全ての関数から変更できるので、予期しないタイミングで値が書き換わる事があるからです。

いくら教室の黒板に字が書けるからといって、個人的なメモまで書いておくと、予期しないタイミングで消されてしまうかもしれませんよね(笑)。だから「自分だけが見えれば良い」情報(変数)は、ローカル変数にするのが一般的なのです。

普通、定数はプログラム全体で利用する事が多いためグローバルにします。逆に変数は出来るだけローカルにし、やむを得ない場合だけグローバルを用います。

PROCESSINGでは、PROCESSINGが自動的に用意してくれているグローバル変数が幾つかあります。これらの変数は、私達がプログラミングしなくても利用する事が可能です。

例えば、PROCESSINGが用意しているグローバル変数には、以下の様なものがあります。
マウスのカーソル位置         :mouseX、mouseY
操作されたマウスボタン      :mouseButton
押されたキー情報              :key、keyCode

これらについても、その都度説明をしていきたいと思いますので、今はそんなものかと覚えておいて下さい。

 

Forest今日の言葉

・イベント

お祭りやパーティの事ではありません(笑)。コンピュータでいうイベントは、キーボードが押された、マウスが動いた、ファイルを読み終えたなど、「何かが起こった」事を示すものです。

・イベントドリブン方式

イベントが発生した瞬間を捕らえて動作する処理方式。特に入力デバイスや通信など、いつ処理が行われるか(あるいは完了するか)不明なものを扱う際に用いられます。

・イベントハンドラ

イベントが発生した際に、それに応じた処理を行う関数や処理部分を指します。コンパや飲み会になると賑やかになる「お祭り男」は、ある意味リアル社会でのイベントハンドラかもしれません(笑)。

・スコープ

変数や定数が使える範囲の事です。

・ローカル変数

ある関数内部でしか使えない変数を、こう呼びます。関数の私有物ですね。

・グローバル変数

プログラム全体に渡って使える変数を、こう呼びます。プログラムの公共物です。

 

scroll今日の文法

・マウスクリック イベントハンドラ

void  mouseClicked() { … } ; と定義します。マウスがクリックされた際に動作します。

 

 今日のまとめ

  • イベントを捕まえるプログラミング方式をイベントドリブンと言う
  • イベントを捕まえて処理をする関数をイベントハンドラと言う
  • 変数や定数には、利用できる範囲がある

21:Eclipseを手に入れよう へ進む
19:PROCESSINGと関数 に戻る
目次へ戻る


本ページで利用している特に参照元記載のないアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。