Compile++ thumb : cocos2dx_static <= CCCommon.cpp In function 'void cocos2d::CCLog(char const*, ...)': CCCommon.cpp:44:72: error: format not a string literal and no format arguments [-Werror=format-security] CCCommon.cpp: In function 'void cocos2d::CCLuaLog(char const*)': CCCommon.cpp:54:77: error: format not a string literal and no format arguments [-Werror=format-security]

jni 폴더의 Application.mk 파일에 다음 라인을 마지막에 삽입하면 오류 없이 컴파일이 진행됩니다.

( 혹은 APP_CPPFLAGS의 마지막에 -Wno-error=format-security 를 추가해줘도 됩니다. )


APP_CFLAGS += -Wno-error=format-security



근데 이게 매번 프로젝트 생성해줄때마 해주는게 번거롭다는 생각이 들었습니다...

쭉 살펴보니, cpp 프로젝트의 경우 sample/HelloCpp/proj.android 에서 template을 끌어오는걸 확인했네요.

( 왜 template 폴더가 아닌거야 응? -_- )


cocos2d-x root 디렉토리의 sample/HelloCpp/proj.android/jni/Application.mk 파일 맨 아래에도 위 라인을 삽입해주면 앞으로 생성되는 프로젝트는 다 달려서 나옵니다.


혹은 예전 버전 빌드의 경우 ndk가 낮은 버전이 필요하게 될 수 도 있다.


http://dl.google.com/android/ndk/android-ndk-r9b-darwin-x86_64.tar.bz2

위 링크가 OS X용 r9b 버전을 받기 위한 주소인데


http://dl.google.com/android/ndk/android-ndk-r8e-darwin-x86_64.tar.bz2

이렇게 링크를 변경하여 브라우저에서 링크를 띄우면 OS X용 r8e 버전을 받을 수 있다.


너무 쉬워서 그런가 안내글이 별로 없길래 글 쓴다.

Posted by maysent
:

pugixml cocos2d-x

Cocos2Dx 2013. 10. 9. 18:32 |

cocos2d-x에서 xml parser를 사용하려고 이것저것 찾아봤는데, 소스코드 내에서 CCSAXParser라는 것을 발견하였지만 어떻게 사용하는지 몰라서 포기! 결국 찾다 찾다 pugixml이 가장 나은 것 같아서 이를 사용하게 되었다.

 

http://www.cocos2d-x.org/boards/6/topics/11313

위 주소를 참고해서 사용하게 되었는데~

 

우선 그냥 pugixml을 사용해서 cygwin을 이용해 빌드하면 에러가 난다!(ndk-r8 기준)

 

에러인 즉슨 g++ 컴파일러를 기본옵션으로 돌릴 때 throw 를 지원하지 않기 때문인듯 하다.

에러 내용은 무슨 -fexception 명령옵션을 사용해서 throw를 멈춰라.. 뭐 이런거였는데..

해결은 pugixml.cpp의 최 상단의 헤더 선언부 바로 아래에 PUGIXML_NO_EXCEPTIONS를 define해줬다.

 

즉, #define PUGIXML_NO_EXCEPTIONS 만 선언해 주면 끝.

내용을 보니까 PUGIXML_NO_EXCEPTIONS가 ifdef돼있는 경우 exception을 사용하지 않게 돼있더라~

 

그리고..

win32환경의 cocos2d-x에서는 load_file로도 xml이 잘 읽히지만, 문제는 android환경에서 돌릴때 이다.

assets에 있는 png나 jpg는 잘 읽으면서 그 외의 리소스는 잘 못 읽더라.

xml을 읽게 하기 위해서는 load_file이 아니고 다른걸 써야 하더라! 이 역시 위의 블로그를 참조했다.

 

길게 설명하면 귀찮으니 소스 한방으로 끝내자면...

 

 


안드로이드는 APK로 압축이 되어서 fopen 을 이용하는 함수가 제대로 안 먹힙니다.


그래서 pugixml을 load_file을 쓰면 안되고,  아래처럼 getFileData과 load_buffer를 이용해야 합니다.

    CCString *strXML = CCString::createWithFormat("data/crosswords/set%02d.xml", stage);
    unsigned long fileSize = 0;
    unsigned char *buffer = CCFileUtils::sharedFileUtils()->getFileData(strXML->getCString(), "r",&fileSize);
    xml_document xmlDoc;
    xml_parse_result result= xmlDoc.load_buffer(buffer, fileSize);

    if(!result) {
        CCLog("Error description: %s", result.description());
        CCLog("FileName: %s", strXML->getCString());
        CCLog("Error offset: %d", result.offset);
        return false;
    }

 

 


C++에서는 boost::serialization을  쓰는게 편한것을 알았고..  C#에서는 XML로 바로 serialization이 되기에 문제가 없지만..

 

그러면 cocos2d-x에서 파일저장을 위해 그 큰 boost::serialization을 쓸수 없진 않은가?

 

결국 XML 을 쓰긴 써야하는데 뒤져보니 아래와 같은 글에서 pugixml 을 사용하고 있당.. 쉬운것 같당...헤헤

http://roter.tistory.com/archive/20120717

 

괜히 tutorial 적당히 읽어보고 바꾸다가 삽질을 더 했지만,

어렵게 static 만들 필요 없이...

 

pugiconfig.hpp 에서

 

 #define PUGIXML_NO_EXCEPTIONS  // cygwin의 빌드를 위해서..

 

 #define PUGIXML_HEADER_ONLY
 #include "pugixml.cpp"

 

이것만 주석해제하고..

 

android.mk에서

LOCAL_CPPFLAGS += -fexceptions

 

한줄 추가했지롱

 

자 다음 문제는....

pugixml 의 예제대로 loadXML, SaveXML을 사용하면.. 안드로이드 기계에서는 경로를 제대로 못찾아 에러가 납니다...

 

1. 내가 저장하는 것이나 내가 런타임에서 저장한 파일 불러오려면

  안드로이드 기계에서 저장가능한 경로를 찾아야 하므로

 

pugi::xml_document doc2;
    doc2.load("<mesh name='Save_HwangJe'/>");
 
 std::string filePath = CCFileUtils::sharedFileUtils()->getWriteablePath();
 filePath.append("save_file_output.xml");

 

이런식으로 getWriteablePath를 불러준다..

 

2. 리소스폴더에 이미 저장된거 불러올 경우

 리소스폴더에서 불러오는 경로는 아래와 같이 이미 스프라이트 로드할때부터 사용

std::string fullPath = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("XML/save_file_output.xml");

이러면 Resource/Xml/save_file_output.xml  불러온데이

 
Posted by maysent
:

CCScrollView 사용법

Cocos2Dx 2013. 8. 10. 17:25 |

 CCLayerColor *layer = CCLayerColor::create(ccc4(0,0,255,255));
 layer->setContentSize(CCSize(480,1000));


 CCScale9Sprite *spr = CCScale9Sprite::create("extensions/green_edit.png");
 spr->setContentSize(CCSize(400,50));
 spr->setPosition(ccp(240,900));
 layer->addChild(spr);

 CCScale9Sprite *spr2 = CCScale9Sprite::create("extensions/yellow_edit.png");
 spr2->setContentSize(CCSize(400,50));
 spr2->setPosition(ccp(240,100));
 layer->addChild(spr2);

 CCScrollView *scroll = CCScrollView::create(CCSize(480,320));
 scroll->setContainer(layer);
 scroll->setContentSize(layer->getContentSize());
 scroll->setAnchorPoint(CCPointZero);
 scroll->setPosition(ccp(0,0));
 scroll->setDirection(kCCScrollViewDirectionVertical);
 scroll->setContentOffset(ccp(0,-(1000-320))); // 시작위치 설정
 // kCCScrollViewDirectionBoth, kCCScrollViewDirectionHorizontal, kCCScrollViewDirectionVertical, kCCScrollViewDirectionNone

scroll->setContentOffsetInDuration(ccp(0,0), 5.0); // 자동 스크롤
 scroll->setBounceable(true);
 this->addChild(scroll);

Posted by maysent
:
private:
map<CCObject*, bool> enableTable;
public:
void setDisableWithRunningScene()
{
CCScene* runningScene = CCDirector::sharedDirector()->getRunningScene();
_setDisableWithRunningScene(runningScene);
}
void restoreDisable()
{
for(auto iter = enableTable.begin(); iter != enableTable.end(); ++iter)
{
CCMenuItem* menuItem = dynamic_cast<CCMenuItem*>(iter->first);
if(menuItem)
{
menuItem->setIsEnabled(iter->second);
}

CCLayer* someLayer = dynamic_cast<CCLayer*>(iter->first);




if(someLayer)
{
someLayer->setIsTouchEnabled(iter->second);
}
}
}
private:
void _setDisableWithRunningScene(CCNode* node)
{
CCMenuItem* menuItem = dynamic_cast<CCMenuItem*>(node);
if(menuItem)
{
enableTable[menuItem] = menuItem->getIsEnabled();
menuItem->setIsEnabled(false);
}
CCLayer* someLayer = dynamic_cast<CCLayer*>(node);
if(someLayer)
{
enableTable[someLayer] = someLayer->getIsTouchEnabled();
someLayer->setIsTouchEnabled(false);
}
if(node->getChildrenCount())
{
CCArray* children = node->getChildren();
for(int i=0; i<children->count(); i++)
{
_setDisableWithRunningScene((CCNode*)children->objectAtIndex(i));
}
}
}
_setDisableWithRunningScene 안에 들어가는 인자를 포함해서 아래 child 탐색하면서 모두 터치 불가능하게 만듭니다.

그리고 restore 하시면 기억한 정보를 바탕으로 다시 터치 유/무 를 복구시킵니다.

restore 시, 사라진 객체에 대한 처리는 없습니다. 예외 처리를 하실 일 있으면 직접 하셔야 합니다~~

그리고 restore 로 복구 하시면 됩니다. 자체 AlertView 만드시는 분들이나 팝업창 만들고 다른것 클릭 안되게 하실 분 쓰시면 유용합니다.

 


좋은 정보 공유감사합니다.

그런데 alertview같은 팝업을 띄우고, 그 뒤의 화면에 대한 터치를 막으려면 저 방법보다는 

alertview 클래스에서 touch를 등록할때 standard touch가 아닌, targeted touch로 등록을 하면 간단하게 됩니다.

targeted touch를 등록할 때 swallow(다른 터치를 꿀꺽 삼킬지 여부) 인자를 넣어주는 부분이 있습니다.^^

 


그런식으로 하면 CCMenu 를 이용한 터치는 어떻게 피할 수 있나요? 뒤에 깔린 CCMenuItem 터치는 피할 수 없던데요

 


touch priority를 -128보다 작은 값으로 주세요.

CCMenu의 touch priority가 -128이기 때문에 그것보다 작은 값을 사용하면 먼저 터치를 처리할 수 있습니다. 

'Cocos2Dx' 카테고리의 다른 글

pugixml cocos2d-x  (0) 2013.10.09
CCScrollView 사용법  (0) 2013.08.10
Sprite 텍스처 교체  (0) 2013.06.06
cocos2dx android 프로젝트 생성 시 오류 해결 법.  (0) 2013.06.01
CCLog 한글 출력 가능하게 만들기  (0) 2013.06.01
Posted by maysent
:

Sprite 텍스처 교체

Cocos2Dx 2013. 6. 6. 20:41 |

void GameScene::swapSpriteTexture(CCSprite *a, CCTexture2D **b)
{
    CCTexture2D *tmp = a->getTexture();
    a->setTexture(*b);
    *b = tmp;
}

 

* 사용법

m_TextureSlot=(CCTexture2D *)CCTextureCache::sharedTextureCache()->addImage("smile.png");
this->swapSpriteTexture(aSprite, &m_TextureSlot);

 

Posted by maysent
:

해당 오류는 cocos2d-x 2.1rc0-x-2.1.3 버전을 기준으로 mac에서 프로젝트를 생성했을 때 발생하는 이슈임.

 

cocos2d-x 프로젝트 안에 있는 create-android-project.sh 로 프로젝트를 생성할 경우, 

sample 코드 구성에 따라서 여러 오류가 발생( 악 엉망! )

 

1. 첫번째 오류

cocos2dXXX.java 파일이, proj.android/src/org/cocos2dx/lib/ 에 복사되지 않는 경우

 

샘플프로젝트 수정

구조가 Samples/Cpp/HellpCpp 안의 파일을 가져다 쓰는 구조로 되어 있는데

이 프로젝트의 src/org/cocos2dx/lib에 해당 파일이 없기 때문에 프로젝트 템플릿에도 복사가 안되는 오류가 있음.

 

cocos2dx/platform/android/java/src/ 안에 있는 org 폴더 전체를 HelloCpp 의 proj.android/src/에 복사한 후

생성 템플릿을 실행하면 된다.


생성 템플릿 수정

template/android/copy_file.sh 스크립트 안의 copy_src_and_jni() 함수를 수정해야 한다.

 

함수 안의 맨 밑에 cp -rf $COCOSJAVALIB_ROOT/src $APP_DIR/proj.android 코드를 

추가한 후에 생성 템플릿을 실행하면 된다.

 

2. 두번째 오류

AndroidMenitest.xml 파일 안에 아이콘 설정이 잘못 된 경우

res/drawable-XXX 안에는 ci_launcher.png 가 있는데, 설정파일에는 drawable/icon 으로 설정 됨.

 

설정 파일 수정

    eclipse 에서 직접 AndroidMenifest.xml 의 drawable/icon 을 drawable/ci_launcher로 변경

 

생성 템플릿 수정

     template/android/copy_file.sh 스크립트 안의 copy_icon() 함수를 수정

 

    if [ ! -d ... ] 의 이 if 문을 #로 주석 처리 한다. ( 마지막의 fi  도 )

   if 문 바로 아래에 rm -f $APP_DIR/proj.android/res/drawable-*/ic*.png 를 추가한다.

Posted by maysent
:

libcocos2d - plaform - win32 - CCCommon.cpp

 

CCLog 메소드에서 CP_UTF8을 아래와 같이 CP_ACP로 변경후 리 빌드

 

    MultiByteToWideChar(CP_ACP, 0, szBuf, -1, wszBuf, sizeof(wszBuf));

Posted by maysent
:

AppDelegate.cpp의 applicationDidFinishLaunching에서 설정합니다.

 

 
 
AppDelegate.cpp
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
31
32
33
34
35
36
37
bool AppDelegate::applicationDidFinishLaunching()
{
    // initialize director
    CCDirector *pDirector = CCDirector::sharedDirector();
    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
 
    // turn on display FPS
    pDirector->setDisplayStats(true);
 
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    CCEGLView* view = CCDirector::sharedDirector()->getOpenGLView();
    CCSize frame = view->getFrameSize();
    if (frame.height==1136.0) {
        // iPhone5などの解像度
        CCEGLView::sharedOpenGLView()->setDesignResolutionSize(320, 568, kResolutionExactFit);
    } else {
        CCEGLView::sharedOpenGLView()->setDesignResolutionSize(320, 480, kResolutionExactFit);
    }
#else
    // Android用
    CCEGLView::sharedOpenGLView()->setDesignResolutionSize(320, 480, kResolutionExactFit);
#endif
 
    // set FPS. the default value is 1.0/60 if you don't call this
    pDirector->setAnimationInterval(1.0 / 60);
 
    // create a scene. it's an autorelease object
    CCScene *pScene = HelloWorld::scene();
 
    // run
    pDirector->runWithScene(pScene);
 
    return true;
}



setDesignResolutionSize

이미지 크기 그대로로 표시됩니다.

kResolutionShowAll의 경우 
가로 세로 비율을 유지하고 화면 가득 표시됩니다.
상하가 비어 버리고 있습니다

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(320, 480, kResolutionShowAll);

 

kResolutionExactFit의 경우
가로 세로 비율을 유지하지 않고 뻗어 느낌으로 표시됩니다.
기본적으로 이것을 이용하면 좋을 것입니다

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(320, 480, kResolutionExactFit);

kResolutionNoBorder의 경우 
가로 세로 비율을 유지하고, 전체보기 느낌입니다.
설치 한 블록이 밀려 버린다

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(320, 480, kResolutionNoBorder);

 

Posted by maysent
: