忍者ブログ
  • 2024.10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/22 19:07 】 |
androidでcocosのリリースモードを作成
一応、BuildVariantsで選択してから通常通りビルドできる



が、なぜか上手くいかない。
リリースビルドをSignedでないAPKで作成することになるので、エラーになる


リリースモードは、SignedAPKを作成するのが良い。



Signedについては、build.gradle内に記述できる。
Project Structureにも、Signedタブがある(同じ)


C++の部分については、jni/Application.mkに記述できる

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -std=c++11 -fsigned-char
APP_LDFLAGS := -latomic

APP_CPPFLAGS += -DCC_TARGET_OS_ANDROID=1

ifeq ($(NDK_DEBUG),1)
APP_CPPFLAGS += -DCOCOS2D_DEBUG=1
APP_CPPFLAGS += -DDEBUG=1
APP_CPPFLAGS += -DENABLE_TESTFLIGHT_DEBUG=1
APP_OPTIM := debug
else
APP_CPPFLAGS += -DNDEBUG
APP_OPTIM := release
endif



ここで、NDK_DEBUG の値は
build.gradleの

debug {
jniDebuggable true
}


で決まる。


なお、C++部分の定義なので、AndroidStudioからのビルドだけでなく、

$ cocos compile -p android --android-studio --ndk-mode release

が必要なことに注意

PR
【2016/03/18 23:12 】 | cocos2d-x | 有り難いご意見(0)
cocos compileのコマンド
プロジェクト(正確にはソースディレクトリ)を指定する(-s)
$ cocos compile -s path/to/project -p android --android-studio

NDKをリリースモードでビルドする(--ndk-mode)
$ cocos compile -p android --android-studio --ndk-mode release

コンパイルをデバッグモードで行う(ログがたくさん出るのか?)(--debug)
$ cocos compile -p android --android-studio --debug

ヘルプ
$ cocos compile --help
(cocos --help ではない)
【2016/03/18 23:03 】 | cocos2d-x | 有り難いご意見(0)
cocos2d-x Androidで気づくバグ
・テクスチャの最大サイズは 2048x2048
なまじiOSだと動いちゃうので気づきにくい
D/cocos2d-x debug info: cocos2d: WARNING: Image (2984 x 2042) is bigger than the supported 2048 x 2048

【2016/02/29 17:47 】 | cocos2d-x | 有り難いご意見(0)
cocos2d-xでプラットフォームを判定
Xcodeだと、
CC_TARGET_OS_IPHONE
というマクロが定義されているので、これを使用するのが良い。

#if defined CC_TARGET_OS_IPHONE


Androidの場合、
app/jni/Application.mk
に以下を記述する
APP_CPPFLAGS += -DCC_TARGET_OS_ANDROID

すると、こう書けるようになる
#ifdef CC_TARGET_OS_ANDROID


まとめると、

#if defined CC_TARGET_OS_IPHONE
//ios
#elif defined CC_TARGET_OS_ANDROID
//android
#endif



となる。


マクロでなく実行中に判定したい時は

if (cocos2d::Application::getInstance()->getTargetPlatform() == cocos2d::Application::Platform::OS_ANDROID) {
}
else if (cocos2d::Application::getInstance()->getTargetPlatform() == cocos2d::Application::Platform::OS_IPHONE ||
cocos2d::Application::getInstance()->getTargetPlatform() == cocos2d::Application::Platform::OS_IPAD) {
}


という書き方もできる





以下、次善策


#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
#elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
#endif

このような感じで書く。

気をつけないといけないのは、
#include "Cocos2d.h"
または
#include "cocos/platform/CCPlatformConfig.h"
をしていないファイルでこの記述を書いても正しく動作しないということ。

CC_TARGET_PLATFORMもCC_PLATFORM_IOSもどちらもundefinedだと、
等号自体は成り立ってしまうため

だから
#if defined(CC_TARGET_PLATFORM) && (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

というような書き方であるべき

【2016/02/29 14:59 】 | cocos2d-x | 有り難いご意見(0)
無題
RenderTexture のインスタンスを作る

texture->begin();
node->visit();
texture->end();

RenderTextureは、「ノード」を描画する。「画面」を描画するわけではない。
描画したい「ノード」(以降、ターゲットノードと呼ぶ)を、通常のdrawと同様に行うだけ。
だから、ターゲットノードに、setPosition()が入っていると、その分描画がずれてしまう。

これをRenderTextureのメソッドで修正するのは、ちょっと考え方が違うし、やりにくい
(setVirtualViewport()で変更できるが。後述)

簡単な対処として、
描画前にターゲットノードにsetPosition(0,0)を行い、
描画が終わってから元の座標を再代入することが考えられる…(A)

少しスマートな方法として、ターゲットノードは、その上にダミーノードを作り、
ダミーノードにsetPosition()をしておき、描画したいノードそのものにはsetPosition()しないのが良いと思われる…(B)

が、このやり方でも問題が。
renderするとなぜか、ノードが画面(親ノードではない)の左下隅に移動してしまうという問題が起きた

原因は詳しく追っていないが、
想像できるのは
OpenGLのビューポート指定が(0,0,w,h)の形であり、
これだと画面の左下を切り取って描画する形になっている。
それに合わせるため、ノードを画面左下に配置して描画しているということだろうか
実際、上記の(A)の時は、この問題が起きていない。描画後にsetPosition()をしているからだろうか。


結局、
「ターゲットノードと同じものをもう一度作り、それを描画する」
という形に落ち着いた。一番無駄な形に…



RenderTexture.cpp

//calculate viewport
{
Rect viewport;
viewport.size.width = _fullviewPort.size.width;
viewport.size.height = _fullviewPort.size.height;
float viewPortRectWidthRatio = float(viewport.size.width)/_fullRect.size.width;
float viewPortRectHeightRatio = float(viewport.size.height)/_fullRect.size.height;
viewport.origin.x = (_fullRect.origin.x - _rtTextureRect.origin.x) * viewPortRectWidthRatio;
viewport.origin.y = (_fullRect.origin.y - _rtTextureRect.origin.y) * viewPortRectHeightRatio;
//glViewport(_fullviewPort.origin.x, _fullviewPort.origin.y, (GLsizei)_fullviewPort.size.width, (GLsizei)_fullviewPort.size.height);
glViewport(viewport.origin.x, viewport.origin.y, (GLsizei)viewport.size.width, (GLsizei)viewport.size.height);
}

【2016/02/04 17:22 】 | cocos2d-x | 有り難いご意見(0)
サウンド読み込み

読み込み処理をしている場所
どうも同期的に読んでいるように見える


CDAudioManager.m
audioSourcePlayer = [(AVAudioPlayer*)[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
【2016/02/01 15:02 】 | cocos2d-x | 有り難いご意見(0)
セーブにかかる時間
cocos2dのセーブには2種類ある

Dictionary
UserDefaults

このうち、Dictionary はすでに deprecated になっているので、
UserDefaults を使うことになるのだが
こちらはセーブに時間がかかる

300変数をセーブすると4秒とかかかったりする


ただしこれはセーブのタイミングによっても変わるし、
なんどもセーブしていると段々早くなる。

使うときはよく考えて行うべし

【2016/01/27 15:58 】 | cocos2d-x | 有り難いご意見(0)
libchipmunk のduplicateエラー
cocos2dで作ったゲームプロジェクトを
古いシミュレータ対象でビルドすると、以下のようなエラーが出ることがある。



libchipmunk内で、多くのシンボルが多重定義されているというエラー。
おそらく、libchipmunkが2重にビルドされているのだろう。
なぜそういうことが起きるのが、という追求は別にする必要はなく、
libchipmunk自体使っていないので、ビルド対象から外して仕舞えば良い。

その方法は、以下のリンク先にある。
参考

プロジェクトの Build Phases の
Target Dependencies から libchipmunk を削除。
また、
Link Binary With Libraries からも削除。


これでこのエラーは起きなくなる。
【2016/01/18 17:20 】 | cocos2d-x | 有り難いご意見(0)
swapBuffers エラーが出るときは
動画広告を表示して戻ってきたときなど、
画面が更新されなくなる時がある
描画以外の処理はちゃんと実行されているので、音は鳴るし、操作もできる(ただし画面は動かない)

そんな時は、以下の処理を行う

動画広告を表示する前

#import "cocos2d.h"
#import "SimpleAudioEngine.h"

CocosDenshion::SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
CocosDenshion::SimpleAudioEngine::getInstance()->pauseAllEffects();
cocos2d::Director::getInstance()->stopAnimation();



動画広告が終わり、戻ってくる時

#import "cocos2d.h"
#import "SimpleAudioEngine.h"

cocos2d::Director::getInstance()->startAnimation();
CocosDenshion::SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
CocosDenshion::SimpleAudioEngine::getInstance()->resumeAllEffects();



これにて解決。
【2015/12/08 13:19 】 | cocos2d-x | 有り難いご意見(0)
シミュレータ向けビルド時にエラー
古いcocos2dで(3.3以前くらい)ビルドしたとき、以下のようなエラーが出るときがある。



つまり、
fputs$UNIX2003()
という関数がない、というのだ。($以降も含めて関数名。そんな付け方できたのか)

探してみると、自分で定義を追加すればいいというブログがある。
参考

使っているのは、CCImage.hらしい。
(このあたり、実装した人が勝手気ままにいろいろ外部関数を使っている感じがするのがcocos2dらしい)


で、当のCCImage.hファイルを探してみる。

cocos/platform/CCImage.h
cocos/platform/CCImage.cpp

にある。
でも見てみると、cppのほうにすでにそれっぽい実装がしてある(cocos2d バージョン3.2)


extern "C"
{
// To resolve link error when building 32bits with Xcode 6.
// More information please refer to the discussion in https://github.com/cocos2d/cocos2d-x/pull/6986
#if defined(__APPLE__) || defined(__unix)
#ifndef __ENABLE_COMPATIBILITY_WITH_UNIX_2003__
#define __ENABLE_COMPATIBILITY_WITH_UNIX_2003__
#include
FILE *fopen$UNIX2003( const char *filename, const char *mode )
{
return fopen(filename, mode);
}
size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )
{
return fwrite(a, b, c, d);
}
char *strerror$UNIX2003( int errnum )
{
return strerror(errnum);
}

#endif
#endif



なので、この後ろにfputsを追加


int fputs$UNIX2003(const char *res1, FILE *res2)
{
return fputs(res1,res2);
}




これで動いた。


【2015/10/05 17:36 】 | cocos2d-x | 有り難いご意見(0)
<<前ページ | ホーム | 次ページ>>