本ページのサンプルファイル集

下記のどちらかからからダウンロードできます

Windowsの人は必ずzipファイルを展開すること!! zipファイルの中では作業できません.

 

 

 

恐竜ゲーム風のミニゲーム

恐竜ゲーム (目標物の元の例)

Chromeにはインターネットにつながらない時などに遊べる簡単なゲームが用意されています.

offline

実際に, Chromeで下記

をURL部分に入力し, Enter or Returnを押してみてください. すると, 下図のような画面が出てきます.

dino

ここで, 実際にSpaceキーを押すと, 恐竜が横に進んでいき, サボテン等をジャンプして乗り越えるゲームが始まります.

今回は, これに似た簡単なゲームを作ることを目標にやっていきたいと思います.

 

目標物

今回の講義で作成した際の目標物は, こちら です.

上記の恐竜ゲームと比べるとだいぶ簡素にはなっていますが, ひとまずこれを目標にやっていきます.

fish-shark

 

画像素材のダウンロード元

 

htmlとjsの準備

参考

まずは, htmlとjsの用意をします.

index.html

  • canvasタグの中にゲーム画面を描いていきます

  • canvasの横幅600px, 高さ400pxで固定しています. 簡単のため, レスポンシブデザインとして画面サイズにフィットさせるようにはしていません. 描画領域がわかりやすいように, style="border: solid 1px;" で枠線を入れています

  • 後にJavaScript内で指定するために id="gameCanvas" でidを追加しています

  • 次節以降ではこのindex.html を変更せずにやっていきます

app.js

 

 

ゲームの初期処理とループ処理

本節以降ではindex.html を変更しないため, app.jsの内容のみを記載します

app.js

  • setup という関数を用意し, 実行していることで, ここがゲームの起点 (初期処理) となります.

  • index.html内のgameCanvasというidを持ったcanvasタグを取得し, canvasという名前の変数に入れています.

    • 今回は2次元の横スクロールゲームなので, canvasの中の表示形式を2dにします (3D表示のゲーム等を作りたい場合はwebglにします)

    • setIntervalという関数を使って, loopという関数を1000ミリ秒ごとに実行する設定をします.

    • 実際には, 60FPS (60 frames per second. 1秒に60回描画) で実施することが多いため, 1000 [ms]/6016 [ms] として, setInterval("loop()", 16); 程度にすることが多いです.

 

 

ゲームの状態と条件分岐 (if, else)

ゲームを実行している時と, ゲームオーバーの時とで場合分けをします.

app.js

  • という形で, 条件分岐を実施します.

  • ゲーム中 (true), ゲームオーバー後 (false) を司る変数として isPlaying を用意しました

 

 

背景 (水面の線)

プレイヤーが動く高さのベースとなる水面の線を描きます

canvas

app.js

 

 

プレイヤー画像の表示

プレイヤーの画像 (赤い魚. fish.png) を表示します.

app.js

    • プレイヤー (魚) の変数の宣言

    • fish.pngという画像を読み込む

    • 画像の表示

  • その他

      • 60fps (16ミリ秒) に変更

      • コンソールがこのログで埋まってしまうのでコメントアウト

      • コンソールがこのログで埋まってしまうのでコメントアウト

 

 

キー入力

参考

ジャンプの準備としてキー入力ができるようにします

app.js

    • keydownという関数を作成し, キーボードが入力された場合の処理を書けるようにする

    • e.codeで実際に入力されたキーを取得できる

 

 

プレイヤーの更新・ジャンプ

スペースキーが入力されたらジャンプするようにします.

ジャンプは, 物理の基本的な式

=×F=m×a

から, 重力下での物体の加速度, 速度, 位置の関係は

×=×   [m/s2]= [m/s2]    [m/s]= [m/s2]× [s] [m]= [m/s]× [s]

のように決まります.

ball

これを使って, 経過時間を1とした場合の物体の速度, 位置を更新してみましょう.

app.js

    • 毎フレームの背景を白にすることで, アニメ的な表現ができるようになる

    • spaceキーを押したときにプレイヤーの速度 (上向き) と加速度 (下向き) を与える

    • プレイヤーの速度, 位置を更新

    • プレイヤーがジャンプで着地したら位置を固定して, 速度と加速度を止める

 

 

敵画像の表示

敵の画像 (サメ. shark.png) を表示します.

app.js

    • サメ用の変数の準備

    • サメ画像の読み込み

    • サメ画像の表示

 

 

敵をランダムな速さで動かす

サメを右から左に動かします

app.js

    • サメの初期速度を定義

    • サメの速度によってサメの位置を更新

    • サメが左端に到達したら, 右端に移動するようにする

    • その際にサメの速さを-10から-5までの値になるように指定

      • Math.random() は0から1までのランダムな値を出す関数

      • Math.random() * 5 で0から5までのランダムな値を出す

      • Math.random() * 5 + 5 で5から10までのランダムな値を出す

      • - (Math.random() * 5 + 5) で-10から-5までのランダムな値を出す

 

 

スコアの表示

経過時間をスコアとして表示するようにします

app.js

    • ゲームの開始時刻と現時刻を入れる変数を用意

    • ゲームの開始時刻を取得

    • 現時刻を取得

    • スコアを表示

      • ゲームの開始時刻から現時刻までの経過時間を計算し, scoreとする

      • スコアの文字列の横幅を取得

      • スコアの文字列の横幅の分だけ位置を調整しつつ, 画面右上に表示

 

 

衝突判定

プレイヤーと敵がぶつかる (衝突する) ことを判定し, ぶつかってしまったらゲームオーバーとします.

衝突判定は

  • 「プレイヤーと敵との距離」が「プレイヤーの半径と敵の半径の和」よりも小さくなってしまった場合

としてみます.

collision

「プレイヤーと敵との距離」を求めるには, 直角三角形に対する三平方の定理を使って,

=2+2 =2+2 =()2+()2

とします.

 

app.js

 

 

リスタート

ゲームオーバーになったら, Rキーを押してリスタートするようにします

app.js

    • ゲームオーバーになったら「Rを押すと再スタートできるよ」というメッセージを表示します

    • 「ゲームオーバー後 (isPlaying=false) 」 且つ 「キーボードでRを押した」 場合に, 今の画面を再読み込み (reload) します

 

 

プレイヤーの連続ジャンプ禁止

参考

プレイヤーが水面に着いている場合にのみジャンプできるようにします.

app.js

    • ジャンプの箇所にplayerY == gndYという条件を追加することで, プレイヤーが地面 (水面) に着いている場合のみジャンプできるようになります.

 

 

波と繰り返し (for)

水面の波を表現します

app.js

    • という文法で, 繰返しの処理ができます.

      • 繰返しの変数名はi

      • i は0以上600未満で, 1ずつ増える (i++) ように繰返していく

      • Math.sin()は三角関数の一種のsin関数のこと