読者です 読者をやめる 読者になる 読者になる

個人でかんたんiPhoneゲーム制作、愛と勇気とかしわもち、cocos2dについてのまとめ

ちょっと前にiPhone版「愛と勇気とかしわもち」をリリースしました。

http://itunes.apple.com/jp/app/love-mochi/id464653777?ls=1&mt=8

そんなわけで、iPhoneゲー制作方法の概要とか楽しさを、かんたんに共有してみたいと思います。iPhoneゲーは想像よりもずっと楽に作れるので、ぼくみたいに暇な人はiPhoneゲームつくったら良いのではないでしょうか。


前置き

同人とかでPCゲーム作ってる方に、ぼくがiPhoneゲーをつくったという話をすると「iPhoneゲーってどうやって作るんですか?」みたいなことをよく聞かれます。実際につくってみたことがない方は、iPhoneゲー開発はPCゲー開発よりもだいぶ面倒なのではないか、という印象を持っているように感じます。


ぼくも最初はそう思っていたわけですが、シンプルなゲームを作る限りでは想像よりはるかにかんたんです。そして楽しいです。なので、プログラミング経験のある方でiPhoneゲー開発に興味がある方は、もっと気軽に手を出しても良いのではと思っているわけです。

あと、下の方で紹介していますが、iPhone用のノベルゲームエンジンもありますので、スクリプトでノベルゲーをつくることもできます。


まとめ

とにかく強調したいことは「簡単なゲームなら、簡単に作れる」ということです。

  • 予想よりずっと楽にできる
  • 実機で動くし楽しい
  • cocos2d素晴らしい

という感じです。


注意していただきたいのは、ここで紹介するのは「売れる!すごい!!高度な!!!iPhoneゲーのつくりかた!!!!!!!!!!!」ではなく、「シンプルなゲームは楽しく簡単につくれますよ」というお話です。


ぼくはゲームプログラマでもなんでもないですし、プログラマか生ゴミかでいえば人間のクズではありますが、そんな人間でもiPhoneゲーをなんとか作ることができました。


想像してたよりもよかったこと

全体的に、実装過程は予想よりずっと苦労が少ないものでした。

OSはMac, 開発環境はXcode, 言語はObjective-C、あとcocos2dと、ぼくにとって新しいものづくめだったのですが、にもかかわらず、変なハマり方をして多大に時間を潰すようなことは、ほとんどありませんでした。

変なハマり方というのは、ライブラリとかの言語のわけわからん挙動に翻弄され、わけもわからず長時間足踏みしてしまうような状況です。


もちろん、不可解なバグが発生してなかなか解決できずに困るという状況は何回もありしたが、原因究明してみたら不可解だったのはぼくのプログラムおよび頭のほうだったという結果に毎回たどり着きますし、これはiPhoneゲー開発に限らずいつものことなので問題ありません。


無用な苦労が少なかったのは、ゲーム自体がシンプルだったのもありますが、後述するcocos2dの力がかなり大きかったと思います。


また、ビルド〜実行までの時間が短いのも、嬉しい誤算でした。ちょっと修正して、うごかして、また修正する、というサイクルがわりかし快適です。Mac上のiPhoneエミュレータでうごかすときはもちろん、実機でうごかすときも、そんなに時間はかかりません。これはもちろんアプリのサイズにもよると思いますが、小規模ゲー制作者にとってはありがたいことです。

実機でデバッグするときも、普通にIDE上でステップ実行できます。


PCゲーにありがちな「この環境だとなんかうごかない!」みたいなことが少ないのも良いですね(Androidアプリも、このへんは面倒らしいです)


あとやっぱ実機でうごくと嬉しいですね。


cocos2d


上でもちょいちょい名前がでていますが、開発にはcocos2dを使いました。

http://www.cocos2d-iphone.org/


cocos2dとはiPhone用2Dゲーム開発用のフレームワークです。


cocos2dにはiPhone用以外もあるので、正確には「cocos2d for iPhone」というべきなのかもしれませんが、だいたい「cocos2d」といえば、cocos2d for iPhoneを指すようなご時世になっているっぽいです。


使いやすく、すでに実績も多数あり、またライセンスも緩いです。


かるく擬似コードによるサンプルで示すと、

敵を100,20の位置に生成するのは、こんな感じです。

 enemy = new CCSprite("enemy.png");
 enemy.position = [100, 20];
 this.addChild(enemy);

敵を3秒かけて160,240の位置に移動するには、こんな感じに書けます。

 mv = new CCMoveTo(3, [160, 240]);
 enemy.runAction(mv);

ここで詳しく書いても意味はないのですが、「簡単に書ける」という雰囲気がなんとなく伝われば幸いです。

音周りとか、シーン管理とかもわかりやすく使いやすかったです。


Objective-Cの壁

ちなみに気になる開発言語ですが、実際はObjective-Cです。

ので、さっきの擬似コードは、実際にはこんな感じになります。

 // 100,20の位置に生成
 CCSprite *enemy = [CCSprite spriteWithFile: @"enemy.png"];
 enemy.position = ccp(100, 20);
 [self addChild:enemy];

 // 敵を3秒かけて160,240の位置に移動する
 id mv = [CCMoveTo actionWithDuration:3 position:ccp(160, 240)];
 [enemy runAction:mv];

初見キモいと思われる可能性があるので、さっきは擬似コードでお茶をにごしました。

メソッド呼び出しが[instance method]と書いたり、引数に名前を常につけるのが、けっこうな割合の人にとってキモイく感じるのではないでしょうか。


iPhoneアプリ開発に興味はあるものの手を出していない人と話をしていると、メジャーな言語とはちょっと違う記法を使うObjective-Cという言語を覚えなくてはならないことが、かなりの心理的障壁となっていることを強く感じます。いままでMacとかで開発していない限りObjective-Cは知らないと思いますし。


ちなみにメモリ管理も(現在は)GCが使えません。


とはいえ、ぼくも最初はキモく感じていたのですが、すぐ慣れました。そもそもぼく自身がキモいので、言語のキモさはどうってことはないと思います。
結局のところ、クラス定義をしてインスタンス作ってメソッド読んでというノリはメジャーなオブジェクト指向言語と同じです。なので、C#やらJavaやらのクラスベースやオブジェクト指向言語をやっていれば、そこそこ馴染みやすいのではないかと思います。


Xcodeのコード補完もぼちぼち使いやすいですし。


あと、ひとりでコード書くような場合は、最初は「ひととおり勉強した上で、Objective-Cっぽいコードを書く!」とか気張らず、ほかの知っている言語をつかっている気分で、気楽にやるほうが挫折しないで良いと思っています。ぼくもそんな気持ちでゆるくやっていたので、objective-Cの細かい機能とかは正直よくわかっていません。


(iPhoneゲー開発している方に聞くと、Objective-Cは少しで、主としてCとかC++で開発している方もいるようなのですが、そっちの方法はよくわかりません)


cocos2d参考情報

cocos2dを勉強するにあたり、検索だけでなんとかなるほどWebには日本語情報は蓄積されていないと思うので、

  • 本を買う
  • 英語サイトを回る

のどちらかになると思います。

本ですが、ぼくが勉強しはじめたときはcocos2dの日本語書籍はなかったので、
がんばって洋書と英語サイトで勉強していました。

Cocos2d for Iphone 0.99 Beginner's Guide

Cocos2d for Iphone 0.99 Beginner's Guide


今は日本語書籍もでています。

cocos2dで作る iPhone&iPadゲームプログラミング

cocos2dで作る iPhone&iPadゲームプログラミング

後者の本はぼくは持っていませんが、ちょっと読んだ限り、簡単なゲームをつくるためなら十分すぎる内容がつまっていると思います。


大変だったこと

正直、必要以上に苦労した記憶は、ほぼありません。


もちろん、相応に面倒だったり大変だったりしたことはありますが、まあそれはiPhoneゲーならではというわけではないし。まあ、規模が大きくなるとメモリやパフォーマンスとの戦いがはじまるのは間違い無いですが、そんな規模でもないですし。


あ、最初に実機転送するときとかは、けっこう手こずりました。その辺は、ググれはたくさん情報があります。


あ、あと、一番たいへんだったのは、最後に公開するためにAppleに送るバイナリをつくるための、申請用ビルドだったかもしれません。

手順通りになんどビルドしてもうまくいかず、発狂寸前にまで追い込まれた後、最終的にこちらを参考したらうまくいきました。
http://iphone.longearth.net/2009/02/03/%E3%80%90iphone%E3%80%91app-store%E7%94%B3%E8%AB%8B%E7%94%A8%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B/


「うまくいかないときは、いったん設定を開発用にもどした上でビルドして、クリーンして、再起動して、また申請用の設定にしてビルドしてみてね」という感じです。ほんまかいなと思いつつやってみたら、一発で見事うまくいきました。びっくりですね。ふざけんな。


あとこれはiPhoneゲー特有の話ではありませんが、「あ、やっぱこのグラフィック必要だった!」みたいなことがいつもより多めに発生してしまいました(特に動画)。いろいろ臨機応変に担当していただいたグラフィック担当のつとうさんに感謝します。

小さい画面内での配置

PCゲーに比べて、iPhoneゲーで使えるのは狭い画面領域です。この領域に必要なパーツを配置して、操作に迷わせないようにすることを考えるのは楽しかったですね。この辺は、グラフィック担当のつとうさんにもいろいろご協力いただきつつ、調整しています。


タイトル画面は、とにかく一番重要なPLAYボタンを別格扱いするのと、押したときのフィードバックとしてちょっと小気味の良い効果を発生させました。


他のボタンはそれぞれ、音楽変更、ランキング、動画、ヘルプですが、これらは補助なので、まずPlayを押すという操作に迷わなければOKです。










ゲームプレイ時は、以下のように持って遊びます。

  • 片手で持って、同じ手の親指で操作
  • 片手で持って、もう片手の人差し指で操作

特に「iPhone縦持ち」「片手でも快適に操作できる」ことを重視して配置しました。個人的にiPhoneを横持ちにしてゲームするのはいまいちしっくりこないことが多のですが、なにより縦持ちのほうが気軽に起動して遊びやすいと考えています。


そんなわけで、本作は縦持ち片手操作ができるため、歩きながらカジュアルに起動してあそぶことができます。歩きながらゲームを遊んでは絶対にいけません。


まあ、すごい画期的なUIとかはないので、完成した配置だけ見るとなんてことはないと思いますが、初見でも難なく操作できる、空気のような、なんてことないUIだと感じてもらえれば成功だと考えています。


操作性

この辺も、調整するのは楽しかったです。


自分自身もiPhoneユーザなだけに、タッチパネルで快適な操作ができるように調整していくのは楽しいものです。


操作方法ですが、つくる前から「タッチして、指をうごかすと回転!」という脳内プレイはうまくいっていたので、その通りに実装してみたらだいたいうまくいきました。


ただ「つくってうごかしてみないと、わからないこと」というものは必ずでるもので、そのへんは作りながら調整しました。

縦スライド操作の排除

もともとは、

  • 右または上スワイプ:時計回り
  • 左または下スワイプ:反時計回り

という操作にする予定だったのですが、実装してみた結果、縦スライド操作は排除することにしました。というのは、横スライドしたつもりなのに縦スライドを検知して、結果意図しない方に回転するという誤爆がかなり発生するんですね。


スワイプする必要がある距離はかなり短めに(数ドット)調整してあるので、かなり敏感に反応してしまうのです。


加えて、縦スワイプをなくしたのは、操作をシンプルにするために選択肢を減らしたかったという理由もあります。「どっちにスライドすればどっち回転するのか」というのは、どちらでも成り立つ感覚的な話なので、まずは覚える必要があります。ここに、左右スライドに加えて上下スライドもあると、おぼえることが増えてしまうのですね。できる操作が増えるわけでもないのに。


そんなこんなもあり、縦スライドは排除しました。まあこういう試行錯誤はわりと楽しいものです。

消去演出中のタッチ

これ、文字で説明するのがけっこう難しいので、つたわるかどうか不安なのですが。


このゲームはアクティブ連鎖みたいな要素はないので、ブロック消去演出中に画面をタッチしても、なにもおこりません。


とはいえ単純に「ブロック消去中はタッチ判定無効」にすると、消去演出中にタッチして、そのまま消去演出がおわったあともタッチしたままでも、ずっと無反応のままです。つまり、消去演出中にタッチしてしまうと、いったん指を離した上で改めてタッチしないと、反応してくれないのです。


これだとけっこう操作しづらいので、「消去演出中にタッチして、そのまま待ち続けた場合、消去演出中終了と同時にタッチされたと判定される。そのまま指をスライドすると、回転できる」てな具合に調整してみました。


文字で説明するとややこしいですが、つたわりますかね。
などなど、このへんのタッチパネルな操作性を調整するのは、なかなか楽しかったですね。



操作感UPの案

現状は、タッチしたあと指をうごした距離があるドット数を超えるまではなにも起こらず、超えるといきなり回転します。


ここを、しきい値をこえるまでは、ブロックが指にはりついてきたほうが操作感が良いのではないか、ということを@Antouchableさんからご指摘をうけました。


この点気が回っていなかったのですが、このほうがiPhoneっぽいし、なるほど!と思いました。


そんなわけで、この点は次期バージョンで対応するかもしれません。


やはりこういうところまで、気を配っていきたいものですね。


開発をはじめるにあたり乗り越えるべき壁とか必要なお金とか

いきなり準備についての項目になりますが、しかも準備なのに後ろのほうに置いてますが、憂鬱な話なのでわざと後ろに回しています。


iPhoneゲー開発をはじめるにあたり、多くの人にとっての金銭的&精神的な大きなハードルは、以下の3点ではないかと感じています。

  • 1.Mac
  • 2.年間8,400円のiOS Developer Program
  • 3.Objective-Cをおぼえる

前述しましたが、3.はわりとすぐ慣れると思います。


それなりにお金がかかってしまう1.と2.がしんどいですね。


Macは、私はいまから1世代前のMacBook Airで開発していました(core2duoのやつ)

MacBook Air買うにあたって「iPhoneゲー開発って、ノートPCでいいのかな…?」と不安だったのですが、性能面で困ったことはなく、非常に快適でした。

MacをiPhoneゲー開発のためだけに買うのはしんどいかもしれませんが、前からMacBook Airが気になってるような方には、MBA買ついでに開発したろうかな、と多少は最初の一歩が軽くなるかもしれません。

で、85円で儲かるのか?

まだ儲かっていません。


そもそもぼくの本職はフリーゲーム制作で、このゲームもまあ無料で良かったのですが、前述のとおりiPhoneアプリは、配布するだけで年間8,400円かかります。


さすがに配布しているだけでお金を消費するのはしんどい。といってゲーム内に広告いれるのはかなり嫌だったので、85円設定にさせていただいています。なお、開発者に入るのはこのうち7割なので、1本60円くらいが入ります。


また年間8,400円以外にも、Macやら人件費やら喫茶店で作業するときのコーヒー代やらでもろもろ金はかかるもので、そのもろもろの費用を埋めるほどの利益はまだ得られていませんが、まあ趣味ですしいつかトントンくらいになるといいですね。


iPhoneノベルゲーム用エンジン

Artemis Engine(アルテミスエンジン)をご存知でしょうか?

iPhoneノベルゲームもつくれるエンジンです。

私自身はつかったことはないのですが、開発者の方に直接お話をきいたりマニュアルを見せていただく機会があり、かなりすごそうでした。

ノベルゲームを作る方は、ためしてみたらいかがでしょうか。


つくれるのはiPhoneノベルゲーム「も」であり、マルチプラットフォームAndroid, Windowにも対応しています。

同一のスクリプトが、Android, Windows, iPhoneで動くそうです。すごくないですか?

http://www.ies-net.com/?page_id=24




再度まとめ

そんなわけで、iPhoneゲー開発は楽しいので、みんなやればいいのではないでしょうか。