cocos2d : 弾幕ゲーム – あたり判定

あたり判定を付けてみた

弾が自機に当たると点滅します。iOSシミュレータだから30fpsしかでていませんが、
私の古いiPodTouchでも60fpsでています。

あたり判定に利用する「弾」と「自機のコア」は丸いので2点間の距離を利用して
衝突を調べます。ググると2点間の距離を利用したあたり判定はマイナーみたい。
負荷は低いけれど丸いもの同士にしか利用できないからかな?
→参考:google検索「cocos2d 当たり判定」
2点間の距離を取得するgetDistanceを利用したのですが、検索すると日本のページが
ほとんど無い…。やっぱりマイナーなのかな。
→参考:google検索「cocos2d getDistance」
 

弾を別クラスで

moveToで弾を移動させる方法は簡単ですが、複雑な弾道には向かないので弾のクラスを
作成することにしました。参考になったのは以下のサイト。ソースがGitHubにあるので
とても参考になりました。必要最低限のシンプルなソースなので理解しやすいです。
→参考:Cocos2d-x v3.2を利用してシューティングゲームを作ろう!
→参考:上記サイトのgithubのソース

Flashでなじみの構成に

上記のソースでは弾を作成するBulletクラスを作成しています。これはスプライトを
継承したクラスでFlashのムービークリップに近いものです。cocos2d公式サイトの
記事もそうですが、ゲーム作成を説明する多くのサイトではシンプルなゲームを
題材にしており、そのためが弾クラスの例がありませんでした。だから、
このサイトにはとても感謝なのです。

RemoveSelf

自分自身を削除するアクションがあるのですね(Bullet.cppの17行目)。
→参考:アクション終了後にスプライトを削除する
私は弾の移動にActionを利用しなかったので利用できませんがメモ。

NULLとnullptr

Bullet.cppの18行目のSequenceでNULLではなくnullptrというのを利用しているので
調べてみた。良く分からないけれどメモ。
→参考:NULLとnullptrって何が違う?

thisの省略

Flashでもthisは省略できますがcocos2dでも可能なのですね(Bullet.cppの17行目)。
thisを付けても機能しました(this->runAction(seq);)。
 

メモ

他にも参考になりそうなサイトをメモ。

updateでまとめて判定するサンプル

すでに非推奨ドキュメントとなっているcocos2d公式のチュートリアルでは弾と敵を
配列に格納しupdateのタイミングであたり判定をしています。クラスを作成する必要が
なく初心者向けで、シンプルなゲームはこの仕組みで充分なのだと思います。
→参考:Chapter 5 – How to Detect the Collisions

衝突判定の高速化

より高度なあたり判定の記事も見つけたのでメモ。多数vs多数のような負荷の
高い処理に活用するテクニックだと思います。私が作成する弾を避けるだけのゲームでは
恩恵は少ないのですが、1999年リリースのCD-ROMコンテンツで疑似3D空間を歩き回る
コンテンツを作成した際に似たような仕組みを利用しました。
当時のPCは非力だったので、こういう処理が必要だったのです。
→参考:cocos2d-xでSTGを作るために(当たり判定編)

cocos2d : 脳トレ15パズル – リジェクトされる(2)

1日で返信が来た

先日リジェクトに対して返信したのですが本日返答を貰いました。
大体の内容は以下の通り。
※新しいビルドを送ったら返信が読めなくなったので記憶の範囲で書いています。
———————————————————————
ありがとう。キミの言っていることは確認したよ。
でも新たな問題を見つけたんだ。問題についてはガイドラインの2.25を
参照してくれ。具体的にはキミが前回送ってくれたスクリーンショットが
問題なんだ。
bt15_ad_screenshot
———————————————————————
ということで「3.3.12」の問題はクリアできましたが「2.25」で引っかかりました…。
この2.25も検索すると、最近の記事がたくさん出てきます。
→参考:google検索「apple reject 2.25」
 

根本の問題

ガイドラインでは直接的な言葉はありませんが、2.25は不正にランキングが
操作されるのを防ぐ施策の一環のようです。なので問題の根源はリワード広告
なのでしょう(以前から禁止されていましたが厳格化したようです)。
→参考:Appleのアプリ内広告などに関する規約厳格化の続報。
 
ランキングはアプリのダウンロード数に応じて表示されており、そこで広告会社は
ダウンロードしたら報酬を得られるような広告(リワード広告)の仕組みを作りました。
しかし、それによって「ランキングがお金で買える」状態になってしまっている
ことをAppleは防ぎたいようです。
 
そうするとあらゆる広告に嫌疑がかかるわけで、ググった結果には「アイコン広告」
「ウォール広告」「メニュー型広告」などで「リワード広告にかかわらず」リジェクト
されたと報告が上がっています。
でもって私の添付したスクリーンショットもアプリのダウンロードを促しているわけで
リジェクトされたのではと思われます。実際はタップした方に利益が行く広告ではない
のでリワード広告ではないと思うのですが、ダメみたいです。

巷での対策は

色々なサイトでの対応を見ると。以下の様な感じ。
・広告を削除して申請。バージョンアップ時の審査は緩いようなので、このときに
 広告を追加。
・再申請したら通った。他のリジェクトでも結構あるようで審査する方/チームに
 よっては審査が通るようです。
・UIwebviewを利用してhtml用の広告を表示。
 →参考:最近のiOS、iPhoneアプリ規約変更と増えてきた2.25リジェクト
 

表示する広告を絞りました

私が利用しているNendには特定のカテゴリの広告をブロックする仕組みがあります。
そして表示される広告候補を確認する機能があります。そこでリジェクトされそうな
要素(アプリのインストール、金額の表現、アダルト)のないカテゴリを調べました。
意外なことに「結婚」が一番無難そう。ということで以下の様にブロック設定。
スクリーンショット 2014-09-26 18.04.15
でも上記の設定は「問題のありそうなカテゴリ」についての操作でしかなく
アプリの広告は表示されてしまう。なのでNendにappleが規制の対象にしている
「アプリインストール」のカテゴリも作って欲しいとメールしました。
 
ついでにアプリをビルドし直しました。以前Admobに挑戦して挫折しましたが、
いつか再挑戦するため削除せずにそのままFrameworkを残していたのですが、
これを綺麗に削除しました。
あと今までLEVEL3以上でミスした時にしか広告を出さなかったのですが、
ミスした時は無条件に広告を出すようにしました。そして同じ轍を踏まないように、
審査メモに「ゲームオーバー時に広告を出してます」と明記。
スクリーンショット 2014-09-26 17.26.10
これでダメだったら、他の方のように広告なしで申請して、バージョンアップ時に
広告を付ける方向で行きたいと思います。
 
 
 

cocos2d : 脳トレ15パズル – リジェクトされる

広告表示してないじゃん

リジェクトされた理由は「PLA 3.3.12」で、ググるとたくさん出てくる。
→参考:google検索「apple アプリ 審査 ”3.3.12″」
スクリーンショット 2014-09-25 17.54.42

こういう理解でOKかな?

Appleではアプリの審査が厳しく端末から情報を取得するようなアプリは基本的に
認められていない。しかし広告を表示する仕組みは、最適な広告を表示するために
端末情報にアクセスする必要があり、appleもそれは認めている(そのかわり
きちんと申請しないといけない)。
 
しかし広告利用(IDFA)の申請をしていながら広告を表示していないと
広告の代わりに「何か良からぬ事」で情報を取得しているのか?と疑われる。
その結果、申請にリジェクト。
 

とりあえずの対処

たぶん今回初めて導入したインターステイシャル広告が理由だと思う。
私はゲームオーバーのタイミングで広告を出すようにしているのですが
LEVEL3以下の場合は表示しないようにしています。なので、アプリを起動
しただけでは広告に気が付くことはありません。
ということでリジェクトの返信に。以下の様なニュアンスの英語を返信。
————————————————————-
このアプリはゲームオーバー時に広告を表示しています。
ただしLEVEL3に達しなかった場合には広告は表示されません。
なので再審査をお願いします。
※広告のスクリーンショットを添付
————————————————————-
ググると、もしこれでOKなら翌日にも審査が通らしい。
 
 
 

cocos2d : 弾幕ゲーム – 操作(2)

ボタンは3つに

思い切ってボタンを3つに減らした(上下とジェットボタン)。ジェットボタンをタップ
している間は右に進むけれど、離すと左に戻されていきます。前回のUIでは移動速度別に
ボタンを用意しましたが、それが操作を複雑にする要因にもなっているので廃止しました。

ボツ案

移動ボタンは上下左右がイメージしやすいように配置しています。そして速度切替を諦め
られなかったのでスピードを切り替えるボタンが追加されています。プログラムを組む前に
「本当にこれでよいの?」とシミュレーション。やっぱり複雑すぎるよね…。と却下。
butsu
 

メモ

操作以外で学んだ事をメモ。

スプライトのサイズは偶数に

Flashと異なりcocos2dではスプライトの基準点は中心になる。なので大きさが奇数だと
配置位置が少数座標となり画像が歪んでしまう。ということでスプライトの大きさは偶数に。

配列の要素数を取得

C++ではサイズが固定されている配列には要素数を取得する必要は無いとみなされているのか
デフォルトでは用意されていない(javaScriptのlengthのようなものはない)。
→参考:C++で静的配列の要素数を求めるテンプレート関数
 
UIの微調整はすると思いますが、基本方針は今回ので決定。次回からは弾を別のクラス
で作成する事に挑戦しようと思います。
 
 
 

cocos2d : 弾幕ゲーム – 操作

ドラッグで操作するのは苦手なのです

スマホのシューティングゲームで良くある操作方法はドラッグによるものです。
私はこの操作があまり好きではないので別の操作を採用したいと思います。
 
iOS用の弾幕ゲームは初心者向けのものもあり、そのようなものはボタンを
採用しています。ドラッグよりは私好みなのですが、ボタンでは別のボタンを
タップする時に、ボタンから一度手を離さなければなりません。つまり
隣り合ったボタン上でスワイプしてもボタンが操作されないのです。
 

スワイプできるボタン

ということで隣接したボタン上でスワイプしても移動が切り替わるような操作にしたい
と思います。以下の動画では、タップすると黄色い印が付くようになっています。
「タップしたまま他のボタンに入ってもボタンが機能する」のがポイントです。
 

 
 

不採用!

iPhoneを横に持って親指が届く範囲に上下左右のボタンをレイアウトしました。
変なレイアウトですが「すぐに慣れるのでは?」と思っていたのです。が…
ちっとも慣れません。あと真ん中の部分はニュートラルとして機能しないエリアを
用意したのですが、これも邪魔。指を離せば自機は止まるので必要ない。
ということで、このUIはボツ!

日曜日をすべて使ったのに…

シンプルなインターフェイスに見えますが、制作にすごく時間がかかりました。
そもそもスワイプしてもボタンが反応するようにするためにはcocosのMenuは
利用できません。だから画面全体のタッチポイントを管理して実現したのです。
 
以下のサイトが参考になりました。でも面倒なのでタッチポイントは2つまでしか
利用せず3つ目以降は無視するようにしました。
→参考:Cocos2d-xのマルチタッチの開発 その1
 

その他メモ

操作については1年以上前から考えていました。以下のページは過去のブログ記事で、
ドラッグ距離によって速度を変更するタイプのUIです。
→参考:iOS:スワイプによる移動、そして…

マルチタッチ

マルチタッチについては以下のサイトも参考になりました。ios/AppController.mmを
編集してマルチタッチを有効にすることを忘れずに!
→参考:マルチタッチ::cocos2d-x v3.1.1

連想配列

ボタンの数が8つあるので管理しやすいようにjsのobjectオブジェクトのようなものが
使いたかった。調べたらMapという仕組みを利用することが判明
→参考:Cocos2d-x パズルゲーム編 其の一 cocos2d::Mapとstd::mapを使ってみる

CCLOGでstringを

CCLOGでstringを確認したい時はc_str()を利用しないといけない。
→参考:Cocos2d-x:CCStringからの文字列の抽出
 
あぁ、どんなインターフェイスが操作しやすいのかなぁ。
 
 
 

cocos2d : 弾幕ゲーム – 事始め

弾をよけるだけのゲーム

折角のcocos2d、jQueryでは作成できないゲームを作りたいと思います。それは沢山のスプライト
を利用する「弾幕ゲーム」です。私はゲームが下手なので弾幕系のゲームをプレイすることは
ないのですが見るのは好きなのです。

上記の動画は720pでみるとソースも確認できますが、意外と少ないコードで実現できました。
これはmoveToのおかげでしょう。 

参考になったサイト

参考になったのは以下のサイト。moveToを利用して弾を移動させ、移動が完了したら
弾を消すようにしています。
→参考:cocos2d-x のアクションのテスト〜弾を飛ばす
弾のように沢山のスプライトを制御するのには向かないけれど、
マルチタッチを利用した自機の操作などはscheduleとupdateを使う予定。
→参考:schedule(ルート)を利用する
 

複雑な弾道を実現するには

moveToを利用した弾はシンプルに記述できますが、ホーミング弾のような少しずつ
軌跡を変更するようなことは実現できません。そのような弾を実現するには
弾のクラスを作成するのだと思います。以下のサイトが役に立ちそうなのでメモ。
→参考:【cocos2d】弾を撃ってみた
 

その他

今回は参考にしませんでしたがメモ。公式のチュートリアルですが古いので非推奨の
ドキュメントに分類されています(新しいのは無いみたい)。
→参考:Step by Step Cocos2dxSimpleGame Series
→参考:Cocos2d-x勉強_弾を撃つよ

 

新しくなったiTunes Conect

脳トレ15パズルを申請した

cocos2dで作成したアプリを申請するのは今回が初めて。それだけでも大変なのに
iTunesConnectも新しくなっていて、よけい時間がかかった…。
スクリーンショット 2014-09-17 0.43.32
 

iTunesConectが新しくなった

ちょっと前にiTunes Conectがリニューアルされています。ところどころ古いフォーマットが
残っていてデザインがチグハグになっていますが、日本語対応(古いところは英語のママ)
してくれました。ビルドしたファイルをiTunesConect上で選択する項目が増えています。
→参考:刷新されたiTunes Connectでのアプリのアップデートがややこしいですが…
既存のアプリを更新するのも色々と厄介そうなので時間のある時に経験しておこうと思います。
練金パズル2048のコレクションページのレイアウトが微妙にずれているのです。

iTunseConectとxcodeの連携

アプリを申請する際はIdentifiresをDeveloperサイトで作成しなくてはならなかったのですが
xcodeが勝手に行ってくれるようになりました。以下の図の一番下が今回のアプリ
(brain training 15puzzleだからbt15)ですがXcode iOS App IDと頭に付いています。
スクリーンショット-2014-09-17-0.25
 
あとProvisioningProfileというのがあって、これは開発用(Development)と
リリース用(Distribution)があるのですが、開発用のProvisioningProfileにも
色々と自動で追加されています(アプリの数だけ)。iOS Teamと先頭に記述されているので
チーム開発用の機能でしょうか?ちなみにいつも利用していた開発用のProvisioningProfileは
一番下の「test id for iOS6」で、開発用は全アプリ共通してこれ1つでOKでした。
スクリーンショット 2014-09-17 0.36.26
上記の設定が追加されたのは「TestFlight」のためかもしれません。
何やらテスターの管理がiTunesConnect上で行えるらしいです。
→参考:TestFlight が Xcode / iTunes Connect でサポートされました!

ストアiconのアルファ禁止

これまではAppStoreに表示するアイコンは透過PNGで問題なかったのですが、
今回はエラーになりました。アプリのアイコン自体は透過PNGで問題ないのに何故?
スクリーンショットもダメになったそうです。
→参考:iTunesConnect(2014/9) スクリーンショット作成の注意点
 
 

Cocos2dでの躓いた部分

今回はcocos2dを利用した初めての申請で、いろいろ戸惑ったのでメモ。

iOS Deviceが無い!

アプリを申請するためにはアーカイブを作成するのですが、シミュレーターが選択され
ているとアーカイブできません。これまでは以下のような「iOS Device」を選択
していたのですが、cocos2dではこれが表示されません…。
xcodeの仕様が変わったのかな?と以前のアプリを開くと存在しています(下図)。
スクリーンショット 2014-09-17 0.53.09
実機をつなげて実機を選択するとアーカイブを作成する事ができましたが、cocos2dでも
「iOS Device」を表示させたいです。調べたけれど分かりません…。

iPad用のアイコン

cocos2dではデフォルトでiPad用のアイコンが登録されています。このアイコンデータは
フォルダから削除しただけではダメでiconフォルダ内のinfo.plistの記述からも削除
する必要があります。でないとアーカイブをチェック(validate)するときにエラーが
でます。ということでinfo.plistのアイコン部分の記述を修正しました。

iPhone6対応はしていません

9/9にiPhone6(iOS8)に対応したxcode6の正式版がリリースされたのですが、わたしは
1つ前のxcode5.1.1で作業しているため、アプリはiPhone6に対応していません。
そのうちxcode6(iPhone6対応)でないと審査を受けられなくなると思うのですが、
新しくなったiTunesConnectではXcode5.1.1も受け入れているため、たぶん大丈夫。
 
とはいえxcode6をインストールしないと。MacのOSもmarvericksでないとだめなので
こちらもインストールする必要があり結構面倒。
xcode6に移行する時期は問題が一通り洗い出されてからにしようと思います。
→参考:Qiita:xcode6にかんする投稿
 
 

jQueryで作成したアプリのiPhone6対応メモ

これまでのiPhoneはすべてviewportの幅(device-width)が320pxでしたがiPhone6/6+
はことなり375pxと414pxになったそうです。
→参考:iPhone 6 Screens Demystified
 
私が作成したjQueryアプリはviewportの設定がdevice-widthになっているので
iPhone6/6+では画面が余ってしまう状態になるはずです。しかし、これはviewportの幅を
320にするだけで対応できると思う。
 
でもAndroid機の一部のマシンのように320pxに設定できないとなると画面サイズに合わせて
cssのzoomで拡大表示することになる(Androidアプリに採用しています)。
以下のサイトではgalaxy S3ですが私のnexus7も同じ状況です。画面の大きなAndroid機は
viewportの設定を320pxにする事はできないのかも。
→参考:galaxy S3.. viewport meta tag doesn’t work
 
作業用のMacに先行してPowerBookにMarveriksとxcode6をいれて色々検証してみよう。
 
 
 

cocos2d : 多言語対応とtwitterとgame center

基礎力の欠如を感じる今日この頃

勢いだけで学ぶのが難しくなってきた。ネットで検索すると難しい問題の
対処法もでてくるのですが、レベルの高いサイトでは基礎的な事は省略して
説明しているので初心者の私には理解できない部分も多い。
作りたいものを一通り作り終わったらC++の本でも購入して基礎を学ぼうと思う。
でも作りたいアプリのストックは、あと3つある。
 

多言語対応は諦めない

Admobは諦めましたが、多言語対応を諦めたわけではありません。今回のアプリは
アイコンに文字は無いのでアイコンは切り替えませんが、アプリ名は日/英で分けたいのです。

cocos2dのver3ではカンタンに言語環境が取得できる!

昨日頑張ってネイティブ情報の取得に挑戦しましたが、Cocos2d-v3ではカンタンに
言語環境が取得できることが判明!なんで昨日、このサイトに気が付かなかったのだろう…。
→参考:Cocos2d-x v3:多言語の対応

アプリ名の多言語対応

cocos2dでのアプリ名多言語対応は以下のサイトを参考にしました。
→参考:【cocos2dx入門】アイコン・画面の向き・名前の設定 – iOS編の後半
 
しかし英語環境でも日本語タイトルが表示される…。サイトで情報収集したけれど原因が
分からない。しかしjQueryでアプリを作成した時にビルドしても修正が反映されないことがあり
その場合はシミュレータ上のアプリを削除してからビルドし直すと反映されたことを思い出す。
→参考:google検索「xcode 反映されない」
 
でも上記の検索結果を確認すると、いろいろ難しそうな対処法が紹介されている。
シミュレーター上のアプリを削除してからビルドするってのは簡単なのに…。
私が検索した時には2ページ目にやっと紹介されていた(実機での検証)。
→参考:storyboardを変更しても実機に反映されないとき
 
 
 

twitterボタンを付けたい

よく見かけるtwitterボタンを付けることに挑戦。facebookボタンも付けようと
思いましたがfacebookのアカウントを持っていないし、技術的にはtwitterと
余り変わらないようなので今回は省略。

social framework

cocos2dからtwitterを起動する方法はネット上に多くあるのですがエラーになってしまいます。
以下の問題と同じなのですが、selfを指示通りに書き換えても別のエラーになります…。
→参考:Present Social View Controller Cocos2d
非推奨のtwitter frameworkを利用したら非推奨の警告は出るけれど機能した。
→参考:Cocos2d-x 3.0からツイートする
 
しかし警告は避けたいので、もう少し調べて以下のサイトに出会う。
→参考:Cocos2d-x 3.2でスクリーンショットを撮ってツイート
しかしNativeCodeLauncher_objc.mのAppControllerの記述でエラーになる。
AppControllerってなに?と調べて以下のサイトに辿り着き、
単純にAppController.hをインクルードすればよいことを理解する。
そして無事twitterを起動することができた。
→参考:cocos2d-x で Objective-C / Java のコードを実行する
スクリーンショット 2014-09-13 0.20.05

includeとimport

この違いが良く分からないので調べた。importの方は多重読込を防ぐ機能があるので
importに書き換えた(cocos2dはimportが使えないのでifdefで多重読込を防いでいるのです)。
→参考:#importと#includeの違い
 
 

GameCenterへの対応

低スペックのiPodTouchを検証機としている私にとってはgameCenterに対応しているアプリは
ゲームの起動が遅くなるのであまり好きではありません。ですが、このようなパズルゲームで
皆さんがどれ位のスコアを出すか興味もあるのでGameCenterに対応してみようと思います。
役に立ったのは以下のサイト。GitHubにソースをアップしているのでとても参考になります。
→参考:cocos2d-x 3.0でのiOSアプリに対するGameCenterの実装
しかし上記のソースにはランキングを表示した後にゲームに戻す機能が
書いていないため、ランキングの「完了」ボタンをタップしても機能しない…。
 
ネットで調べると「leaderboardViewControllerDidFinish」というイベントを
設定するらしいのですが、これをどこに設定して良いか分からない。
でも「AppController.mm」か「RootViewController.mm」だろうと思い
試しに記述した。結果は「RootViewController.mm」が正解。
無事にランキングを閉じることができた。
閉じる処理の参考になったのは以下のサイトで、得点の記録も
このサイトを参考に最高点を更新した時だけ記録するようにした。
→参考:アプリをGame Center対応にする方法(前編)
→参考:アプリをGame Center対応にする方法(後編)

意外なところで躓く

GameCenterを組み込んだけれど記録が更新されない…。ネットで調べると
色々記事が見つかるのですが、どれも該当せず困っていたところ
スコアの並び替えの「昇順」と「降順」を間違って理解していたことに
気が付く。多い順に並べるのは「降順」でした…。
スクリーンショット-2014-09-15-21.29.50
でも、この設定で更新されない減少が発生するということは以下のサイトの
ようにハイスコアかどうかのチェックはGameCenterがやってくれている
ことになる。→参考:アプリをGame Center対応にする方法(後編)
 
ゲームが得意な人がランキング表を一人で埋め尽くすということは無い、ハズ。
だから参考にしたもう1つのサイトでは、そのような処理が記述されていない
のかな?→参考:cocos2d-x 3.0でのiOSアプリに対するGameCenterの実装
 

来週末には審査に出せるかな?

残りの作業は説明のwebページを作成するだけ。来週末には
申請に出せそうです。
 
 
 

cocos2d : 脳トレ15パズル-インターステイシャル広告

メニューとヘルプ画面

連休も仕事になりそう…と構えていたのですが、その事態は避けられました。なので
アプリの作成を一気に進めました。今回のアプリはヘルプ画面を用意するほど複雑ではないので
メニュー画面にヘルプをのせる仕様にしました(後半に英語版と共にキャプチャがあります)。
 

インターステイシャル広告

次は弾幕系のゲームを作成する予定なのですが、アクション性の強いゲームでは画面にある
バナーをクリックする気にはなれません。なのでゲームオーバー時などに表示する
インターステイシャル広告を導入します。今回のアプリではバナー広告で充分だと思うのですが
練習として導入。私の利用しているNend(サンプル)では以下の様な感じになります。
→参考:アドネットワーク『nend』インタースティシャル広告 提供開始
スクリーンショット 2014-09-11 20.20.47
 
あと今回のアプリでは多言語対応(日/英)に挑戦するのですが、Nendのインターステイシャル
広告は日本語圏の広告だけなので、英語圏ではadmobのインターステイシャル広告を利用予定。
→参考:iPhoneアプリに AdMobのインタースティシャル広告を導入する方法
 
そしてadmobを提供しているgoogleはユーザーに応じて広告メディアを切り替える
メディエーションという仕組みを用意しており、日本のユーザーにはNend
海外のユーザーにはAdmobというように振り分けることができる。
 
が…。adMobのメディエーションはインターステイシャル広告に対応していないことが判明。
→参考:AdMobのメディエーションの広告サイズ
→参考:admobメディエーション設定方法の注意事項をチェック
 

ネイティブ情報の取得

ということで自前の仕組みで切り替えることに挑戦しようと思う。iPhoneの言語設定を取得して
それによって表示する広告を振り分けられるはず。言語設定はiOSのネイティブ情報なので
ネイティブ(Objective-c)とcocos2d-x(C++)の連携が必要となるので調査開始。
以下のサイトではデバイス名を取得しているのを参考にして、何とか完成。
→参考:cocos2d-xとネイティブ間の連携
 

mmファイルの作り方

拡張子がmmファイルはc++もobjective-cも記述できる。作成法はC++で作成したcppをmmに
変更するだけ。objective-cを記述するファイル(上記スライドの例だと〜_objc.hなど)は
c++ではなく「cocoa touch」からクラスファイルを作成すること。
 

iOSの言語設定情報を取得する

言語情報の取得はデバイス名よりも簡単に取得できる。
→参考:iPhoneの言語設定関連の情報取得についての解説
→参考:「iOS シミュレータ」の言語を変更する
 
ということで以下の様に言語設定を取得して英語の設定の時は英語の画像を利用するように
しました(とはいえメインのデザインがほとんど英語なので工数は少ない)。
英語の記述が正しいかは不安です…。
スクリーンショット-2014-09-11-20.36.23
 

そしてadmobを諦める

Nendは簡単に設定できたのですがAdMobで難航。エラーが続出してNendのプラグインにも
警告が出るようになりました。時間もないし情報も少ないので今回は諦めます。
しかしいつの日か再挑戦したいのでメモ。
 
cocos2dにadmobのインターステイシャル広告を表示するには2つのサイトを参考にしました。
まず以下のサイトではxcodeでのインターステイシャル広告の表示方法を説明しています。
→参考:iPhoneアプリに AdMobのインタースティシャル広告を導入
しかし上記サイトはcocos2dへの組み込みではないので、そのままでは利用できません。
ですので以下のサイトを追加で参考にしました。
→参考:Cocos2d-x:AdMobを表示させる(iOS)
上記サイトではバナー広告を表示する設定が説明されているので、バナー広告の部分を
前述のサイトで学んだインターステイシャル広告の表示に変更して記述します。
 

今回はiOSのみ

未だeclipse+cocos2d環境が壊れたまま放置しています。Androidで多く利用して
貰えるなら頑張って再構築するのですがダウンロード実績をみたら、その気がなくなりました。
スクリーンショット 2014-09-11 20.46.17
iOSは以下の様になっているので桁違いです。
スクリーンショット-2014-09-11-20.49

cocos2d : 脳トレ15パズル-その3

予想外に忙しくなり全然すすまない…。今回は先週末に書いたメモを推敲してアップ。
ゲームはほとんど完成しているのに、月内にギリギリ申請出せるか?位の忙しさです。
 

実機でのみ警告が

エラーは以下のページと同じもので、記載された方法で解決できた。
→参考:Xcode error : mdynamic-no-pic
しかし調査を進めると以下のサイトに遭遇。上記の設定をすると審査で「Non-PIE Binary」
という理由でリジェクトされる場合があるらしい。
→参考:新審査基準、PIE Binary とは
もし、これでリジェクトされたら設定を戻そう。忘れないようにメモ。
 

パネルの管理には配列を

15パズルはパネルの移動が終わるまで次の操作を受け付けないようにするとシンプル
にプログラムを記述できます。しかし今回はドラッグで連続して操作しても問題ない
ようにしました。この仕組みの構築には配列によるデータの管理が必須なのでメモ。
配列を扱う部分は集中して一気に作成しないと混乱するので一気に仕上げた。

arrayとvector

arrayは要素数が固定。要素数を動的に変更する場合はvectorを利用する。arrayや
vectorで[]を利用して範囲外の値を取得するとエラーにはならない「誤動作する」のが厄介。
だから範囲内のチェックをするat関数とかがある。
→参考:vector.at(index)とvector[index]の違い

vectorに利用できる関数

vectorに利用できる関数は以下のページが分かりやすいです。javaScriptとの違いを感じたのは
最後のデータを消すpop_back関数。javaScriptのpop関数と異なり、削除した値を返しません。
最後の値を取得したい場合はpop_backするまえにback関数で取得します。
→参考:C++ ベクタ(std::vector)

C++での2次配列の初期設定

c++では2次配列の初期設定も1次配列的に行う。javaScriptに比べると面倒。
→参考:配列の初期化の中程
 

配列以外について

配列以外にも色々学んだのでメモ。

ifのスコープ

これはビックリjavaScriptと全然違う。ifの{}内は別スコープ。
→参考:自動変数と有効範囲

矩形スプライトと円スプライト

矩形のスプライトはsetTextureRectで直接作成できる。
→参考:Cocos2d-x v3:スプライトに色をつける
しかし円は描画機能を利用して描き、それをspriteに追加する。そして
アンチエイリアスがかからない…。アンチエイリアスをかける方法を調べたけれど
分からず、結局は丸いpngを用意してそれを利用。ちょっと不便。
→参考:Cocos2d-x:図形の描画(円)

メニューの有効/無効

setEnabled(false)でメニューを無効にすることができる。対象をMenuにすればメニュー全体が
無効になりmenuItemを対象にすれば個別に無効にできる。
→参考:Cocos2d-x:メニューを押せなくする

removeAllEventListenersの注意点

ドラッグはeventListenerで監視。ようが無くなりremoveAllEventListenersで削除したら、
Menuのイベントまで削除されてしまった。イベントリスナーを削除する関数は色々あるので
用途に合わせて選択しないと。

メニューの範囲設定

Flashみたいにボタンの有効範囲が設定できないか調べてみた。
setContentSizeを利用すると可能ですが制限が多く利用しにくい。
→参考:画像はそのままでボタンを押しやすくしてみよう
なので上記サイトの後半で説明している方法が良いかもしれませんが、面倒なので
pngの透明領域を大きめに設定して対応しました。

連続した移動

ドラッグ対象のパネルを素早く連続して移動させると予想外の場所に移動する
場合がある。利用している関数はmoveToで絶対座標での移動なのに。何故?。
移動が重なる前にstopAllActionsを利用して移動を停止してから実行することで
対処できた。

motion streak

パネルを移動させる時の軌跡はmotionStreakを利用しています。使い方は簡単だけど
鋭角な動きに弱い。そのような場合は精度を落とした方が自然になる場合がある。
→参考:cc.MotionStreakを使ってスモークを表現する
update/scheduleUpdateを利用してmotionstrewkの位置を設定して実現する。
updateは複雑なコンテンツの時には、色々な処理が集中しそうなので、そのような
場合は通常のscheduleを利用した方が良さそう。
あとアルファ付きのpngは黒ずむ。以前のspriteBatchNodeと同じ現象…。

ビットマップフォントの作成

ここでもshoeBoxが活躍。しかし書き出したfntデータ内の画像へのパスがフルパスに
なっていてエラーになるので修正しないといけない…。設定が悪いのかなぁ?
→参考:ビットマップフォントを自分で描いて、Cocos2d-xで表示してみよう
あとspriteBatchNodeと同じようにアンチエイリアス部分が以下の様に黒くなって
しまいます。
スクリーンショット 2014-08-29 20.18.41

透過pngが黒くなる件

この問題があちこちに登場してきたので、英語の情報も調査。以下のページで紹介している
BlendFunc::ALPHA_PREMULTIPLIEDを利用した方法で何とかできました。
→参考:black borders around sprites
スクリーンショット 2014-08-29 20.57.29
しかし、この方法は根本的な解決になっていないような気がする。そのそも
spriteとspriteBatchNodeの表示が異なることが問題だと思うし。
あ、あと文字間隔を調整した。文字間隔はShoeBox側で設定する。
Advance設定内のKerning Valueを大きくすることで文字間を広げることができた。
 

残りの作業

・メニュー画面の作成
・ヘルプ画面の作成
・今回はBGMは無し。でもSEは付ける。
・メニュー画面にtwitterとFacebookのボタンを付けたい
・GamaCenterを利用してスコアランキングを追加したい
・ゲームオーバー画面にインタースティシャル広告を付けたい。