AOYAMA Koji's プログラミングブログ - プログラミングを楽しく体験

【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】プログラミング初心者向け・入門編・基礎編初中級者向けプログラミング解説プログラマー向け実装解説[初心者向けゲーム開発入門]

2026/05/25
【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門]

 40年以上のゲームプログラミング経験をマンガで可視化。 今回は「イベント駆動」。 プレイヤー操作など、何かが起きたら動く処理です。 事前に設定した事象(イベント)が発生したことを受けて駆動します。
【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門]

プログラミングブログ記事一覧


[PR]

【マンガで感じる】イベント駆動 ~起きたら動く~


【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 盤面 XO. .X. XOO 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] クリスタル「O(私)の手番ですね」「では…」 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 社長「ちょーっと待ったー」 クリスタル驚きの表情 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 吸盤ダーツが箱に置かれている 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 社長「ここからはダーツを使いましょう!」吸盤ダーツ持っている クリスタル「良いですね」「承知しました!」会釈 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] イベント駆動 ~起きたら動く~ 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] クリスタル「えーと…」きょろきょろ 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] メカ・イベントトリガー布団で寝ている (クリスタル)「メカ・イベントトリガー!」「お願い」 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] メカ・イベントトリガーうっすら目を開ける 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 盤面 インデックス XO. 012 .X. 345 XOO 678 (クリスタル)「イベントトリガーは」「ダーツが盤面に当たったら起きて」 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] メカ・イフ (クリスタル)「ダーツのマス位置インデックスの番号を」「イフに伝えて」 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] (クリスタル)「オッケー?」 壁の盤面 XO. .X. XOO メカ・イベントトリガーサムズアップ 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 壁の盤面 XO. .X. XOO メカ・イベントトリガーが隣で座って寝ている (クリスタル)「じゃあ始めるよー」 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] クリスタル吸盤ダーツ投げる構えプロ風 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] クリスタル吸盤ダーツ投射プロ風 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 壁の盤面 XO. .X. XOO メカ・イベントトリガーが隣で座って寝ている 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 壁の盤面(Dは吸盤ダーツの矢) XO. DX. XOO メカ・イベントトリガーが盤面の隣で座って寝ている 盤面のマス位置インデックス3に投射されて吸盤ダーツがひっつく風エフェクト 擬音「バンッ」 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 壁の盤面(Dは吸盤ダーツの矢) XO. DX. XOO 盤面の矢と触手を繋げるフレーム メカ・イベントトリガーの触手がピンクに光る(以下動いている時はピンク) 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 壁の盤面(Dは吸盤ダーツの矢) XO. DX. XOO メカ・イベントトリガーが飛び起きる 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 壁の盤面(Dは吸盤ダーツの矢) うっすらとインデックス XO. 012 DX. 345 XOO 678 メカ・イベントトリガー後ろ向き確認 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 壁の盤面(Dは吸盤ダーツの矢) XO. DX. XOO インデックス強調 ... 3.. ... メカ・イベントトリガー「3」 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] メカ・イベントトリガーが走る 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] メカ・イベントトリガー「3」 メカ・イフOKポーズ 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] メカ・イフ走る 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 省略コマ 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 盤面 XO. OX. XOO インデックス3に赤Oが加わった盤面&強調エフェクト 【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 社長「楽しい~♪」
次のエピソードへ
【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] ゲームロジック

OXゲーム開発編 第7話:エピソード「イベント駆動」


 本エピソード「イベント駆動」は、OXゲーム開発編 第7話です。
 OXゲーム開発編は、OXゲーム(三目並べ・マルバツ)の開発を通じて、ゲームプログラミングの基礎の基礎を解説しています。
 OXゲーム開発編の各エピソードは、それまでのエピソードのマンガ(と解説)を前提としていますので、 もし途中から読み始めた方は、ぜひ最初のエピソード「プログラム」から読み進めてください。

「イベント駆動」のソースコード例


JavaScript

// キャンバスがクリックされたら O か X を描く
oCanvas.addEventListener( 'click' , drawOX );

OXゲーム(三目並べ・マルバツ):クリックで動く「イベント駆動」実装検証



[PR]

「イベント駆動」とは:起きたら動く


 「イベント駆動」の本質「起きたら動く」です。
 何らかの設定した事象が「起きたら」、プログラムが「動く」。 専門用語を用いると、イベント発火時にキックされて駆動するプログラムです。
 マンガでは、寝ている状態から起きていますが、 技術用語のスリープ状態とは別ですので、ご注意ください。

ソースコードの仕組み


 今回のプログラムを解説します。

駆動するイベントと関数を設定する

// キャンバスがクリックされたら O か X を描く
oCanvas.addEventListener( 'click' , drawOX );
 JavaScriptの addEventListener は、「エレメントオブジェクト.addEventListener( イベント名 , 関数 )」の形式です。 その「エレメント」に対して、指定の「イベント」が発生したら「関数」を呼びます。
 つまりここでは「キャンバスがクリックされたら drawOX を呼び出す」という設定をするプログラムです。

リスナーとコールバック


 このように、ある処理に関数を渡して、処理が完了したときなど特定のタイミングでその関数を呼び返してもらう場合に、その渡す関数を「コールバック関数」と呼びます。
 その中でも特に、イベント発火時にキックされる関数のことを「リスナー」と呼びます。

「実装検証」で体験しよう


 前記「実装検証」セクションにて、キャンバスをクリックしてみてください。
 OX が描かれます。 もう、これで十分遊べますよね!
 でも、これだけでは足りないことがあります。 その理由は、ぜひ、ご自身で触って確認してみてください。

ゲームプログラミングにおける「イベント駆動」


 ゲームプログラミングにおいて、イベント駆動は、特にゲームプレイに関する処理に使われます。

入力に応じた処理


 ゲームは、プレイヤーの操作に応じて変化するのが大きな特徴のひとつです。
 ゲームパッド(ゲームコントローラー)や、マウスおよびキーボードなどの入力デバイスに対するプレイヤー操作に応じて、 ゲームの進行が変化します。
 このとき、イベント駆動をうまく利用することで、より可読性の高い(わかりやすい)ゲームプログラミングが可能です。

「イベント駆動」が用いられるケース


 マンガの例では、メカ・イベントトリガーが、ダーツにより場所が示されたのを受けて起動し、最終的に O を描画しました。 実装検証のプログラムは、キャンバスがクリックされたら、その場所に OX を描画します。 これらはイベント駆動です。
 また、メニューのこのアイテムが選択された、村人のこの人が話しかけられた、など、プレイヤーの操作に起因する処理などにも、イベント駆動型のプログラミングが用いられます。
 さらに、扉が開くマップチェンジするなどの、操作と直接は関係のないイベントも活用することで、よりクオリティーの高いゲームプログラミングが可能です。
 そのため、ゲームプレイに関するプログラミングには、「イベント駆動」がよく用いられます。

「ポーリング」が用いられるケース


 「イベント駆動」に対する言葉は「ポーリング」です。
 ポーリングは、イベントが発生したかを定期的に確認して、発生していれば処理します。
 つまり、「イベントが発生しているかを確認する」という処理を定期的に行う必要があります。 そのためポーリングは無駄のあるプログラミングに感じるかもしれません。 しかしイベント駆動と異なり、処理時間が安定するメリットがあります。
 より具体的に説明します。
 ビデオゲームは、\(\frac{1}{60}\)秒など、一定時間以内に基本的な処理を完結する必要があります。
 イベント駆動の場合、発火タイミングを制御できませんので、短時間に多くのイベントが発生すると処理時間がかかり、処理落ちに繋がる可能性があります。 ポーリングであれば、プログラマーが割り当てる処理時間を決めてプログラミングできますので、安定させられます。
 処理落ちすると、画面がカクカクする、操作がしづらいなどの問題が出ますので、処理時間の安定はとても重要です。

実務的なアプローチ:ハイブリッド設計


 これらの要件により、実務的には工夫が必要です。 結論としてはハイブリッドな設計にすべきです。
 例えば、連続的に扱うことが多い情報、例えば「ゲームパッドの入力情報」は、毎フレームのポーリングで読んでおきます。 そして非連続的なイベント、例えば「村人に話しかけた」などは、イベント駆動で処理します。
 このように、双方の良いところを上手に活用すべきです。
 なお、なぜ「\(\frac{1}{60}\)秒」なのか、および「フレーム」に関しては、後のエピソードで詳しく解説予定です。
 また、厳密には入力装置の情報は割り込みというイベント駆動で動いている部分があります。 ここはOSやハードウェアレベルの深い話になりますので、さらに後のエピソードで解説予定です。

【参考】クリックイベント発火時にインデックスを求めるプログラム


 実際にクリックイベントが発火した時にどのように処理するかを、参考として記載します。 ここでは、 drawOX の中から呼ばれる関数 getIndexByEvent を解説します。

キャンバスがクリックされた時にインデックスを求める

//**********************************************************************
// キャンバスがクリックされた時にインデックスを求める
//   引数:
//     e: イベントオブジェクト
//**********************************************************************
function getIndexByEvent( e ) {
    // キャンバス内の相対座標を 0,1,2 で得る
    let iX = Math.floor( e.offsetX / 100 );
    let iY = Math.floor( e.offsetY / 100 );
    // インデックスを計算する
    let iIndex = iY * 3 + iX;
    // 値を返す
    return iIndex;
}


インデックスを取得する関数 getIndexByEventを定義

function getIndexByEvent( e ) {
 まずは、関数 getIndexByEvent を定義します。

引数 e : イベントオブジェクト

 引数 e はイベントオブジェクトです。 ここでは、キャンバスがクリックされた時の情報が入っています。


クリックされた座標を変換する

// キャンバス内の相対座標を 0,1,2 で得る
let iX = Math.floor( e.offsetX / 100 );
let iY = Math.floor( e.offsetY / 100 );
 この2行で、クリックされた座標を、横および縦のマスの位置、0から2 に変換します。
 クリック時には、イベントオブジェクトのプロパティ offsetX および offsetY に、クリックしたキャンバス内の座標が保持されています。
 座標についてはエピソード「プログラミング」で解説していますが、1マス100ピクセルの設計です。 つまりこれを 100 で割って、小数点以下を切り捨てることで、マスの縦および横の位置を 0,1,2 で取得できます。
 これが、イベントを受けて処理するプログラムの、心臓部です。


// インデックスを計算する
let iIndex = iY * 3 + iX;
// 値を返す
return iIndex;
 縦横のマスの位置を、インデックスの番号に変換して、値を返します。
 エピソード「関数」で解説した変換を、逆にしたものです。
[PR]

マンガで感じる!本当の基礎から学ぶゲームプログラミングとは


 「マンガで感じる!本当の基礎から学ぶゲームプログラミング」シリーズでは、 主に、ゲーム開発を題材として、プログラミング時に筆者が脳内でイメージするコンピューター内部動作や本質を、マンガにてお伝えします。

プログラミングの本質をマンガで理解


 AI時代のプログラミングは、本質理解が重要です。 本質を理解していれば、あとはAIに任せて、自身を持って完成したプログラムに責任が持てるでしょう。
 そのため本シリーズでは、コーディングの実例や詳細よりも、「本質をイメージとして感じられること」を最優先としています。 まずマンガで、情報をできる限り絞り、プログラミングの仕組みやコンピューターの内部動作を、物理的に可視化してお届けします。
 そして文章の解説で徹底的に深堀りします。

登場人物紹介

【マンガで感じる】イベント駆動 ~起きたら動く~ 操作等に応じた処理【本当の基礎から学ぶゲームプログラミング】[初心者向けゲーム開発入門] 登場人物 社長 クリスタル メカたち  マンガで感じる!本当の基礎から学ぶゲームプログラミングシリーズには、主に社長、クリスタル、およびメカたちが登場します。 ※実在の人物とは関係ありません

社長

 本シリーズの偉い人です。
 マンガでは、指示すなわち「要件定義」を行います。

クリスタル

 社長の指示を、メカを活用して解決します。
 名前は、コンピューター内部で指揮者の役割を果たす「水晶発振器」に由来します。

メカたち

 用途に応じて多数存在し、果たす役割がそれぞれ与えられています。
 クリスタルの指示に従い、ある時はプログラムの変数や関数のように、ある時は電子回路の素子のように振る舞います。

「マンガで感じる!本当の基礎から学ぶゲームプログラミング」にかける想い


 筆者が本シリーズにかける想いや、 より詳しいコンセプトは「マンガで感じる!本当の基礎から学ぶゲームプログラミング」にて語っています。 そちらもぜひご覧ください。

AIを専属の家庭教師にしてイベント駆動を学ぼう


 本エピソードでは、プレイヤーの操作への応答などに利用する「イベント駆動」について解説しました。
 マンガを読んで興味が湧いた、解説のこのキーワードが気になった、などあれば、AIを専属の家庭教師に見立てて対話してみましょう。 各人の理解度に応じた質疑応答ができて、理解が深まりますので強くオススメします。
 本エピソードが、イベント駆動およびゲームプログラミングの本質理解に少しでもお役に立てれば幸いです。

補足

  • 本記事に記載のプログラムソースコードは、悪意のない範囲で自由に使用・改変していただいて問題ありません。ただし、ご自身の判断と責任でお願いします。
  • 記事内容の検討および検証・添削に生成AIの Anthropic Claude と Google Gemini を利用しております。
  • 記事内の画像の作成に生成AIの Google Gemini を利用しております。
  • 数式表現にMathJaxを使用しております。
  • ※各社の登録商標または商標について「®」「™」等の表記はしておりません。



カテゴリー:マンガで感じる!本当の基礎から学ぶゲームプログラミング,OXゲーム開発編
[PR]