2015年12月24日木曜日

error: Error retrieving parent for item: No resource found that matches the given name '@android:style/ Theme.Material.Light.DialogWhenLarge.NoActionBar'.

どうも、俺です。

eclipseを使ってAndroidアプリ開発中に、
組み込んだgoogle-play-serviceでタイトル通りのエラーがでたときの対応。

error: Error retrieving parent for item: No resource found that matches the given name '@android:style/ Theme.Material.Light.DialogWhenLarge.NoActionBar'.

eclipseの設定をイジってしまったのだと思いますが、どこをどうイジったのか全く覚えておりません。
修正を色々試みたところ、
StackOverflowに似たようなエラーで困っている人発見!

今回の僕の場合、
appinvite_style.xmlに記述されている
Theme.Material
APIレベル21以上で利用できる、とのことなので、
google-play-serviceプロジェクトの
プロパティ>Android>Project Build Target
をAPI21にして修正完了。


以上でぇぇぇぇぇぇぇぇす。。

2015年12月22日火曜日

cocos2d-x CCRenderTextureでゲーム中のスクショを撮るときの注意点

どうも、俺です。

cocos2d-x (v2.2.6)でTwitter投稿用に画面のキャプチャを撮る処理を実装
したのですが、
キャプチャした時にCCParticleSystemでパーティクルを表示していると画面が真っ黒になってしまう問題に遭遇しました。
※すべてのパーティクルでなる訳ではありません。むしろ一部のパーティクルでのみ発生。
※iOSでのみ確認しましたが、恐らくAndroidでも同様のはず..。


赤いプレイヤーのうしろにある炎がパーティクルです。

キャプチャーの撮影処理は、
CCRenderTexture *AppDelegate::takePicture()
{
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    CCRenderTexture *texture = CCRenderTexture::create((int)size.width,
                                                       (int)size.height,
                                                       kCCTexture2DPixelFormat_RGBA8888,
                                                       GL_DEPTH24_STENCIL8_OES);
    
    texture->setPosition(ccp(size.width * 0.5f, size.height * 0.5f));
    
    texture->begin();
    CCDirector::sharedDirector()->getRunningScene()->visit();
    texture->end();
    
    return texture;
}
のように処理しています。

この処理のままパーティクル描画ある画面をキャプチャすると、、

このように、パーティクル部分が黒くなってしまいます。

これは利用している炎のパーティクルのccBlendFunctionを変更することで対応できます。
今回の場合は、
    ccBlendFunc blend;
    blend.src = GL_ONE_MINUS_SRC_ALPHA;
    blend.dst = GL_ONE;
    _myFireParticle->setBlendFunc(blend);
    
    CC_SAFE_RELEASE_NULL(_screenShot);
    CCRenderTexture *screenShot = AppDelegate::takePicture();
    CC_SAFE_RETAIN(_screenShot);
    
    blend.src = GL_ONE_MINUS_SRC_ALPHA;
    blend.dst = GL_DST_ALPHA;
    _myFireParticle->setBlendFunc(blend);

このようにすることで対応できました。
※_myFireParticleは炎のCCParticleSystemインスタンス。

利用するccBlendFuncは、元のパーティクルが崩れない最も適したもので色々試してみてください。


以上でぇぇぇぇぇぇぇぇす。