‘JavaScript’ タグのついている投稿
enchant.jsの当たり判定不足を補う その2
2014 年 10 月 9 日 木曜日 by 山平前回、enchant.jsの当たり判定がイケてない理由を説明しました。
回転する矩形同士の衝突判定を自前で実装することを目標に、考察を進めていきます。
enchant.jsの当たり判定不足を補う その1
2014 年 8 月 8 日 金曜日 by 山平使いやすい和製ゲームエンジンenchan.jsですが、当たり判定がイケてないようです。
jQueryプラグインが意外と簡単に作れる話
2013 年 7 月 22 日 月曜日 by 山平画面周りのちょっとした処理をjavascriptで関数化することはよくありますが、規模が大きくなってくると本来のロジックが見えにくくなってしまってあまりよろしくないなあ、と思うことが多々あります。
過去にjQueryプラグインのソース解析に挫折したことがあって作るのも難しいと思い込んでいたのですが、実はとっても簡単でしたのでご紹介します。
配列の引き算をJavascriptで実装してみる
2013 年 6 月 4 日 火曜日 by 山平enchant.jsで状態管理実装 – オートマトン
2013 年 4 月 11 日 木曜日 by 山平前回、イベントの仕組みで状態管理を実装した例を解説しました。
今回は管理する項目を減らすために、できるだけオブジェクトによろしくやってもらう仕組みについて解説します。
enchant.jsで状態管理実装 – イベント
2013 年 4 月 2 日 火曜日 by 山平どんなに美しい3Dクラフィックスであっても、基本的にゲームはパラパラ漫画のようにヒトコマずつ処理されます。
enchant.jsにも、「フレーム」という概念があります。
フレームが始まるごとにイベントが発生するので、作り手はフレーム内の処理を書くだけでゲームっぽいものが作れます。
ゲーム開始後つまり「ゲーム中」についてはこれだけでも十分ゲームが実装できます。
しかし、規模が大きくなるにつれて「ゲームの開始前、終了後」など管理項目が増えてきます。
これらの処理をフレームイベント内だけで記述しようとすると、だんだん無理がでてきます。
今回はイベントドリブン的な実装を行なった部分について、解説してみます。
enchant.jsをTitanium MobileのWebView上で動かせた記録
2012 年 12 月 12 日 水曜日 by 山平enchant.jsをTitanium MobileのWebView上で動かせ(なかっ)た記録
2012 年 12 月 4 日 火曜日 by 山平以前、enchant.jsのサウンド再生について、イマイチな結果が出てしまいました。
ブラウザ実装の対応を待つ以外になにか良い手はないものかと考えたところ、TitaniumMobileのWebViewにenchant.jsを載せて、サウンド部分だけネイティブの機能を使えばよいのでは?と思いつきました。
うまくいけば開発効率はほぼそのままに、enchant.js(とブラウザ実装)だけでは実現が難しい部分もクリアでき、さらにiphone、Android両対応が実現できてしまいそうです。
iPhoneでenchant.jsのサウンド再生
2012 年 10 月 15 日 月曜日 by 山平Javascript製ゲームエンジンenchant.jsについて、過去にいくつかの記事を書きました。
ここでは触れていないのですが、enchant.jsではiPhone(MobileSafali)ではサウンドの再生に制限があります。
wise9 › enchant.jsのサウンド機能で、ゲームをさらにカッコよく!
特に、iOS上のブラウザ (Mobile Safari) については、「プレイヤーが画面にタップしたとき以外、音声が再生できない!」という大きな制限があるため、暫定的に、デフォルトでは以下のようなコードを実行しフラグを立てない限り再生されないという仕様になっています。・・・が、いまのところバグがあるらしくiOSで正しく再生されません!目下修正中です!
と、いうことで今回はiPhoneでのサウンド再生について調べてみました。
以下のサイトの情報を参考にしています。
D-lagoon ブログ [enchant.js]iPhoneで音を鳴らすのに一苦労 | D-lagoon ブログ
検証のために以下のようなコードを作成しました。
enchant(); enchant.Sound.enabledInMobileSafari = true;//必須 IMAGE_FILE = "chara1.png"; SOUND_FILE = "gameover.wav"; InitBear = function(no){ var game = enchant.Game.instance; var bear = new Sprite(32, 32); bear.image = game.assets[IMAGE_FILE]; bear.x = (game.width - bear.width) * (no/5); bear.y = (game.height - bear.height) * (no/5); bear.frame = no * 5; return bear }; window.onload = function(){ var game = new Game(320, 320); game.fps = 15; game.preload(IMAGE_FILE, SOUND_FILE); game.onload = function(){ var no = 1; // 1: 通常、これで再生できる var bear1 = InitBear(no++); bear1.addEventListener("touchstart", function(){ game.assets[SOUND_FILE].clone().play(); }); game.rootScene.addChild(bear1); // 2: 参考サイト(D-lagoon ブログ)での回避策 var bear2 = InitBear(no++); bear2.addEventListener("touchstart", function(){ game.load(SOUND_FILE, function(){ game.assets[SOUND_FILE].play(); }); }); game.rootScene.addChild(bear2); // 3: 上からloadを省略してみる var bear3 = InitBear(no++); bear3.addEventListener("touchstart", function(){ game.assets[SOUND_FILE].clone().play(); }); game.rootScene.addChild(bear3); // 4: イベントだけ拾って保持 var bear4 = InitBear(no++); bear4.flag = false; bear4.addEventListener("touchstart", function(){ if(this.flag) game.assets[SOUND_FILE].clone().play(); this.flag = false; }); bear4.addEventListener("enterframe", function(){ this.flag = true; }); game.rootScene.addChild(bear4); }; game.start(); };
結果は予想通り、2と3でサウンドの再生を確認できました。
しかし、再生までに数秒かかるので、実用的とは言えませんが、Mobile Safaliではこれが限界なようです。
【後日談】
数日後、ふと同じ検証を行なってみました。
するとなぜか1,2,3,4すべてのパターンでサウンドが再生されました。
ソースは触っていないのに何故???
ですが、やっぱり再生までに数秒かかるので、実用的とは言えません。
以上です。