5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

『cocos2d-xではじめるスマートフォンゲーム開発』という本を出版します

本出すぞ!!!

こんにちは。[Twitter:@giginet]です。なぜか「本書かない?」って言われて、気付いたら本を出版していた

この度、『cocos2d-xではじめるスマートフォンゲーム開発 [cocos2d-x Ver.3対応] for iOS/Android 』という本を書かせて頂くことになりました。

どんな本?

f:id:gigi-net:20141126170405j:plain

cocos2d-x」というゲームフレームワークの入門書です。

cocos2d-x を使ってiOSAndroid向けのゲーム3本を開発します。

本書は入門書の位置づけなので、「プログラミングの心得はあるけど、ゲーム開発・スマートフォン開発は全くの素人!」という方でもいろいろなゲームを実装できるように執筆したつもりです。 少しでも興味のある方はお手にとって頂ければ。

もちろん、すでにcocos2d-xを触っているという方にとっても、最新機能を多数紹介しているほか、ADX2 LEやSpriteStudioなど、外部ツールの使い方や情報が書かれていたりと、新たな発見が多い内容になっていると思います。

技術評論社さんから発行されます。お店に並ぶ時期は12月下旬になりそうです。表紙はただいま準備中です。

セールスポイント

cocos2d-xに対応した本は、すでに国内でも5冊ほど出ているのですが、本書は他のどの書籍とも違った物に仕上がりました!セールスポイントをご紹介します。

最新環境のcocos2d-x 3.2にしっかり対応。最新機能も紹介!

現在(2014/11)の最新の安定版である「cocos2d-x 3.2」を前提に執筆しています。

cocos2d-xは2.x系と3.x系で全く別物といって良いほど大きく変わっており、今から始めるには最新バージョンがオススメ!

現在売られている本のうち、3.0以上のバージョンに対応している物はごくわずかなので、新しく始める方にはうってつけの内容になっています。

ただ新しいバージョンを使っているだけではなく、cocos2d-x 3.0で使い方が変わった物理エンジンや文字描画、新機能の3D描画機能なども扱っています。

C++11やメモリ管理、フレームワークの設計など、基本的な部分をしっかり解説

C++11の機能のうち、lambda型推論enumなど、cocos2d-xでよく使われる機能のいくつかを紹介しています。

また、cocos2d-xの初学者にとって躓きやすい点であると思われるリファレンスカウンタ方式のメモリ管理の概念についても図入りで詳しく説明しています。

f:id:gigi-net:20141126181424j:plain

ノードツリーやシーンスタックなど、ゲームエンジンの仕組みも図解。初学者にもわかりやすい説明を心がけています。

f:id:gigi-net:20141126181525j:plain

f:id:gigi-net:20141126181503j:plain

ゲームアルゴリズムや、レベルデザインについても基礎知識を紹介

今回、本の執筆を頼まれたとき「せっかく書籍を書くのだから、長く使える知識を伝えたい」と感じました。 そういった思いから、アルゴリズムやゲームのレベルデザインと言った普遍的な知識をなるべく詰め込みました。

f:id:gigi-net:20141126174550j:plain

この書籍で得た知識がcocos2d-xに限らず、幅広いゲーム開発の役に立てば幸いです。

Mac/Windows両対応、iOS/Androidどちらのゲームも実装できる!

主流となるMacでのXcode + iOSでの開発はもちろん、Windows/Mac両方の環境でのAndroid版の環境構築方法も紹介しています。

iOS/Android対応のサンプルゲーム付属

今回開発したサンプルゲーム3本は全てApp Store/Google Playで配信中!ゲーム実装前に遊んで確認できます。

今回実装したゲームはプチゲームの『かわずたんキャッチ!』、物理エンジンアクションの『かわずたんジェット!』、アクションパズルの『かわずたんクラッシュ!』の3本です。

f:id:gigi-net:20141126181047p:plain

https://itunes.apple.com/jp/app/kawazutankyatchi!/id922375875?mt=8&uo=4&at=10l8JW&ct=hatenablog

f:id:gigi-net:20141126181101p:plain

https://itunes.apple.com/jp/app/kawazutanjetto!/id922471335?mt=8&uo=4&at=10l8JW&ct=hatenablog

f:id:gigi-net:20141126181116p:plain

https://itunes.apple.com/jp/app/kawazutankurasshu!/id930486794?mt=8&uo=4&at=10l8JW&ct=hatenablog

自分のゲームに組み込めるサンプル素材が多数付属

上述のサンプルゲームに利用されている素材は全て配付。学習に使って頂くのはもちろん、クリエイティブ・コモンズ(CC BY-NC-SA)として配付するため、ご自分の作品にも使って頂けます。

グラフィック素材だけでなく、BGMやSEなどの素材ももちろん付属。音素材は他のゲームにも使いやすいかと。

これ1冊で即座にゲーム開発が始められる!

f:id:gigi-net:20141126175730p:plain

f:id:gigi-net:20141126174957p:plain

https://dl.dropboxusercontent.com/u/151624/blog/main.mp3:sound

https://dl.dropboxusercontent.com/u/151624/blog/title.mp3:sound

「CRI ADX2 LE」の使い方を徹底解説

f:id:gigi-net:20130212222447j:plain

CRI・ミドルウェアさんの全面協力により、11月14日に配布開始されたばかりのオーディオライブラリ『ADX2 LE for cocos2d-x』の使い方の詳しい解説が実現しました!

CRI ADX2 LE - CRI Middleware

f:id:gigi-net:20141126175843p:plain

本書では、無料で使える『ADX2 LE』を使って、cocos2d-xだけでは実現が難しい以下のような機能について解説を行っています。

  • ADX2 LEの組み込み(iOS/Android
  • イントロ付きループの作成
  • ゲーム変数による効果音の分岐
  • ADX2 LEの情報を入手する方法
  • その他機能の紹介(ダッキング、ブロック再生ほか)

音周りが弱いと言われるcocos2d-xですが、この本があればもう安心。

ちなみにADX2 LEについて扱った本は、現状もう1冊だけ。cocos2d-x対応版は本書が初!ここでしか得られない情報が得られます。

SpriteStudio for Indieにも対応

f:id:gigi-net:20141126174629j:plain

ウェブテクノロジさんのご協力により、2Dアニメーション製作ツール『SpriteStudio for Indie』の使い方、cocos2d-xへの組み込み方も解説。

f:id:gigi-net:20141126180051p:plain

インディーゲームでの2Dスプライトアニメーション作成に OPTPiX SpriteStudio for Indie | ウェブテクノロジ

cocos2d-xの標準機能だけでは難しい高度なアニメーションも無料で作成できてしまうノウハウが得られます!

その他外部ツールを多数紹介!

  • GUIで簡単に画面を設計できる『Cocos Studio』(1.6)
  • 綺麗なエフェクトを簡単に実現する様々なパーティクル生成ツール
  • マップ作成を簡単に行える『Tiled Map Editor』

f:id:gigi-net:20141126180819j:plain

f:id:gigi-net:20141126180753j:plain

などのツールの解説をしています。

また、画像加工やアニメーション製作、デバッグ効率化など、ゲーム製作に役に立つ30以上のツール類を幅広く紹介しています。

f:id:gigi-net:20141126180645p:plain

ソースコードシンタックスハイライトがめっちゃ見やすい

見やすい!

f:id:gigi-net:20141126180629p:plain

せっかくフルカラーなので無理言ってシンタックスハイライトに対応して貰いました。

基本的にGitHubのdiff形式やC++シンタックスハイライトに近い物になっているため、見やすいし目に優しい!

お値打ち価格で大ボリュームのフルカラー360ページ超!

フルカラー360ページ超という分量ながら、お値段は2980円(税別)!

原価にどれぐらいかかってるかとか、そういう話は全くわからないんですが、結構凄い価格設定だと思います。

内容については、浅く広く網羅されています。

実を言うと、編集部から特に分量の指定がなく、書きたいだけ書いてたらいつのまにかこの分量になっていたという。

分量が多すぎて、校正さんには大分ご迷惑をかけたようですが、編集さんのおかげもあってこの価格が実現できました!


こんな感じで製作に便利な情報を片っ端から詰め込んだつもりです。手前味噌ですが、メチャクチャお買い得だと思います。

全体的に、お金をかけずにできるゲーム開発というコンセプトを打ち出しており、他にはないインディー感とか、独自色を出せたかと。

今すぐAmazonへGO!!!

既に予約が始まっていますので、買ってくれると僕が凄く喜びます。

発売は12月下旬の予定ですので、今のうちに予約しておいて、年末年始はゲーム開発に挑戦してみると良いと思います。

前述の通り、全くの素人でも興味があれば挑戦できる内容だと思っておりますので是非この機会に。

まだ表紙の用意ができておらず、目立たずに申し訳ないのですが、書店にも並ぶと思います。見かけた際はぜひともよろしくお願いします。

製作秘話

初めて書籍の執筆という物に挑戦してみて、多くの発見がありました。

とにかく大変だった上に、僕が書いていいんだろうかとか、間違いがあったらどうしようとか、伝わらなかったらどうしようとか、常にビクビクしながら書いていました。

作業フローも、技術書の出版では一般的になってきたGitHubフローを取り入れたり、サンプルゲームの実装も普段のゲーム開発と全くセオリーが違ったりと技術書執筆ならではノウハウがいろいろと貯まりました。

また、執筆中にcocos2d-xがアップデートしまくったり、YosemiteやiOS8が出たり、iPhoneの解像度が変わったりとイヤな事件もいろいろ起きて苦労したので、その辺のお話もできたらなあと思います。

まだ出版まで一ヶ月ほどあるので、これらの話は無事に出版できたらまたブログ記事を書きたいと思います。お楽しみに!

#yapcramen でOSSとラーメン屋に貢献した

id:astjさんから #yapcramen のご指名を頂いた。

#yapcramen

OSS の認知向上とコントリビュートの促進を目指して、次のようなプロジェクトを発案。

ラーメンを食べるか、OSS に貢献する。もしくは両方を行う。
結果は、twitter や facebook に投稿する。
投稿の際は「ラーメンを食べるか、OSS に貢献する」と一文を添える
ラーメン食べたらラーメンの写真をあげる
コミットしたらそれへのリンクなどを掲載
ハッシュタグは #yapcramen
そして、次のチャレンジャーを 3 名指名する。

bayashi.net

こういうことらしい。

頭から氷水を被ったり、$100もの大金を差し出さなくても世の中に貢献できるのは良いことだと思ったので挑戦してみました。

OSSに貢献してみた

PRを3つほど送ってみた。YAPCから発生したイベントであるため、必然的にWeb系の人が多くなりがち。ゲームエンジンにコミットする人は珍しそう。

cocos2d-x

f:id:gigi-net:20140910214944p:plain

SceneReader sets contentSize by canvasSize. by giginet · Pull Request #7979 · cocos2d/cocos2d-x · GitHub

前回のPR同様に、またもやCocosStudioの機能改善。今度はSceneReaderから読み込んだnodeからキャンバスサイズが取れるようにしてみた。

CocosStudioが使いにくかったからcocos2d-xにPull Request送った話 - 5.1さらうどん

SpriteStudio

SpriteStudioという、ゲーム用のアニメーション作成ツールがあるのだが、それのcocos2d-x対応版にいろいろと問題点が多かったので勝手に直してPRした。

Ss5Converter_Macを追加した by giginet · Pull Request #26 · SpriteStudio/SpriteStudio5-SDK

BYTE型をGLubyte型に変更した by giginet · Pull Request #27 · SpriteStudio/SpriteStudio5-SDK

普通に配付されていたのにMac版でビルドが通らなかったり、Mac版のコンバーターが配付されていなかったりしたので対応した。

ラーメンも食べてみた

そのあと、ラーメンも食べてきた。

f:id:gigi-net:20140910194636j:plain

らーめんときの家 札幌駅北口ヨドバシ店 - 札幌/ラーメン [食べログ]

札幌ヨドバシカメラの横にあるラーメン屋さん。いつもこの辺では「ばりきや」で博多ラーメンを食べるので初めて入った。注文したのは九条ネギラーメン。美味かった。

次の指名

3人指名しないとダメらしいので、知り合いのプログラマを3名。

[twitter:@lambdalisue], [twitter:@ayako119], [twitter:@ww24]

時間があればお願いします。

YAPC Ramen Graph

f:id:gigi-net:20140910215635j:plain

食用ではありません

Twitterのつぶやきを取得して自動的にグラフにしてくれる奴があった。大体見たことあるアイコンが並んでる気がする。

CocosStudioが使いにくかったからcocos2d-xにPull Request送った話

cocos2d-xにPR送った

f:id:gigi-net:20140829182816j:plain

Add the feature that CCSSceneReader can load name properties as node names. by giginet · Pull Request #7883 · cocos2d/cocos2d-x

無事に通った、めでたい

何が良くなったか

PRを送ったのは、『CocosStudio』で作成したシーンをcocostudio::SceneReaderで読み込んだときの挙動。

今までは、CocosStudioで作成したシーンプロジェクトを読み込んだとき、その子ノードにアクセスするためには、タグを使ってアクセスする以外の方法がなかった。

auto scene = cocos2d::cocostudio::SceneReader::getInstance()->createNodeWithSceneFile("Scene.json");
// 子ノードを取るにはタグからアクセスする必要があった
auto object = dynamic_cast<cocos2d::Sprite *>(scene->getChildByTag(42));

これは、いちいちタグを定数として定義しておいたりしないといけなくて見通しが悪く、使いづらい。

しかし、CocosStudioには各ノードに対してnameを付ける機能が存在する。

f:id:gigi-net:20140829184534j:plain

現状の実装では、nameが出力されるシーンファイルには書き出されているが、ノードとして読み込む際に、特にどこにも設定されずに捨てられていた。

一方、cocos2d-x 3.2からは、Nodeに名前を付けることができるようになっていて、名前から子ノードが取り出せるAPIが提供された。

cocos2d-x: Node Class Reference

というわけで、このname属性をそのままNode::nameとして利用できるようにしたという話。

auto scene = cocos2d::cocostudio::SceneReader::getInstance()->createNodeWithSceneFile("Scene.json");
// CocosStudio上で設定したname属性からアクセスできるようになった!(ついでにテンプレートも使えるようになった!)
auto object = scene->getChildByName<cocos2d::Sprite *>("objectName");

一方でGUIReaderの場合は

Node::nameプロパティはcocos2d-x 3.2から追加された新しいプロパティなので、対応が追いついていなかったのではないか、という好意的解釈もできるが、以下の点について説明が付かない。

SceneReaderと似た機能に、cocostudio::GUIReaderというクラスもある。

これは、CocosStudioのシーンプロジェクトではなく、UIプロジェクトをノードとして読み込むクラス。

しかし、似たような機能を持つGUIReaderでは、Widgetを読み込むときにちゃんとname属性を読んで名前からアクセスできるようになっていた。なぜなのか。(バージョン3.2で確認)

cocos2d-x/CCSGUIReader.cpp at 2210d1fe87c3dd7d2ce79d01945b85a0de24862d · cocos2d/cocos2d-x

// Widgetを読み込む
auto widget = cocostudio::GUIReader::getInstance()->widgetFromJsonFile("Widget.json");
// ラベルのノードを取り出す
auto atlas = widget->getChildByName<ui::TextAtlas *>("AtlasLabel");

cocos2d-xヤバい

前回と同じ結論だけど、使えば使うほど闇っぽい。

今回は似たような機能なのに、両者間で微妙に仕様が違うと言ったことが起きていた。

name属性を引き継ぐかどうか、という話もそうだし、getChildByNameはテンプレートが利用できるのに、getChildByTagはなぜかテンプレートが利用できない点とか。

何か、GitHub覗いてる感じ、来たお便利機能のPRを片っ端からマージしてるみたいな感じで、ロードマップとかあるのかなあと疑問に思ってしまう。

とはいえ、日々送りつけられ続ける大量のPull Requestをしっかりレビューして、保守管理しているデベロッパーさんには頭が上がらない。

次回予告

あと何個かネタがあるので気が向いたらPRを送りたい。バグ修正だけじゃなくて、「ぼくのかんがえた最強のAPI」みたいな感じで欲しいモノ作って送ってもちゃんと見てくれてる感じがあるので、どんどん貢献していきたいところですね。