2016年1月11日月曜日

Cocos2d-xアプリをeclipseでデバッグする

忘れるといけないのでデバッグ方法をメモ

  • 参考ページ:
    • https://www.drjiro.com/game-engine/cocos2dx/cocos2d-x-native-debug-using-eclipse/
  • 環境:
    • MacOS 10.11.2
    • eclipse Mars.1 Release (4.5.1)
    • Cocos2d-x 3.9
  • 前提:
    • ソースの編集はeclipse上で行う
    • ソースのビルドはコンソール上で行う
    • アプリのデバッグはeclipse上で行う
  • 手順:
    • ビルドしたいプロジェクトを作成orどこかからダウンロード
    • 参考ページに従いcocosプロジェクト配下のproj.androidとcocos2dをeclipseのimportよりプロジェクトに追加
    • proj.androidを右クリック>プロパティ>Builders>CDT Builderにチェックが付いていたら外す
    • cocos2dのプロジェクトをビルド、同プロジェクトのbin配下にjava.jarができていることを確認
    • proj.androidのjni配下のApplication.mkを次の様になっているかを確認
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11 -fsigned-char

APP_ABI := armeabi
APP_PLATFORM := android-10

ifeq ($(NDK_DEBUG),1)
  APP_CPPFLAGS += -DCOCOS2D_DEBUG=1
  APP_OPTIM := debug
else
  APP_CPPFLAGS += -DNDEBUG
  APP_OPTIM := release
endif
    •  コンソールから次のコマンドを実行してビルド
cocos compile -p android -m debug –ndk-mode NDK_DEBUG=1
    •  それぞれのプロジェクトをrefresh
    • 右クリックでDebug As > Android Native Applicationを実行
  • 注意点:
    • デバッグするときに自作ソース以外でもでもブレークポイントが打てる様にするため、cocosのライブラリソースもデバッグ検索パスに含めた方が良い

    • ライブラリソースを追加する方法はproj.androidを右クリック>New Folderを選択選択時のダイアログの下部にあるAdvancedを選択、一番下のLink to alternate Locationを選択しライブラリソースが含まれるディレクトリを選択
    • proj.androidを右クリック> New Source Folderで既に追加したリンクフォルダを選択すればOK


参考ページの方法ではeclipse上でビルドも行う様な設定を行っていたが、なぜか自分の環境では上手くいかなったためビルドはコンソール上から実行する様にする。 






2015年11月22日日曜日

Cocos2d-xでの複数解像度ディスプレイへの対応方針 その1

過去にいくつかAndroidアプリを作って来ましたが、あまりちゃんと理解していなかった解像度についてCocos2d-xでゲームを作成するにあたり正確に理解する必要が出てきたのでその内容をまとめる。

ちなみに、以前の理解レベルは、

ん、解像度?dpで指定しとけばいいんでしょ?アイコンサイズもとりあえずxhdpiのサイズまで用意しておけばいいんでしょ?


というレベル・・・。

因みにこの話の結論(方針)としては、

  • iOS端末をベースとした低解像度から高解像度の画像をいくつか用意する
  • 動作デバイスの解像度に応じて用意したうちの最適なものを利用する
  • 選択した画像のアスペクト比とデバイス画面のアスペクト比が合わない場合はデバイスに応じて縦に合わせるか横に合わせるかを決める

になります。


さて、ここからが本題。まず解像度という言葉であるがWikipediaによると、

画面解像度(がめんかいぞうど、Display resolutionScreen resolution)とは、慣用的にコンピュータ等のディスプレイに表示される総画素数を指す。

この、総画素数は縦と横のピクセル数を掛け合わせたものになる。
また、総画素数が高くても実際に表示するディスプレイのサイズが大きければ1インチ辺りの画素数が少なくなるため粗い表示になる。
つまり、一般的に”高解像度=美しい”という理解がされているがこの高解像度の背景には今までと同じ画面サイズだけど解像度が上がったんだよという前提がある。
具体的な例で言うとAppleが出したRetinaディスプレイがわかり易いあれは今までと物理的に同じ画面サイズであるが、1インチ辺りの画素数が二倍になりましたよ、だからこれまでよりも綺麗に見えますよという話。

ほうほう、ではiOSではどんな解像度のデバイスがあるのかなと調べてみたところ
端末ピクセルデバイスディスプレイサイズ
iPhone,3G,3GS320x480320x4803.5
iPhone4,4S640x960640x9603.5
iPhone5,5s,5c640x1136640x11364
iPhone6,6s750x1334750x13344.7
iPhone6 Plus,6s Plus1242x22081080x19205.5
iPad,2768x1024768x10249.7
iPad Mini768x1024768x10247.9
iPad 3,4,Air,Air2 1536x20481536x20489.7
iPad Mini 2,3,41536x20481536x20487.9
iPad Pro2048x27322048x273212.9
と、かなり たくさんバリエーションがあることがわかった。
ゲームアプリの背景画像を綺麗に見せたい場合は上記表の2列目の解像度と同じ画像を用意すれば良いが、それはかなり大変。

ましてやAndroidの場合も全てのデバイスの解像度の画像を用意するのはほぼ不可能なので、iOSの代表的な解像度に対応を行いその他についてはこちらのブログでも紹介しているやり方で対応をすることにする。

ひとまず今回は以上。




2015年11月15日日曜日

Cocos2d-xで使うNDKはr9dにする



Cocos2d-xでアプリ開発をしようとして次のコマンドを実行してビルドしたところ

$cocos compile -p android --android-studio


エラーが!!


Android NDK: ERROR:/Users/hoge/android-ndk-r10/sources/cxx-stl/gnu-libstdc++/Android.mk:gnustl_static: LOCAL_SRC_FILES points to a missing file

Android NDK: Check that /Users/hoge/android-ndk-r10/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi/thumb/libgnustl_static.a exists or that its path is correct

なんだよファイルはあるだろと確認したところ
r10dではgccのバージョンが4.9となっておりそのためファイルが無いとエラーになっていました。

r10dでビルドする方法を調べてみたところ、公式のフォーラムでr9dを使った方が良いとの情報がありました。

おとなしくr9dを使うことにします。

2015年11月14日土曜日

AdSizeにSMART_BANNERを設定する際の注意点

Androidのアプリに広告を乗せる場合、画面の大きなタブレットと小さな画面のスマートフォンの両方に表示することを考慮しなければいけない。

通常のスマートフォンに表示する標準のバナー(幅320x高さ50)は当然スマートフォンには丁度良いがタブレットの場合はかなり小さく見えてしまう。

そんなときに嬉しいのがスマートバナーである。
スマートバナーではAdView側で現在動作している端末の画面サイズを見て適切なバナーを自動で切り替えてくれる。
そんな素晴らしい設定ではあるが一つ注意がある。

公式の注意書きにもある通り、

AdViewは表示できる十分なスペースが無い場合は何も表示されない。
従って、実装は次のようにxml上でAdViewを表示する領域のサイズを自動で切り替えられるようにすると良い。


参考URL: 超簡単!xmlファイルの変更だけでできるAndroidのタブレット対応

2015年9月5日土曜日

PostgreSQL 無かったらINSERT文について

SQLはSELECT * FROM xxxくらいしか叩けない自分ですが、
DBを構築する必要が出てきたので色々と勉強中です。

早速ですが、DBにINSERTしたいレコードと同じものが無い場合のみINSERTしたい場合どうするか悩みました。

一度レコードの存在をSELECTで調べてその結果を一時的に保持して、
無ければ次にINSERTをすることも考えましたが、一度にそれをしたい!

早速ネットを調べてみると同じような質問が当然のごとくありました。
Postgres: INSERT if does not exist already

そして、この質問に対して次の様な回答がありました。
INSERT INTO example_table
    (id, name)
SELECT 1, 'John'
WHERE
    NOT EXISTS (
        SELECT id FROM example_table WHERE id = 1
    );

ほんのわずかなレースコンディションがあるようですが、これでやりたいことはできるようです。
しかし、なぜこれがうまく動くのかが理解できない!

で、INSERT、SELECT、NOT EXISTSをそれぞれ調べて次のことが分かり無事に理解できました。

  • NOT EXISTは続くSELECTの結果が無い場合trueを返す
  • SELECT 1, 'John'は1, 'John'を表示する
  • INSERT は()の後にSELECT文を書いてその結果を代入することができる
つまり、
  1. SELECT id FROM example_table WHERE id = 1で入れたいレコードがあるかを調べる
  2. WHERE NOT EXISTSで無かった場合実行するという条件を付ける
  3. 条件がtrueであった場合、SELECT 1, 'John'で代入したい値を指定する
  4. その値をINSERTする
ということだと理解しました。



2015年8月19日水曜日

Pythonの変数スコープ

Pythonのサンプルプログラムを見ていて気になることがあった。
例外処理でtry-catch-finallyの外側で変数宣言をしていないのに、tryとfinallyそれぞれで同じ変数を参照していた。 
try:
    instance = SomeClass()
    instance.getSomething()

except Exception, e:
    print 'Error %s' % e

finally:
    if instance is not None:
        instance.doSomething()

JavaやC++ではこのような書き方はエラーになるので非常に違和感があった。
そこで調べてみたところ、 Pythonでは変数のスコープは基本的に

  • クラス
  • 関数

この二つしかなくif分や例外等の制御構文ではスコープは存在しないということだった。
参考:Python の名前空間とスコープ

2015年8月18日火曜日

PythonとMacPorts

Pythonを勉強中で環境を構築中。

基本的に必要なモジュールはMacPortsを使ってインストールをしているが、MacPortsでPythonをインストールするとデフォルトでMacに存在するPythonとバッティングする。

virtualenvとかを使えばうまく切り分けられるのだろうが、まだあまり理解できていない。

ひとまず、MacPorts側でどのPythonを使うのかは次のコマンドで設定ができる。
 $ sudo port select python

すると次のように選択肢を表示してくれるので使いたいものを選ぶ
 Available versions for python:
 none
 python25-apple
 python26-apple
 python27 (active)
 python27-apple

 $ sudo port select python