Examples」ページで公開されている「Jumper」ゲームサンプルを見ていきます。Bernie」に出てきたバーニーが足場から足場へジャンプして飛び移ります。次のリンクをクリックすると、実際の動作が確認できます。音楽が鳴るので注意してください。左から右に移動する足場(プラットフォーム)ゲーム作りで難しいのは、ゲームのクリアをそこそこ難しくしかしそこそこ簡単にする難易度の設定です。最初から難しければユーザーはすぐに放棄するでしょうし、簡単すぎてもすぐに飽きるでしょう。この「Jumper」では、最初の足場を横に長く設定してユーザーにジャンプする時間的猶予を与え、2つめの足場を最初の足場のすぐ隣に作成して、誰でも容易に2つめの足場に飛び移れるようにしています。これはプログラミングによる結果なので、足場のスピードがいくつでプレイヤースプライトのジャンプ力はいくつと、具体的な数値が指定されているわけですが、数値の決定に至るまでには、おそらくこのゲームの作成者は何回もテストしたはずです。ゲームの難易度の問題は、プログラミングのテクニックで解決できるものではなく、ある意味作り手のセンスが問われる類の問題なので、これが正解というものはありません。プレイヤーにそこそこの達成感とそこそこの挑戦感を持たせる適切な難易度は、ゲーム作成者が自分で設定するしかありません。そのためには月並みではありますが、著名なゲームを自分でプレイしてそのゲームで行われている難易度設定の工夫を研究してみると、参考になるでしょう。最初の足場を長く、以降の足場を次々に左から右に移動させるコードは次のようになります。}}上記コードをブラウザで開くと、左から右に、細長い足場が移動し、つづいて次の短い足場が移動し、その後も短い足場次々と移動します。プレイヤースプライトは初め、長い足場の上にいます。プレイヤーはマウスクリックするかXキーを押すかしてスプライトをジャンプさせ、次の足場に飛び移らないと落ちて死んでしまうのですが、ゲームのスタート時にはその知識も準備もないので、最初の足場が短いと、何をやっていいかも分からないまま、スプライトは落下してしまいます。これではプレイヤーの意欲を削ぎかねないので、足場を長くすることで、プレイヤーに時間の余裕を与えているわけです。次の足場は、初めの足場のすぐ後に移動してきます。2つの足場は少しの間しか空いていないので、飛び移るのは比較的容易です。「Jumper」ではこのようにして、プレイヤーがゲームに入りやすくする工夫がされています。足場は最初、MIN_WORLD_SPEED(-7)のスピードで移動し、platformSpawnInterval(1400)の時間間隔で生成されます。lastPlatformSpawnedという変数が、最初の足場を生成するspawnFirstPlatform()関数で-10000に設定されています。このlastPlatformSpawnedは、毎フレーム呼び出されるspawnPlatform()で、次のように使用されます。}}短い足場を生成するspawnPlatform()でlastPlatformSpawnedはmillis()(プログラム開始時からの経過時間)に設定されるので、短い足場はplatformSpawnIntervalおきに生成されます。spawnFirstPlatform()関数でのlastPlatformSpawnedへの-10000の代入は、何を意味しているのでしょう?-10000はまさにマジックナンバーで、作成者でないと分かりませんが、推測することはできます。-10000はプログラムの時間を戻す効果があります。platformSpawnIntervalが評価されるので、ここでJavaScriptは「lastPlatformSpawnedがすごく小さく、すぐに短い足場を生成しなくちゃ」と判断するわけです。これは言わば、「だましのテクニック」です。これにより、長い足場のすぐ後に次の短い足場が生成され、プレイヤーはその足場に飛び移りやすくなり、しかも以降の短い足場は通常のplatformSpawnIntervalおきに生成されます。ジャンプして飛び移るジャンプして飛び移るアクションは、プラットフォームゲームをプレイするプレイヤーの醍醐味であると同時に、初めてゲームを作成しようとする初心者プログラマーの醍醐味でもあります。プレイヤースプライトの足場からの飛び移りの成功と失敗は次のようなコードで実現できます。プレイヤースプライトは落下する。}}次のリンクをクリックすると、実際の動作が確認できます。ジャンプして飛び移る」プレイヤースプライトのjumperSpの主な動作はupdate()関数で指定しています。jumperSpはまず、いついかなるときも落下します。GRAVITY;落下しないのは、jumperSpが足場グループに含まれるいずれかの足場スプライトと重なっている間です。この間jumperSpのvelocity.yを0に設定しつづけると、jumperSpは落下しません。重なっていない間は落下します。0;}画面下端を超えて落下するか、足場に画面左まで押しやられたときには、ゲームオーバーです。OVERの文字をコンソールに出力しています。(仮)}マウスとキーによるジャンプは次のコードで行います。Bernie」に似ていますが、ここでは非常に面白いcanJump変数があります。これは「今ジャンプできるかどうか」を表すブーリアン型の変数です。Bernie」のときと同様、現実世界に即して考えることができます。それは、「今ジャンプできるかどうか」を「今足場の上にいるかどうか」と見なす考え方です。プログラミングではこういった発想の転換が必要になる場合があり、できるだけシンプルに考えた方が結果も良くなります。ブラウザが開くときにはまだ何もないので、canJump変数はfalse(初期化時)プレイヤースプライトが足場グループと重なっているときには、jumperSpの下に足場がありジャンプできるので、canJump変数はtrue(最初の長い足場も足場グループに含まれている)マウスかキー操作があったら、jumperSpはジャンプするので、その間はjumperSpの下には足場がなくcanJump変数はfalse。ジャンプはjumperSpの下に足場があるときに限る(canJumpがtrueのとき)ゲーム難度のアップゲームプレイヤーの習熟度は向上するので、多くのゲームでは、ゲームのクリアを難しくします。レベル1では足場を移動スピードを10にし、それをクリアした次のレベルではスピードを20にする、といった具合です。「Jumper」には、レベルのクリアはありませんが、時間経過とともにゲーム難度を上げる方法が取られています。それはspawnPlatform()関数の終わりにあります。}}worldSpeed変数は足場スプライトのvelocity.xプロパティ値なので、新しい足場が生成されるたびに、MIN_WORLD_SPEEDの制限付きで、足場スプライトが右から左に移動するスピードは0.2ずつアップします。足場を生成する間隔も短くなります。これにはp5.jsのmap()関数が使用できます。JavaScript」で述べています。3.6を範囲とする値に変換され、それがplatformSpawnIntervalに代入されます。映画の映画音楽における働きを見るまでもなく、サウンドはゲームの臨場感の向上に大いに貢献します。使い過ぎはうるさくなるだけなので禁物です。ここでもドロップシャドウのテキスト。コメントをキャンセルメールアドレスが公開されることはありません。*サイト上に表示された文字を入力してください。WAAPIに関する注意WAAPIを利用するにはブラウザに特別な設定が必要です。ブラウザの実験的な機能を有効化する方法に書いているので、必ずお読みください。楕円(円)、円弧を描く。APIやTensorFlow.jsについて調べたことを書いています。freebiescafe.com。