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年08月07日

シフトシューター - 弾幕相殺ごり押し対戦シューティング、の紹介

シフトシューター - 弾幕相殺ごり押し対戦シューティング
https://play.google.com/store/apps/details?id=com.matsukesoft.Sh2&hl=ja



このゲームはステキです。
何がステキかって、タイマンであることと、指一本で操作することにこだわってよく工夫している点です。

スマホのアクションゲームというのはほとんどゲームコントローラーを模したボタンをスクリーンに置いてしまいがちです。
それはプレイヤーにも比較的伝わりやすいし、他にアイデアがないならば間違いではないでしょう。
ただし指で画面の視界が狭まること、コントローラーと違って押した感触がないため思い通りに操作できているのか混乱する、という2点のデメリットがあります。

そこでコントローラーをスクリーンに貼るのではなく、画面全体をセンサーにして一本の指の挙動だけでキャラを動かす、という選択は一つの正解だと僕は考えています。

シフトシューターは単一のタップがキャラの上移動と攻撃を兼ねているので少々のクセはあって最初は戸惑いますが、上下左右のスワイプと合わせていろんなことができるのでそのうち楽しくなってきます。
(とはいっても僕はゲームは作れても基本へたくそなのでまだ序盤で詰まっていますw)
指一本で移動、射撃、防御、レーザー、ため攻撃などなどが可能で、成長のさせ方で遊び方も変わる。
ボリュームもあって、お得な逸品です。
ポチポチゲームに飽きてきたならば、一度手に取ってみて損はないと思います。

今までゲーム機やPCであったジャンルのゲームをスマホ用に落とし込む際はスマホ用の工夫が必要になると思っているのですが、シフトシューターはその可能性のひとつを示していると僕は考えています。
指一本で自由に操作するために残しておくところと、削るべきところをちゃんと明確にして精査するということはデザイン能力の見せ所だと思います。

少し言葉足らずですが今日はここまで。

posted by B.cos at 00:44| Comment(0) | TrackBack(0) | ゲームレビュー | このブログの読者になる | 更新情報をチェックする

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年11月23日

「GROUNDLESS」単行本化と影待蛍太さんという漫画家。

DSC_2229.jpg


無料版は本家HP、有料からは「パブー」で読んでたWEBコミックの「GROUNDLESS」が単行本化されていた。
やはり紙の本のほうが読みやすい。
話は何もかもを失った武器商人の未亡人が狙撃手としての生き方を選んだって話なんだけど、細かいこと抜きでとても面白い。
舞台は島国アストリア、人種差別、主権国と属国、伝染病「腸腐れ」、市民解放軍、島軍、各町の自警団、複雑すぎる事情のなかで登場人物が「いろいろな事情」をもって生きてる、その人物描写だけでも僕はおなか一杯になる。

作者の影待蛍太さんを知ったのには5,6年くらい前にみた2ちゃんのWEB漫画まとめで、そこの読み切りが病気退職してしばらく呆けてたときの気持ちとシンクロするところもあったんだけど、深くのめりこんでしまったんですね。
ホームページ:http://www.coldturbine.com/
無料漫画:http://www.coldturbine.com/manga_free.html

GROUNDLESSもそうなんだけど、影待蛍太という作家の描く「周囲との距離の取り方が下手な人間」とその「周囲」の感覚が、僕だけかもしれませんが、リアリティがあるんです。
特に眼が猫と同じで、猫と同じく夜行性で差別の対象になってる主人公を描いた「猫眼」、主人公と会社同僚の本音が交錯して実はすれ違っていたときの居心地の悪さは秀逸だと思った。
ネガな人間の気持ちの微細な部分を描くのがうまいな、と思ったのですよ。
猫眼:http://www.coldturbine.com/nekome01.html

P.S.GROUNDLESSは最初の方と最新話だけ無料でもみられます。
http://www.coldturbine.com/manga_ppv.html
posted by B.cos at 00:18| Comment(0) | TrackBack(0) | 書籍 | このブログの読者になる | 更新情報をチェックする

2014年11月01日

漫画「あさひなぐ」をおすすめしたい!

あさひなぐ 13(試し読みあり)
http://www.shogakukan.co.jp/comics/detail/_isbn_9784091865090

1414772605624.jpg 1414772575253.jpg 1414772616434.jpg

あさひなぐ13巻読了。
あいもかわらず名セリフ満載だった。
さくらちゃん復帰の言葉がワナビー思想が蔓延してた世代の僕には印象的だった。
自分にとって大切な何か=自分が一番上手にできること、ではない。
結果はどうあれ続けられるかだ。
要は愛だ(恥)

この漫画はもっと知れわたってもいいと本当に思ってる。
適度に健康的で過激に走ることはない、力みすぎもしない。
だけど、「努力する」「強くなること」の厳しさとすばらしさを多彩な視点から具体性をもってここまで純粋にメッセージ化している漫画は僕は見たことがない。
「戦う」競技をしている人たちにこそおすすめしたい。
薙刀や剣道だけじゃない、強くなりたい、負けたくないと思ったときの気持ちはやはり共通すると思う。

ま、どんなに胸ときめく展開になっても、防具の匂いで台無しになるんですけどね!
特に篭手で!!(笑)
posted by B.cos at 01:53| Comment(0) | TrackBack(0) | 書籍 | このブログの読者になる | 更新情報をチェックする

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 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。