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部分がよく省略されているのが気になります。

学習本

参考サイト

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

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