2017年2月1日水曜日

古いandroidアプリにfacebookSDK入れる時にやったこと

cocos2d-x 2.2.6 android gradle

minSdkVersionを15に上げる。
compileSdkVersion, targetSdkVersion 23に上げる。
Cocos2dxBitmap.javaのFloatMathをMathに変更
org.apacheがないと言われるので、追記

android {
   useLibrary 'org.apache.http.legacy’
}

2014年8月22日金曜日

[Android] 課金のテスト時の注意点

先日、いつもの様にgoogleplayにapk上げて、課金アイテムを登録し、 テストしてみたら何も帰ってきませんでした。 何か設定間違ったのかとしばらくハマってました。
で、ググったらこれが見つかりました。

http://stackoverflow.com/questions/24835180/android-inapp-billing-responselist-is-empty

要は、少なくともアルファかベータ版のapkを"公開"しないとテストも出来ませんってことらしいです。 いつのまにか仕様が変わってました。
古いブログにはこのことが書いてなかったりするので注意が必要です。

2014年1月27日月曜日

【cocos2d-x 2.2】はみ出さないCCLabelBMFont

最近作ってるゲームではBitMapFontしか使ってません。
cocos2d-xなので、CCLabelBMFontを使ってるのですが、widthに合わせて文字がちっちゃくなったりしないので、
文字数オーバーすると画面からはみ出たりでめんどくさいです。
というわけで、widthを制限して超えると縮むラベルを作りました。
見づらいけど、全文記載します。

ScaleLabelBMFont.h
#ifndef __ScaleLabelBMFont__NODE_H__
#define __ScaleLabelBMFont__NODE_H__

#include "cocos2d.h"

USING_NS_CC;


class ScaleLabelBMFont : public CCLabelBMFont
{
public:
    static ScaleLabelBMFont* create(const char *str, const char *fntFile, float limitWidth, float currentScale);
 virtual bool init(const char *str, const char *fntFile, float limitWidth, float currentScale);
    virtual void updateLabel();
    
    CC_SYNTHESIZE(float, _limitWidth, LimitWidth);
    CC_SYNTHESIZE(float, _currentScale, CurrentScale);
};

#endif // __ScaleLabelBMFont__NODE_H__

ScaleLabelBMFont.cpp
#include "ScaleLabelBMFont.h"

ScaleLabelBMFont* ScaleLabelBMFont::create(const char *str, const char *fntFile, float limitWidth, float currentScale)
{
    ScaleLabelBMFont * pRet = new ScaleLabelBMFont();
    if (pRet && pRet->init(str, fntFile, limitWidth, currentScale)) {
        pRet->autorelease();
    } else {
        CC_SAFE_DELETE(pRet);
    }
    return pRet;
}

bool ScaleLabelBMFont::init(const char *str, const char *fntFile, float limitWidth, float currentScale)
{
 if ( !CCLabelBMFont::initWithString(str, fntFile) )
 {
  return false;
 }
    
    _limitWidth = limitWidth;
    _currentScale = currentScale;
    setScale(_currentScale);

 return true;
}

void ScaleLabelBMFont::updateLabel()
{
    CCLabelBMFont::updateLabel();
    if ((getContentSize().width * _currentScale) > _limitWidth) {
        float scaleX = _limitWidth / getContentSize().width;
        if (getScaleX() != scaleX) {
            setScaleX(scaleX);
        }
    }
}

2013年7月21日日曜日

【cocos2d-x】CCSeqenseがリリースビルドで動かなかったお話。

cocos2d-x2.1.3でのお話です。
例えば0.5秒後にメソッドを呼びたいとき。
CCSequence *seq = CCSequence::create(CCDelayTime::create(0.5),
                                                                CCCallFunc::create(this, callfunc_selector(HogeScene::hoge)));
runAction(seq);
とか書いたりします。
これ、本来なら動きません。クラッシュします。
CCSeqenseには最後にNULLを入れなければいけないからです。
CCSequence *seq = CCSequence::create(CCDelayTime::create(0.5),
                                                                CCCallFunc::create(this, callfunc_selector(HogeScene::hoge)),
                                                                NULL);
runAction(seq);

正しくはこっちですね。
CCSequence *seq = CCSequence::createWithTwoActions(CCDelayTime::create(0.1),
                                                                                         CCCallFunc::create(this, callfunc_selector(MainScene::pressBtn)));
runAction(seq);
もしくはこう。
しかし、一番上のコード、動いちゃいます。
debugビルドのみ。
シミュレーターでも実機でもふつうに動きます。
ただ、リリースビルドでクラッシュします。かなりの罠です。
なので、CCSeqenseで2つのActionしか使わないときは
CCSequence::createWithTwoActions() を使いましょう。
もしくは単に遅延させてメソッド呼びたいならscheduleOnce使ってもいいです。というかそっちのがいいかも。

2013年6月19日水曜日

【cocos2d-x】アプリがバックグラウンドから復帰した時にSceneのメソッドを呼ぶ。

アプリがバックグラウンドから復帰した時などに現在のシーンにアクセスする方法です。 時間をとって画面を変化させたいときなどに使えます。
viewDidAppearとかviewWillAppearみたいなのが無さそうなので。(あったら教えて下さい)
HelloWorldSceneのhogeメソッドを読んでいます。

AppDelegate.cpp
void AppDelegate::applicationWillEnterForeground()
{
    CCDirector::sharedDirector()->startAnimation();
    SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
    SimpleAudioEngine::sharedEngine()->resumeAllEffects();

     // getRunningSceneでCCSceneをとってその上のレイヤーにアクセスする。
    CCLayer *sceneLayer = (CCLayer*)CCDirector::sharedDirector()->getRunningScene()->getChildren()->lastObject();
    if (typeid(*sceneLayer) == typeid(HelloWorld)) {
        HelloWorld *helloWold = (HelloWorld*)sceneLayer;
        helloWold->hoge();
    }
} 
getRunningSceneでそのままアクセスできると思ってしばらくハマってました。
sceneメソッド見て納得。

2013年6月5日水曜日

【cocos2d-x】前回の時間から"日付上"1日以上経過してるかチェックする。

0時更新のログインボーナスなどで使う感じ。 なんか便利な関数とかあるかも。

bool HogeScene::init() {
    if (!CCLayer::init()) {
        return false;
    }
    // 前回の時間をとる
    time_t previousTime = (time_t)CCUserDefault::sharedUserDefault()->getIntegerForKey("previousTime", 0);
    
    if (isOneDayCourse(previousTime)) {
        // 一日経過してたなら現在時刻をセット(初回時も)
        CCUserDefault::sharedUserDefault()->setIntegerForKey("previousTime", (int)time(NULL));
    }
    
    return true;
}
bool HogeScene::isOneDayCourse(time_t time)
{
    // 現在の日付
    struct tm *nowDate;
    time_t now;
    time(&now);
    nowDate = localtime(&now);
    int nowDay = nowDate->tm_mday;
    int nowMon = nowDate->tm_mon;
    int nowYear = nowDate->tm_year;
    // 前回の日付
    struct tm *previousDate;
    time_t previousTime = time;
    previousDate = localtime(&previousTime);
    int previousDay = previousDate->tm_mday;
    int previousMon = previousDate->tm_mon;
    int previousYear = previousDate->tm_year;
    // 差分
    int diffDay = nowDay - previousDay;
    int diffMon = nowMon - previousMon;
    int diffYear = nowYear - previousYear;
    
    // 日付上一日以上経過でtrue
    if (diffDay || diffMon || diffYear) {
        return true;
    }
    return false;
}

2013年1月13日日曜日

【cocos2d-x】CCARRAY_FOREACHの使い方(一例)

addChildされてるCCNode等を継承したHogeクラスだけを操作したい時のコードです。

CCArray *children = this->getChildren();
CCObject *obj;
    
CCARRAY_FOREACH(children, obj){
    if (typeid(*obj) == typeid(Hoge)) {
        // Hogeクラスを操作
    }
}