ロード画面を好きなように改造する

enchant.jsのゲームを起動すると一番最初に表示される画面。

このバーが満たされていくことでロード状況を教えてくれるわけですが、何もない画面にこれだとなんか寂しいので改造してみましょう。

ちなみにこれはオリジナルゲーム.comさんの記事を読んだのがきっかけです。

この記事ではloadSceneを作ってgameオブジェクトのloadingSceneに入れているんですが、それならenchant.jsの中身のloadingSceneを直接いじってやろうじゃねぇか!!となった、ということです(*´ω`)

loadingSceneの中身

enchant.js内のloadingSceneの中身がこちら。

なんとこの部分は我々が慣れ親しんだenchant.jsで書かれています!!これなら改造し放題!!(・∀・)

と、行きたいところですが、ここでは画像や音楽は使えません。だってロード前だから。読み込み状況を知らせてくれる画面だから。。(´;ω;`)

と、諦める必要はなくて、画像を出したいならここで必要な画像だけ先に読み込んでしまえばOKってことです。まぁその方法はオリジナルゲーム.comさんの記事を読んでくださいな(‘ω’)ノ

ちなみに私はこんな感じに作りました。

フレーム処理を改造する

enchant.jsではFPS(1秒間に画面を更新処理する回数)を好きなように設定できるようになっているのですが、これがどうも安定していないというのがずっと気になっていました。

パズルゲームなどを作っている段階では気にならなかったんですが、シューティングゲームを30FPSで作ってみるとどうも弾の動きが早くなったり遅くなったりしている。

気になりだしたら凄く気になるので改造を試みてみました。

requestAnimationFrame()が更新している

javascriptの知識のまったくない素人がenchant.jsの中身を読んでも全く理解できません(;´・ω・)

が、時間をかけてそれっぽいところをついに探し当てrequestAnimationFrame()という関数が画面の更新処理をしているということを突き止めました( `ー´)ノ

で、更新処理をしているであろう所を読んでみるとなんか変なんですよ。

requestAnimationFrame()が更新処理をしてくれるはずだけどsetTimeout()も使っています。

多分これはrequestAnimationFrame()に対応していないブラウザに対応させるためにあるんだろうと思うんですが(ちゃんとわかっていない)、たぶんいらないんじゃね?(・∀・)

ってことでばっさりカット。

しかし、これだと60FPSになります(requestAnimationFrame()は60FPSで更新処理する)。なのでこの_requestNextFrame が呼ばれたときに好みのFPSになるように調整して必要な時だけ処理するようにします。

たとえば30FPSにしたい場合2回に1回処理するようにすれば処理が半分になり30FPSになります。

で、それを書く場所が _requestNextFrameのちょっとしたにあります。

なんか上でバッサリカットしたらここに_requestNextFrame()が来るようになりました。そしてその下にFPSを調整する処理を書きます(30FPSにしたいなら2回に1回処理するように書く)。変数を使ってゲームによって変更できるようにしておいた方が良いです(自分で考えてね(^_-)-☆)

あとついでにrequestAnimationFrameで検索すると以下のようなところがあります。

たぶんこれはrequestAnimationFrameに対応していないブラウザのための処置だと思うんですが、これ無しで動くのでこいつもバッサリカットしてやりましょう(・∀・)

まとめ

細かい説明はありませんが(説明できないんだよ(;^ω^))こんな感じで修正するとFPSが安定するようになりました。気になる方は試してみてください(改造は自己責任で!ちゃんとバックアップとっとけよ!)

読めるenchant.jsを手に入れよう

enchant.jsは初心者でも簡単にゲームが作れるゲームエンジンです。なので必要最低限の処理は用意してくれているのですが、プログラミングが上達してくると物足りなさや変更したい部分などが出てきます。

ありがたいことにenchant.jsはMITライセンスというライセンスで公開されていて(詳しいことは知らん)、ソースコード内の著作権表示を削除しなければ「ソースコードの改変」「再配布」を自由に行っていいようです。

enchant.jsのライセンス

なのでプログラミング技術が上がってきたら少しずつenchant.jsの改造に着手しましょう。そしていつの日か自作ゲームエンジンを開発してやりましょう!(・∀・)

読めるenchant.jsを手に入れる

enchant.jsダウンロード

上のリンクからenchant.jsをダウンロードするとenchant.min.jsというファイルが入っていて、もちろんこれがenchant.jsなんですけど、これは改行やスペースなどが消されていて読むことができません(´;ω;`)

で、どこかから読めるenchant.jsを入手しないといけないんですが一体どこで手に入れられるのかわからなくてしばらく困っていたんですけど、見つけたんですよ!(・∀・)

enchant.js 0.8.3用プロジェクトテンプレート

jsdo.itはweb上でhtml・css・javascriptの開発が行えるサイトのようで(使ったことないから詳しいことは分からない(^^;))いろんなプログラムが公開されています。なのでenchant.jsを使ったプログラムも公開されていて、なんと!enchant.jsも読める形でアップされています!ヤッター!

ということでここからダウンロードするかコピペしてenchant.jsを手に入れましょう!(私の場合ダウンロードしようとしたらセキュリティーソフトが警告を出したのでコピペしました)

初心者には厳しい現実・・・

で、じっくり読んでみようと思って中身を見てみるとこれが全く理解できない(;´Д`)

当然と言えば当然なんだけど、enchant.jsはゲーム開発初心者でもゲーム制作を楽しめるようにしてくれているゲームエンジンです。つまりプロがプロフェッショナルな技術を駆使して書いてあるプログラムなのでちょっと齧った程度の素人プログラマーが読めるわけはないのです(´;ω;`)

と、諦めるのは早いわけで(;´∀`)

時間をかければ出来るようになるわけで、少しずつ挑戦していきましょう(‘ω’)ノ

enchant.jsのクラスの処理で困ったこと

enchantjs講座

enchant.jsのクラスで私が遭遇した困ったこととその解決策を書いておきます。

thisがダブるとき

クラスを使うと色々な変数をクラスオブジェクトのプロパティとして追加して使うことになるわけですが、たまにイベントリスナを使いたいときに困ったりすることがあります。

と書いたときにplayer.addEventListner内でthis.aaa()メソッドを呼び出した場合、thisはplayerオブジェクトという風に判断されてうまく動いてくれません。こっちはMainGameSceneを指すthisのつもりなのに言うことを聞いてくれません。

一体どうすりゃいいのよ?としばらく悩んで放置していたんですが解決方法は実は簡単でした(´Д`)

変数を作ってやってそれにこのクラスオブジェクトのアドレスを渡してやれば処理できるってわけです。

簡単なことだけど気づかなかった(;´Д`)

クラス内の変数のスコープ

クラス内で宣言した変数は当然ローカル変数になります。それは分かるんだけど同じクラス内でも別のメソッドになるとローカル変数は使えない。

クラスのthis.○○みたいにプロパティにしてしまえば問題ないんだけどシーンのようなたくさん変数を扱う場合すべてをプロパティにするのは入力の字数も多くなるし読みにくくなるしやりたくない。

しかし、実際これはシーンのようなたくさん変数を扱うクラスでない限り問題にならないようで、しかもシーンだと基本的にonenterframeくらいしか使わないのでonenterframeを独立したメソッドとして書かず、

イベントとして処理することで解決しました。

本当は分けて書きたかったんだけど仕方ないね(´・ω・`)

onenterframeは継承しないとない

どうやらonenterframeはSprite、Group、Sceneのどれかを継承してクラスを作らないとフレーム毎に作動してくれません。

そんなに大した問題じゃないけど、どうしてもonenterframeを使いたいってときは継承して作りましょう

円の当たり判定で色々試してみる

基本の当たり判定と言えば矩形の当たり判定と円の当たり判定があります。ほかにも色々な方法があるようですがここからは数学が分からないと厳しい領域に入ってきます。数学をちゃんと勉強しないとこれ以上先に進めない壁がここにあります(;’∀’)

と、まぁ確かにすべてを自分一人で作ろうとすると数学は必須になるわけですが今は他人が作ってくれたプログラムを利用すればわからなくても何とかできてしまう時代。。

しかし!やはり出来る限り一人の力で作って

「全部俺様一人でつくったぞ!」ドヤァ

と言いたい!!

そんなわけで、たとえ矩形と円の当たり判定しかできなくても工夫次第でもうちょっと複雑なこと出来るように挑戦しようぜ!!っていうことです。

おさらい

矩形の当たり判定は単純にキャラのx・y座標と幅・高さを使ってお互いの位置が重なっているかをチェックします。

円の当たり判定はキャラ同士の距離がキャラの半径の和より小さくなると当たったとなります。

この辺はググればいくらでも情報があるのでわからない人はググってください(^^;)

問題はここから。これ以上先の当たり判定はググっても数学が分かる前提で書いてあるのでわからん奴にはさっぱりわからん(´;ω;`)

しかし、ここからがたとえ学が無くても出来る男の本領発揮!

当たり判定を二つ使う

矩形と円は出来た。しかし他の形はどうしていいのかわからん。。

なんかいい方法はないだろうか、と考えて閃いたのが当たり判定を二つ使う方法。これが単純だけど効果的。

例えば円と線を組み合わせて

かまぼこ型の当たり判定を作ることができる(赤いところが当たる範囲)。円の当たり判定では当たっていてもある位置より下の場合は当たっていない、て書けば出来る。

もう一つ、円を二つ使ってみると

こんな形のも出来る(赤いところが当たる範囲)。

これを上手く使えば例えばこんな形の障害物が

横からニョキっと出てくるのがつくれたりするわけですよ。

すごくね?(*´ω`)

もちろん画像の動きと合致するように当たり判定も動かさないといけないから大変だけどね。

でもシューティングゲームでこういうの出来たらかなりプロっぽくない?

まとめ

というわけで数学がわからなくても努力と根性とアイデアで何とかなるわけです(*´ω`)

出来ないなら、わからないなら、出来る範囲で考える!

諦めちゃだめです(‘ω’)ノ

sceneに直接addChildしない方が良い

今回もちょっとした小技の紹介。大したことじゃないけど知っておくと便利かも。

enchant.jsでは画像はsceneにaddChildすることで表示されます。だけど最初から全部sceneにaddChildしていくと画面全体にエフェクトをかけて演出したいときに困ることがあります。

たとえば画面を揺らす演出をしたいときに画面内に表示されている得点などまで一緒に揺れるのはちょっとおかしくない?それも演出の内なら良いけどそうじゃないなら一緒に揺れると困るわけです。

で、どうするかというとGroupで分けます。ゲームのキャラクターなどを表示するGroupと得点などの情報を表示するGroupって感じに分けて作って振り分けてaddChildします。

例えばこんな感じにしてます。

ゲーム用にscreenというGroupを作ってゲーム部分はそこにaddChildします。keypadはGroupを継承して作ったバーチャルパッドのグループです。ボタンなどはこのkeypadにaddChildされています。

このように作っておくとscreenを動かしたり拡大縮小したりしてもkeypadは完全に別の存在になっているので影響を受けません。

 

大したことじゃないけど、あとから気づいて修正するのは面倒臭いので最初から分けて作っておくのが良いと思います(‘ω’)ノ

enchant.jsで右クリックを使いたい

enchatnt.jsではマウスの右クリックはサポートされていないようです。右でも左でもクリックは同じ扱いで処理されます。そして右クリックするとブラウザのメニューが表示されてしまいます。

でも右クリックが使いたい!!

ゲームで使うつもりだったのに出来ないのは困る!!ってことで方法を探しました。

javascriptで書いてみる

enchant.jsでサポートされていないならjavascript直で処理を書くしかない。ってことで検索して出てきたのがこちら

これでメニューの表示をキャンセルし、右クリックに処理を割り当てることが可能になります。

ただし!enchant.jsとは関連がないのでいろいろ困ることが出てきます。

問題1:eventの位置が違う

enchant.jsのtouchstartは設定したゲーム画面内の位置をeventで渡してくれますがjavascriptのmousedownで書くと当然enchant.js内の位置ではないです。ブラウザ内での位置になります。

なので右クリックかどうかの判定だけはmousedownで判断するが、位置に関してはenchant.jsのtouchstartで拾うということになります。

問題2:スマホに対応していない

当然と言えば当然なんだけどenchant.jsはスマホでもPCでも動くようにしてくれているゲームエンジンです。それを使わずjavascriptのmousedownを使うとスマホでは対応してくれません(マウスの処理だもんね)。なのでPCとスマホで処理を変える必要が出てきます。

ということでスマホかPCかを判別しなくちゃいけません。で、やり方を検索して出てきたのがこちら

まとめ

は?プログラムは?

って思われている方もいるかもしれませんがそれは自分でやってください(^^;)実はこれ、けっこう無理くりな感じになってキレイなプログラムにならないんですよ。なのでそんなプログラム見せたくないので自分で作ってください(^^;)

てかenchant.jsの必要な部分を改造する方法が分かればいいんですが今のところそこまでの知識がないので仕方ないです。いつか方法がわかればその時改めてばっちりなプログラムとともに紹介したいと思います(^^;)

画面タッチ処理のいろいろ

enchantjs講座

画面のタッチ処理について自分がやってみて気づいたことを紹介します。

画像無しのスプライトを使う

例えば画面全体のどこかを押すことで何か処理をさせるならシーンにイベントリスナを設定します。

じゃあ画面の右半分にタッチする場合と左半分にタッチする場合で処理を変えたい場合はどうすればいいのかな?

と思ったときに試してみたのが画像を設定しないスプライト。画像は設定していないので当然画面には何も表示されていないけど設定した大きさと場所にスプライトは存在しているようです。なのでイベントリスナを設定してやるとちゃんと反応してくれます。

タッチに当たり判定をつけて処理する

例えばタッチで触ったものに何かしらの処理をさせたいとき、普通はスプライトにイベントリスナを設置して処理すると思うんですが、これだと画像が重なった時に上になっている方のイベントが処理されます。

例えばそれが画像が小さくてスプライト的にはそこにあるけど見た目は何もない部分なんてときに、その余白部分の下に別の画像があって、プレイヤー的にはそっち押したつもりなんて状態の時に正しく処理できない(説明が難しい)。

上の画像で言うと重なってる部分では上になってる方のイベントリスナが発火します。もしプレイヤーが下の方を押したつもりだったらおかしなことになってしまいます。

というか余白部分でも反応してしまうのでそれをどうにかしたい(最初からそう言えば分かりやすかったんだな(^^;))。

で、どうしたもんかな?と考えた結果、スプライトのイベントリスナでは処理をせず、タッチした場所とキャラとの当たり判定を取るようにしました。

通常のシューティングゲームなどと同様にキャラの当たり判定を設定し、画面にタッチするたびにその場所とキャラとの当たり判定をとればOKです。

で、このとき上になってるキャラから当たり判定を取っていけば重なっていても問題なく処理できます。

【パズルゲーム】連鎖中毒

見た目はマッチ3風だけどちょっと違うパズルゲームです。
最初ちょっと戸惑うかもだけど、慣れるとバンバン連鎖が起こって結構楽しめます。

遊び方

同じ色の宝石同士をくっつけることができます。くっつけると数字が合算されます。
隣り合った宝石の数字が3つ以上ゾロ目や順目になれば消えます(333とか567とか432とかね)
宝石が消えると新しい宝石が上から落ちてきます。上から落ちてくるときにまた揃うと連鎖になります。連鎖が続くと得点がどんどん増えます。
同じ色の宝石の数字を合算する際、7を超えてしまうとお邪魔虫になってしまいます。お邪魔虫は隣で宝石が消えると一緒に消えます。

作った感想

これもenchant.jsでゲーム開発を開始した初期のゲームです。もともとはDOMで開発していたんですけどアニメーションさせるときに思ったよりも面倒臭かったので放置していて、その後enchant.jsでゲームを作り始めたときに作り直したものです。

特筆するようなことは特にないんですが、実は当初考えていたゲームとはかなり違っていて、最初はマッチ3のようなパズルゲームではなく、もっとややこしいルールがあったんだけど作ってみたら全然面白くなかった(^^;)それで試行錯誤しているうちに結局マッチ3的なゲームになってしまったという。。まぁそういうこともあるよね(;^ω^)

実はマッチの際の評価の仕方にちょっと問題があるんだけどプログラムが汚くなりすぎていて直す気がしないで放置してます。いつか直す。。

ああ、あとこれゴールデンウィークにちょっと改造したんだった。もともと落書きみたいな画像だったのをちゃんと奇麗に書き直して連鎖の演出やBGMもその時に追加しました。やっぱり見た目や音楽ってのはゲームにとってはとても重要なことってのはこの時はっきりわかりました。

まぁこれはこんなもんかな(‘ω’)ノ

【ランゲー】秘密警察ギャボリン第2話

オリジナルゲーム「秘密警察ギャボリン」の第2作目。今回はランゲーに挑戦。しかし、ただ走ってジャンプするだけでは能がないのでそれなりにオリジナルな要素を入れて頑張ってみたぞ!


ストーリー

平和な街に乙女の悲鳴が!!

学校帰りの女子高生のカバンを狙った変態ひったくりヤローが出現!!!

ヒーロー・ギャボリンが正義の鉄槌を下す!!(超適当)

遊び方

キーボードの矢印キーまたは画面下にあるボタンで操作します。

  • ↑・・ジャンプ。押す長さで高さが変わります
  • →・・ダッシュ。押している間加速します(基本押しっぱなしでOK)
  • ↓・・スライディング

こんだけです。ただし、ジャンプやスライディングはスピードが落ちます。さらに障害物に当たるとスピードは最低に戻ります。

画面下にある白のドットがギャボリン、赤のドットがひったくり犯です。離れすぎると見失うので気をつけましょう

作った感想

このゲームの制作過程では色々な発見がありました。

まず一番大きな発見がボタンの同時押し。このゲームを作るまではブラウザでは2か所同時押しには反応しないものだと思い込んでいました。なので最初は加速とジャンプ・スライディングは別々に押さなければいけないと思っていました。

ところがスマホで遊んでみると同時押しに反応するではないか!!まさかの発見に歓喜したのであります( `ー´)ノそしてここからゲームボーイ風キーパッド作成へとつながっていくのであります。

で、あとはこのゲームでは大きさの違うキャラ(障害物)を出すために表示するスプライトのオブジェクトの追加・削除が出現・消失のたびに行われるように作ったんですが、これはどうやらスマホには負担が大きすぎるようだということもわかりました。

スマホではスプライトは削除せず、不要なときは画面外に置いておいて必要な時に画面内に出して使うやり方の方が確実に処理が速い。大きな画像を使いたい場合は複数組み合わせて使うやり方を考えた方が良いようだ。