2016年10月14日金曜日

【cocos2-dx Android】学習中につまづいた箇所 その2

  • 公開日:2016年10月15日

記事概要

cocos2d-xの学習中に発生したエラーと解決方法のまとめです。
忘備録的なメモですが、なにかの役に立てばと思いUPします。

使用している本(以下、教材)は

です。

環境

  • Android Studio 2.2.0
  • OS X El Capitan
  • android sdk 24
  • cocos2d-x 3.13.1

画面のサイズの調整

教材 p85 の画面のサイズの調整がうまくいかない。
コードは以下の通りです。

TitleScene.cpp
  // 画面サイズ
  Size visibleSize { Director::getInstance()->getVisibleSize()};
  // 背景
  Sprite* bgSprite { Sprite::create("title_bg.png")};
  // 座標の設定
  bgSprite->setPosition(visibleSize / 2);
  this->addChild(bgSprite);

画像をスケールするように、コードを以下のように変更する

TitleScene.cpp
  // 画面サイズ
  Size visibleSize { Director::getInstance()->getVisibleSize()};
  // 背景
  Sprite* bgSprite { Sprite::create("title_bg.png")};
  // 画像サイズの取得
  CCSize imgSize = bgSprite->getContentSize();
  // スケール
  bgSprite->setScale(visibleSize.width/imgSize.width, visibleSize.height/imgSize.height);
  bgSprite->setPosition(visibleSize / 2);
  this->addChild(bgSprite);

上記の実装で、画面がスケールされて表示される。
しかし、コンパイル時に以下のwarningが発生する。

terminal

warning: 'cocos2d::CCSize' is deprecated

CCSizeの実装を変更する

TitleScene.cpp
  // 画面サイズ
  Size visibleSize { Director::getInstance()->getVisibleSize()};
  // 背景
  Sprite* bgSprite { Sprite::create("title_bg.png")};
  // 画像サイズの取得
  Size imgSize = bgSprite->getContentSize();
  // スケール
  bgSprite->setScale(visibleSize.width/imgSize.width, visibleSize.height/imgSize.height);
  bgSprite->setPosition(visibleSize / 2);
  this->addChild(bgSprite);

CCSize から Size にするとwarningが消えます。
ui::Buttonなども同じように画像をスケールすることで対応できました。

画面のサイズの調整2

P104 のゲーム画面の作成で、画面サイズが自分の利用している端末だとうまくいかなくて、思いどおりに作成できない事案が発生。 調べたところ、AppDelegate.cppに以下のコードを発見。

AppDelegate.cpp
static cocos2d::Size designResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size smallResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size mediumResolutionSize = cocos2d::Size(1024, 768);
static cocos2d::Size largeResolutionSize = cocos2d::Size(2048, 1536);

  if (frameSize.height > mediumResolutionSize.height)
  {
  director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width));
  }
  // if the frame's height is larger than the height of small size.
  else if (frameSize.height > smallResolutionSize.height)
  {
  director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width));
  }
  // if the frame's height is smaller than the height of medium size.
  else
  {
  director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width));
  }

自動生成のデフォルトコードでは、setContentScaleFactorでスケールサイズを決めている。
これは、端末のディスプレイサイズによらずサイズを指定するために使用する関数なので、学習初期には不要と判断して消して対応した。 マルチサイズは、フレームワークのメソッドの仕様をある程度把握してから取りかかる方が学習効率が良い。

以下のように変更した。

AppDelegate.cpp
static cocos2d::Size designResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size smallResolutionSize = cocos2d::Size(480, 320);
static cocos2d::Size mediumResolutionSize = cocos2d::Size(1024, 768);
static cocos2d::Size largeResolutionSize = cocos2d::Size(2048, 1536);

// if (frameSize.height > mediumResolutionSize.height)
// {
// director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width));
// }
  // if the frame's height is larger than the height of small size.
// else if (frameSize.height > smallResolutionSize.height)
// {
// director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width));
// }
  // if the frame's height is smaller than the height of medium size.
// else
// {
// director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width));
// }
  }

コメントアウトします。

これを外すと、スケールを考える必要がなくなる。
あとは、setPositionのVec2で微調節します。

以上です

注意

学習中なので、非効率な点があるかもしれませんが、ご容赦ください。 後で見直すので、気がついたら随時修正します。

学習時は、C++未経験ならロベールのC++も一緒に利用しましょう。 本のコード説明部分のreturn部分がよく省略されているのが気になります。

学習本

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2016年10月13日木曜日

【cocos2-dx Android】学習中につまづいた箇所

  • 公開日:2016年10月13日
  • 最終更新日:2016年10月15日

記事概要

cocos2d-xの学習中に発生したエラーと解決方法のまとめです。
忘備録的なメモですが、なにかの役に立てばと思いUPします。

使用している本(以下、教材)は

です。

環境

  • Android Studio 2.2.0
  • OS X El Capitan
  • android sdk 24
  • cocos2d-x 3.13.1

エラー

アプリ作成後、起動するとjava.lang.UnsatisfiedLinkErrorエラーが発生しました。
エラーの発生した手順は以下の通り。

  • cocos new コマンドでcocosプロジェクトを作成
  • Android studioでビルド
  • アプリを起動
  • エラー発生

エラー詳細は以下の通りです。

terminal
/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.sample.SampleGame, PID: 6777
  java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.sample.SampleGame-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libMyGame.so"
  at java.lang.Runtime.loadLibrary(Runtime.java:366)
  at java.lang.System.loadLibrary(System.java:989)
  at org.cocos2dx.lib.Cocos2dxActivity.onLoadNativeLibraries(Cocos2dxActivity.java:248)
  at org.cocos2dx.lib.Cocos2dxActivity.onCreate(Cocos2dxActivity.java:264)
  at android.app.Activity.performCreate(Activity.java:6289)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)
  at android.app.ActivityThread.access$900(ActivityThread.java:177)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:145)
  at android.app.ActivityThread.main(ActivityThread.java:5951)
  at java.lang.reflect.Method.invoke(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

libMyGame.soがないと怒られています。

解決方法

最初のビルドはcocosコマンドで実行します。

terminal

// プロジェクトフォルダに移動
cd {プロジェクトルート}

// ビルド
cocos run -s  {プロジェクトルート} -p android --android-studio

# ビルドオプション内容
# -s : プロジェクトのベースディレクトリ
# -p : ビルドするプラットフォーム、ios, android, mac, web, win32, linux

上記でビルドすると、

terminal

The directory 'android-13' can't be found in ANDROID_SDK_ROOT/platforms, please use --ap to set needed API level

が発生しました。
対策として、SDK ManagerでAndroid3.2をダウンロードし、build.gradleのminSdkVersionを10から16に変更しました。

変更後はビルドに成功してアプリが立ちあがりました。

まとめ

仕事上の理由で利用することになったcocosですが、結構使い易い印象です。
Unitiyに押され気味ですが、頑張って欲しいです。

以上です

注意

学習中なので、非効率な点があるかもしれませんが、ご容赦ください。 後で見直すので、気がついたら随時修正します。

学習本

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2016年10月3日月曜日

Android開発者にこそオススメの一冊 - 書評 - Java言語で学ぶデザインパターン入門 マルチスレッド編

  • 公開日:2016年10月03日

はじめに

650ページを超える本だが、Javaの知識があれば読破するのに、あまり時間はかからないだろう。 私は演習問題を含めて10時間ほどで読めた。

逆に、Javaの知識がなければ、読むのはかなり厳しいだろう。なお、インタフェースの理解は必須だ。
コードの内容が頭に入ってこない場合は、まだ読むには尚早である。 もっと力をつけてから読むと良い。

特徴

題名にデザインパターンとあるが、Javaスレッドの基本的な使いかたを丁寧に説明した本である。 デザインパターンん本ではない。題名が悪い。
Swingの開発者をターゲットとしているので、Androidアプリ開発者に適している。 スレッドだけでなくリスナーの説明があるのも良い。

一方で、WEBアプリの開発者にはまるで向かない本である。 発売時期を考えると、世に早くですぎた感が否めない。
とはいえ、Android開発者には最高の本である。
また、日本語が原書なので、日本人開発者に非常に読みやすいのも特徴だ。

できれば、手元に著者の本であるデザインパターンもあると、なお理解がしやすいだろう。

ObsevaerパターンやFlyWeightパターンの知識は、よりスレッドの理解を高めてくれる。

まとめ

優れた本はいつの時代でも役立つというお手本のような本である。 ぜひ手にとって、力をつけてほしい。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...