2013年9月12日木曜日

cocos2d-xでCocosDenshion::SimpleAudioEngineのplayEffect()がresume時(background to foreground)に鳴らない問題対応

BGMは問題ないのだが、効果音(playEffect)が一度backgroundに移行後、再度foregroundに移行した時に鳴らない場合がある。
target os: iOS6.1
audio format: .caf
cocos2dx ver.: 2.1rc0-x-2.1.4

SimpleAudioEngine::playEffectを追ってみたら[CocosDenshion playSound:sourceGroupId:pitch:pan:gain:loop:]でも特にエラーが起きておらず、正常にOpenALのalSourcePlay()が呼び出されているようだ。loadも問題ないし原因不明。

ググったら公式フォーラムでちらほら報告があるだけ。
Sound FX not playing after a while.
http://www.cocos2d-x.org/boards/6/topics/3153
http://www.cocos2d-x.org/issues/2512

とりあえずの対処としてBackgroundに移行する時にend()して、Foregroundにresumeする時にアプリ起動時にpreloadすることで音を鳴らす事ができる(ただしpause~resumeではないので、途中から鳴らす事はできない。)
bool AppDelegate::applicationDidFinishLaunching()
{
    // some code ...

    CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("press_button.caf");
}
void AppDelegate::applicationDidEnterBackground()
{
    CCDirector::sharedDirector()->pause();
    CCDirector::sharedDirector()->stopAnimation();

    // end
    SimpleAudioEngine::sharedEngine()->end();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground()
{
    CCDirector::sharedDirector()->resume();
    CCDirector::sharedDirector()->startAnimation();

    // preloadEffect
    CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("press_button.caf");
}

ゲーム系で音が鳴らなくなるって結構致命的な気がするんだけど、v2.1.4stableとか、v3.xでは直ってるのかな。不明。

2013年9月2日月曜日

Google Analytics iOS SDK v2.0beta から v3.0への移行、変更点

Automatic Screen Measurement - 自動的な画面計測

// v2 -------
// SomeViewController.h
#import "GAITrackedViewController.h"
@interface SomeViewController : GAITrackedViewController
@end

// SomeViewController.m
- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  self.trackedViewName = @"Some Screen";
}

// v3 -------
// change "self.trackedViewName" to "self.screenName"


Manual Screen Measurement - 手動での画面計測

// v2 -------
[[[GAI sharedInstance] defaultTracker] sendView:view]; // or trackView:view

// v3 -------
#import "GAIFields.h"
#import "GAIDictionaryBuilder.h"
[[[GAI sharedInstance] defaultTracker] set:kGAIScreenName value:view];
[[[GAI sharedInstance] defaultTracker] send:[[GAIDictionaryBuilder createAppView] build]];


Event Tracking - イベントのトラッキング

// v2 -------
[[[GAI sharedInstance] defaultTracker] sendEventWithCategory:category withAction:action withLabel:label withValue:value];

// v3 -------
#import "GAIDictionaryBuilder.h"
[[[GAI sharedInstance] defaultTracker] send:[[GAIDictionaryBuilder createEventWithCategory:category action:action label:label value:value] build]];

初期化時は[GAI sharedInstance].debugがなくなったくらい。