HTML5ゲーム(キャンバス)-UIテクニック?


23

PhoneGapを使用してモバイル(Android / iPhone / WebOS)向けのJavaScript / HTML5ゲーム(Canvasを使用)を作成中です。現在、UIとプレイボードをどのように構築し、どのように相互作用させるかを設計しようとしていますが、最善のソリューションが何であるかはわかりません。ここに私が考えることができるものがあります-

drawImageやfillTextなどを使用して、キャンバスにUIを直接構築します。通常のDOMオブジェクトを使用して、キャンバスの外側にUIのパーツを構築し、UI要素がプレイボードキャンバスとオーバーラップする必要がある場合、divをキャンバス上にフロートします。私が考えていないゲームUIを構築するために使用できる他の可能なテクニックはありますか?また、これらのどれが「標準」の方法と考えられますか(HTML5ゲームはあまり人気がないので、おそらく「標準」の方法はまだないでしょう)。最後に、どの方法を推奨/使用しますか?

事前に感謝します!


CanvasはIEでまだサポートされていないことに注意してください(IE9がそうするようです)。これにより、ゲームの巨大な市場シェアが削除されます。IEで動作するようにしようとするJavaScriptパッチがありますが、うまく動作しません(地獄のように遅い...それだけの価値はありません)。

1
@Adam-flashcanvasを参照してください:flashcanvas.net
ehsanul

dom要素をguiとして使用し、複数の浮動divを「windows」として使用し、1つのウィンドウにcanvas要素を含めます(実際のゲーム)。そして、常にこのオプションがあります:developer.mozilla.org/en-US/docs/HTML/Canvas/… :)
Kikaimaru

回答:


18

どちらのソリューション(キャンバスに描画するか、従来のHTML / CSSを使用する)は完全に有効であり、正常に機能します。考慮すべき事項:

  • すでにキャンバスベースのライブラリを使用している場合、UIに追加の(DOMベースの)メソッドを持たせる代わりにキャンバスを使用し続けることで、コードがよりきれい/整理されたものになる可能性があります。
  • UIが非常にテキストを多く含む(ダイアログなどを含む)場合、HTML / CSSを介して実装する方が簡単な場合があります。たとえば、テキストがDOM要素(折り返しや段落間隔など)を流れるのは非常に簡単で、キャンバスに実装するのは比較的困難です。
  • 使用しているライブラリに大きく依存しますが、キャンバス内よりもDOM要素にクリック処理を実装する方がはるかに簡単です。たとえば、「OK」ボタンのクリックを検出する場合、HTML / JSの世界では簡単なタスクです。ただし、キャンバスでは、別の要素のクリックを聞いて、その座標をチェックしてクリックが発生した場所を確認する必要があります。
  • 一部のユーザーエージェント(特にモバイルデバイス)は、テキストを含むDOM要素を使用する場合に注意が必要です。たとえば、Mobile Safariは、コピー/貼り付けツールを使用してモーダルをポップアップ表示する場合があります。この動作を防止することは難しく、おそらくキャンバスランドでは簡単になります。

これのいくつかは主観的です。私が知っている開発者は、DOMがくて冗長であることに気付くので、常に canvasの使用を好みます。どちらのソリューションでもうまくいくので、アプリでシンプルな単一の画面を選択し、両方の方法を使用して個別に迅速に開発し、どちらが簡単/良いと感じるかを確認します。

幸運を祈ります!


お返事をありがとうございます!非常に良い点。私は実際に今自分のエンジンを構築しています。Canvasを使用して開始しましたが、CSS3 / WebKitをテストするために少し変更する予定です。私が自分で自分で構築している唯一の理由は、ゲームが「実際の」エンジンには「単純」すぎるからです。メインのゲームループすらありません。それがアニメーションでさえある唯一の理由ですが、それらが頻繁に発生しないことを考えると、おそらく必要に応じてタイマーを開始/停止できます:)
ジェイソンL.

5

キャンバスとのやり取りには、easeljsを使用しています。

それはかなり良いですし、堅牢な設計を容易にします。私が選んだ主な機能の1つは、キャンバスオブジェクトとdom要素の位置を同期する機能でした。

これにより、CSSのスピーチバブルと、hudフレームなどの静的UI要素を簡単に実行できます。

これがブラウザにもたらす利点は、リッチキャンバスを取得することです。しかし、パフォーマンスを抑えるために、小さく静的なものをDOMに持ち込むことができます。


4

Canvasは、モバイルプラットフォームでは遅く、少なくともモバイルサファリはとにかく遅いので、それらのオブジェクトのCSSベースのポジショニングを使用する必要があります。具体的には、オブジェクトのハードウェアアクセラレーションレンダリングを有効にする「translate3d」を使用します。

ただし、canvasのCAATライブラリを確認してください。高速であり、CSSをサポートする「アクター」を使用して、ゲームロジックを変更することはできません。

まだリンクを投稿できませんが、ここにいくつかの擬似リンクがあります http://labs.hyperandroid.com/animation


CAATのページのレポリンクは古いものを指していると思うので、代わりにこのリンクを使用してください!レポ:github.com/hyperandroid/CAAT
onedayitwillmake

- (申し訳ありません私は、現在のポストごとにリンクを追加することができます)ここで私はCAATのhello世界のテンプレートが含まれているの作成デモですonedayitwillmake.com/CAATCirclePack
onedayitwillmake

リンクをありがとう、defします。見てみな。Canvasの音が遅いという噂を聞きましたが、私は普段自分で物事を見なければならない人です:)また、私が作成しているゲームはアニメーションに非常に明るいことに注意してください。一度に1分間、5〜10秒に1回の間隔で、1つまたは2つを超えて実行しないでください。クレイジーなものはありません。また、検証するために、Canvasをまったく使用せず、CSS / translate3dでプレーンな古いDOMオブジェクトを使用することを提案していますか?
ジェイソンL.

正直に言うと、特定のシナリオについて言うことはできません。ただし、モバイルサファリを具体的にターゲットにしたい場合は、CSSをdivで使用することをお勧めします。私の経験からキャンバスを再描画するのに比べて、それは非常に高速です。'translate3d'を使用して30FPSで移動する45個の画像ベースのスプライトを簡単に取得できました。'transform3d'で移動する予定のオブジェクトのCSSに必ず配置してください。そうしないと、webkitは配置する代わりに、指定した場所にそれらのオブジェクトをアニメーション化します。-webkit-transition:transform3d 0s linear;
onedayitは

2

iPhone 4のキャンバスの速度低下について同意する必要があります。サファリキャンバスがGLに裏付けられていないことを確認してください。私の軽快なゲームは、iPhone 3GSとAndroidで高速に動作しますが、iPhone 4では、網膜ディスプレイのピクセルが多すぎると思います。キャンバス開発モデルが気に入っていますが、css translate3dオプションはまだ試していません。特に、GWTとgwt-g2dキャンバスラッパー(最適化/難読化)を使用しました。 http://www.photonjunky.com/shootout.html


1

私は、次のようなHTML要素として、あなたのコントロールを維持することをお勧めmenuし、commandアクセシビリティの理由から。少しのCSSを使用して、キャンバス上要素を表示でき、HTMLの事前に構築された機能を失うことはありません。


1

これは古い質問ですが、今日(2013年3月)よりよく知っています。私がやったように他の誰かがここにつまずいた場合に答えることにしました。私は他のほとんどの答えに反対しなければなりません。これらはおそらくWebブラウザー開発には有効ですが、モバイルには有効ではありません。選択するパス(DOMまたはキャンバスアニメーション)に大きな違いがあります。AndroidのWebビューはそれ自体が完全に役に立たない(遅い、st音)ので、ハードウェアアクセラレーションを適用できない限り、PhonegapはAndroidゲーム開発に役に立たなくなります。詳細については、この返信を参照してください。


0

百万通りの方法で実行できます。しかし、あなたは最も快適に感じ、エンジニアは最も自信を持っています。

インスピレーションやコード例を探しているなら、私がそれをする一つの方法があります。ボタンが押されるまで繰り返しメニューを描画する機能があります。ボタンが押されると、ゲームがロードされ、古いメニュークリックイベントリスナーが削除され、新しいゲームクリックイベントリスナーが追加されます。また、メニューの古いドローループを終了し、新しいゲームドローループを開始します。以下に、選択方法を示すために選択したスニペットを示します。

Game.prototype.loadMenu = function() {
  var game = this;
  var can = this.canvas;

  // now we can use the mouse for the menu
  can.addEventListener('click', game.menuClickEvent, false);
  can.addEventListener('touchstart', game.menuClickEvent, false);

  // draw menu
  this.loop = setInterval(function() { game.drawMenu() }, 30);
};

Game.prototype.drawMenu = function() {
  // ... draw the menu
}

Game.prototype.loadLevel = function(levelstring) {
  // unload menu
  var can = this.canvas;
  var game = this;
  can.removeEventListener('click', game.menuClickEvent, false);
  can.removeEventListener('touchstart', game.menuClickEvent, false);

  if (this.loop) clearInterval(this.loop);

  // ... other level init stuff


  // now we can press keys for the game
  //can.addEventListener('click', game.gameClickEvent, false);
  can.addEventListener('touchstart', game.gameClickEvent, false);
  can.addEventListener('keydown', game.gameKeyDownEvent, false);

  this.loop = setInterval(function() { game.tick() }, 30);
}

// called from tick()
Game.prototype.draw = function(advanceFrame) {
  // ...
}

このようにして、ゲーム描画とゲームイベントをメニュー描画とメニューイベントから分離することができます。また、メニューでゲーム/アニメーション要素を使用して、見栄えを良くしたい場合に使用する余裕があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.