2015年10月04日

【cocos2d-x】なぜか「assets」ディレクトリが消えた件

メモとして。

cocos2d-x 3.7。

Eclipseでプロジェクトをクリーンしたときは「assets」はちゃんとあった。

実機でテストをしたら画像を読み込む段階で

「assets is nullptr」

と出て実行時エラーで強制終了。

よくみるとプロジェクト内にあった「assets」ディレクトリがない。

あれ?

クリーンをするとまた「assets」は生成される、が、実機テストすると消える。

????

Eclipse再起動してからまたクリーン、実機テストしたら今度は消えなかった。

なんだったんだろ?

posted by B.cos at 14:23| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

【cocos2d-x】runActionに渡すActionインスタンスをシーンクラスのメンバーにしたらアプリが落ちた件(Android)

cocos2d-x 3.7において。

たとえば画面外に置いたSpriteのインスタンスを画面内に引き出して、しばらくしてまた引っ込めるというのをやるときは、よくあるサンプルプログラムではActionのサブクラスを使ってこんな感じで組むと思います。


〜GameScene.cpp〜
bool GameScene::init()
{
〜略〜


}
bool GameScene::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
{
auto _move1 = EaseOut::create(MoveBy::create(2.0f, Vec2(64.0f, 0.0f)),4);
auto _move2 = DelayTime::create(2.0f);//MoveBy::create(2, Vec2(0.0f, 0.0f));
auto _move3 = EaseIn::create(MoveBy::create(2.0f, Vec2(-64.0f/2, 0.0f)),4);
auto m_moveSequence = Sequence::create(_move1, _move2, _move3, nullptr);
_obj->runAction(m_moveSequence);//_objは初期化済みのSprite等
return true;
}


これでうまくいきます。

ただ僕はここでSequenceのインスタンスをシーン内で共有して使えないかと、GameSceneクラスのメンバ変数にしてみました。


〜GameScene.h〜
public:
Sequence *m_moveSequence;

〜GameScene.cpp〜
bool GameScene::init()
{
〜略〜
auto _move1 = EaseOut::create(MoveBy::create(2.0f, Vec2(64.0f, 0.0f)),4);
auto _move2 = DelayTime::create(2.0f);//MoveBy::create(2, Vec2(0.0f, 0.0f));
auto _move3 = EaseIn::create(MoveBy::create(2.0f, Vec2(-64.0f/2, 0.0f)),4);
m_moveSequence = Sequence::create(_move1, _move2, _move3, nullptr);
}

bool GameScene::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
{
_obj->runAction(m_moveSequence);//_objは初期化済みのSprite等
return true;
}


これをやったらタッチイベント起こした瞬間に落ちました(笑)

よくわからないけれどcocos2d-xの内部まで追う気力も今のところないので、そういう仕様だと思ってローカルで必要な時にActionを生成して動かすのがあまり時間を食わないで済みそうです。

cocos2d-xは本当にわからないことだらけで、たとえば「自分独自のシーンクラスをつくってそれをスーパークラスにしてぐへへへへへw」とやろうとしてことが過去にありまして。
結果としてよくわからない実行時エラーで落ちて動かず、むしろ「そのまま使った方が楽じゃね?」と悩まされた時期もありました。
人の作ったプラットフォームで便利なのはあるのですが、独学のなんちゃってプログラマーとはいえそろそろ20年選手、もっとうまく(頭を)使えないかなあーとか考える今日この頃でした。
posted by B.cos at 14:13| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

2015年01月20日

【cocos2d-x】ローカルのXMLファイルの読み込み&解析

cocos2d-xでasset内のXMLを読み込んで解析して使う方法を試してみた。
開発環境はEclipse4.4、cocos2d-xはver.3.2、動かした実機はXperiaVL SOL21、AndroidのOSバージョンは4.1。

test.xml(読み込むXMLファイル)

<charadata>
<item>
<id>0</id>
<reach>0.0</reach>
<power>8</power>
<target>0</target>
</item>
<item>
<id>1</id>
<reach>0.0</reach>
<power>8</power>
<target>0</target>
</item>
<item>
<id>2</id>
<reach>0.0</reach>
<power>8</power>
<target>2</target>
</item>
……
</charadata>


cocos2d-x内、cppファイル。
テストXML読み込み、解析、表示。

//ファイルパスの取得
FileUtils* fileUtils = FileUtils::getInstance();
const char* path = "test.xml";
std::string fullpath = fileUtils->fullPathForFilename(path);
log("filepath:%s",fullpath.c_str());

//XMLを読み込んでパース
auto content = fileUtils->getDataFromFile(fullpath.c_str());
tinyxml2::XMLDocument *doc = new XMLDocument();
log("xml:%d",(const char*)content.getSize());
auto ret = doc->Parse((const char*)content.getBytes(), content.getSize());
if (ret != tinyxml2::XML_NO_ERROR) {
//xml
log("xml:fail:%d",ret);
return;
}

//XMLのルートを呼び出す
auto rootElement = doc->RootElement();
if (!rootElement){
log("xml:rootElement Error");
return;
}

//最初の要素を呼ぶ
tinyxml2::XMLElement* childElement = rootElement->FirstChildElement("item");

while (childElement) {
tinyxml2::XMLElement* element_id = childElement->FirstChildElement("id");
log("id:%s",element_id->GetText());
tinyxml2::XMLElement* element_reach = childElement->FirstChildElement("reach");
log("reach:%s",element_reach->GetText());
tinyxml2::XMLElement* element_power = childElement->FirstChildElement("power");
log("power:%s",element_power->GetText());
tinyxml2::XMLElement* element_target = childElement->FirstChildElement("target");
log("target:%s",element_target->GetText());
//次の要素を呼ぶ
childElement = childElement->NextSiblingElement("item");
}


プログラム実行、XML内容表示

01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:1
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:2
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:2
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:3
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:2
01-20 01:43:40.148: D/cocos2d-x debug info(18446): id:4
01-20 01:43:40.148: D/cocos2d-x debug info(18446): reach:0.0
01-20 01:43:40.148: D/cocos2d-x debug info(18446): power:8
01-20 01:43:40.148: D/cocos2d-x debug info(18446): target:2

……


こんな感じでできました。

ちなみにファイル読み込み時にtinyxml2::XMLDocument::LoadFileを使ってみたのですが、正常に動けば0を返すところが、Androidでは3を返してちゃんと動作しませんでした。

const char* path = "test.xml";
std::string fullpath = fileUtils->fullPathForFilename(path);
tinyxml2::XMLDocument *doc = new XMLDocument();
auto ret= doc ->LoadFile(fullpath.c_str());
if (ret != tinyxml2::XML_NO_ERROR) {
//xml
log("xml:fail:%d",ret);
return;
}

この3が何を意味するのか詳しく調べないとわからないのですが、できればLoadFileメソッドを使いたかったなと。
こちらのほうがコードが簡素に書けるので。
iPhoneだとどうなんだろうか?

posted by B.cos at 02:17| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

2015年01月08日

cocos2d-x、開発基礎、まとめ2

@[C++] Cocos2D-xでゲームを作る前の準備
http://qiita.com/edo_m18/items/4a53eee51bbc95974770
↑C++の使い方の復習、、、というかそれ以前に知らんことだらけ。

ApicoJsonに関して
cocos2d-xでJSONを使う
http://nirasan.hatenablog.com/entry/2013/10/24/232905

picojsonを使ってみる
http://ameblo.jp/systemtelescope/entry-11820880734.html

【cocos2d-x】picojsonでJSONファイルを読み込む
http://tsuyushiga.hatenablog.jp/entry/2014/06/04/232104
(ローカルファイルから読み込む方法)

picojsonを使用してHTTP(POST)通信する
http://qiita.com/hkomo746/items/214d0482b6090c0a3ce0
(HTTP通信使用)

BHTTP通信をcocos2d-xで使う際の注意
cocos2d::network::HttpClientを使う際はAndroid.mk内の

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static

及び

$(call import-module,network)

のコメントアウトを外す。


CXMLを解析
【cocos2dx】XMLを利用してサーバーと通信する。
http://albatrus.com/main/cocos2d/6239

DC++のキャストについて
C++ のキャスト - static_cast
http://yohshiy.blog.fc2.com/blog-entry-17.html

C++のキャスト演算子
http://www.geocities.jp/bleis_tift/cpp/newcast.html

static_cast
http://www.wdic.org/w/TECH/static_cast

Eオマケ
どう見ても確信犯…!! 表紙詐欺に全力を尽くした「ヤマノススメ」のパロディ本が話題に
表紙をめくったら、女子高生がゴツいおっさんに…
http://togech.jp/2015/01/05/17258

俺のあおいたんが・・・・・・俺みたいに・・・・・・ッッ!!
posted by B.cos at 01:38| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

2014年12月20日

cocos2d-x、開発基礎情報、まとめ

@データ連携
Cocos2d-xでシングルトンによる画面間データ連携
http://qiita.com/prototechno/items/5eca8aab0dbd3f33273c
cocos2d-xは画面を一個のクラスとして扱うのが"作法"なのでこれが一番効率がいい。
さらにベストなのは画面の基底クラスを作って、ステージをサブクラスで表現するように作成することだろう。

A9-patch画像の使用方法。
Scale9Spriteを使う。
Androidベースのやり方と違ってて、半日無駄にした。

Cocos2d-x V3.0 rc0 で extensions 系の使用
http://qiita.com/yonesuke/items/07f91a826506685b32b8

cocos2d-xのCCScale9Spriteで画像を部分的に引き延ばす
http://brbranch.jp/blog/201312/cocos2d-x/cocos2dx_ccscale9sprite/


B画像アクションについて
cocos2d-xのアクションまとめ
http://brbranch.jp/blog/201309/cocos2d-x/cocos2d-x_animation/


C文字列の使い方
リンク先はLua言語(from Brazil)だけど。

ラベルを使う基本
http://qiita.com/senchan05/items/65b43a8ec7c3899c4eb9


Dver.3.xを使う上で必要なポイント
未だに書籍はV2仕様のものだらけなので。
(ゲーム会社によっては今運営しているゲームがver.2.xを使っているからver.3.xへ移行できないという事情もある)

COCOS2D-X-V2からV3 への変換まとめ
http://kaniace.com/blog/tech-blog/cocos2d-x-v2-%E3%81%8B%E3%82%89-v3-%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%E3%81%BE%E3%81%A8%E3%82%81/

posted by B.cos at 16:05| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

2014年10月21日

cocos2d-x(ver.3.2)、libcocos2dxの扱い(for Android)

いろんなバージョンのマニュアルをみているうちにごっちゃになってしまったのが大まかな原因の話。

プロジェクトのプロパティ内、「Android」のライブラリでlibcocos2dxを参照していたら「Android Dependencies」ディレクトリ内でも同じ内容のライブラリを参照していて重複、エラーが起きてビルドできない事態が起きていた。
適当にググったところ「Android Dependencies」をプロパティのJavaビルドパスから削除すればいける、という型がいらしたのでやってみたらビルド成功。
「やったね!!明日はホムーランだ!!」と安心していたんだけど、後日ふたたびEclipseを起動したら「Android Dependencies」が復活していてまたビルドできなくなっている。
というわけでなんども「Android Dependencies」を消してはビルドを繰り返していたのですが、ふと思ったことが……

『「Android Dependencies」を使う方が正解なのでは?』

というわけでプロパティのAndroid枠のライブラリ参照で「libcocos2dx」を除去したら、ふつうにビルドできました。
そもそも「プロジェクトのプロパティ内のAndroidの項目、ライブラリでlibcocos2dxを参照」するっていうのが僕の記憶違いのミスだったかもしれません。

cocos2d-xはバージョンアップするたびに別物になっていくというのは本当で(バージョンアップしても今まで使ってたバージョンを使い続ける人もいます)、とりあえずはこのルールに従って開発していこうと思っています。
posted by B.cos at 01:21| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

cocos2d-x(ver.3.2)の画面の向きの初期化(for Android)

cocos2d-xはデフォルト状態では"landscape"(横向き)ですが、縦向きにするにはAndroidManifest.xmlのActivityで

android:screenOrientation="portrait"

としましょう。

ついでで「AppDelegate.cpp」のapplicationDidFinishLaunchingメソッド内の

pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionShowAll);

っつーのを、

pEGLView->setDesignResolutionSize(designResolutionSize.height, designResolutionSize.width, kResolutionShowAll);

としましょう。
縦横を逆にしただけなんだけどね。

posted by B.cos at 00:56| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする

2013年11月17日

やっと動いた!!

device-2013-11-17-014013.png

「cocos2d-xによるiPhone/Androidアプリ プログラミングガイド」を参考に何度もトライエラーを繰り返して、やっとうちのXperiaでサンプルプログラムが動いた!

http://book.mynavi.jp/support/pc/4697/

超うれしい!!
制作環境はWindows8、Eclipse4.2(Pleiades/日本語版)。
Cygwinで出力先ディレクトリで変えるだけで2週間かかってダメだったことがあっさり解決して拍子抜け。(途中間違えたことをしてEclipse壊して脱線してしまったんだけど)

Windowsで開発する場合はUnix系列のOSじゃないためか、Cygwinってソフトを使いこなせたほうがいいみたい。(説明ちゃんと読んでないので、未だよくわかってないw)

とりあえず、これからだ。
昔作ったWindowsゲームをスマフォと現在のWindowsに移植することを目標に、少しずつでもチャレンジしていこう。
posted by B.cos at 01:53| Comment(0) | TrackBack(0) | cocos2d-x | このブログの読者になる | 更新情報をチェックする