java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "srand" referenced by


위 오류는 Application.mk 에 APP_PLATFORM=android-19 추가 하면 됩니다.




__android_log_print(ANDROID_LOG_DEBUG, "cocos2d-x debug info", buf);


에 대한 오류는


아래와 같이 수정

 __android_log_print(ANDROID_LOG_DEBUG, "cocos2d-x debug info", "%s", buf);


코코스 안드로이드 빌드 중 


error: 'sort' is not a member of 'std


위 같은 오류가 발생 하면 


#include <algorithm> 


추가 해주면 끝

현재 cocos2d 버전이 3.2 입니다. 작업시 참고 하세요.


cocos2d Sprite graySprite 로 변환 하는 방법


resource 폴더에 첨부한 2개의 파일을 추가 한다.



gray.fsh


gray.vsh




Sprite* temp = Sprite::create(filePath);

graySprite(temp);

this->addChild(temp);



void HellowWorld::graySprite(Sprite * sprite) {

    if(sprite) {

        GLProgram * p = new GLProgram();

        p->initWithFilenames("gray.vsh", "gray.fsh");

        p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);

        p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);

        p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);

        p->link();

        p->updateUniforms();

        sprite->setGLProgram(p);

    }

}



이렇게 사용 하시변 됩니다.

테스트 해본 결과 aos,ios모두 사용이 가능 합니다. 




참고 : http://injakaun.tistory.com/102



1. Schedule 종류

스케쥴는  6개의 종류가 있습니다.


schedule(SEL_SCHEDULE selector);

가장 일반적인 방법으로 타이머에서 호출할 메소드만 지정하는 방법입니다타이머가 호출되는 시간은 처음 cocos2d-x 실행할  지정한 fps 속도를 빠릅니다일반적으로 1초의 60번의 fps 지정하고 있습니다. ftp 지정는 AppDelegate.cpp 파일에 있습니다.


schedule(SEL_SCHEDULE selector, float interval)

 방법은 호출할 메소드와 간격을 지정하는 방법입니다이때에는 fps 지정된 시간이 아닌 interval 지정된 시간마다 메소드가 호출됩니다인터벌의 시간은 fps시간보다 빠를수 없습니다지금 메인 fps 1초에 10 그리는 건데스케쥴의 인터벌을 0.05초인 일초에 20 호출되게 지정을 해도 결국 fps 속도 만큼은 1초에 10번만 호출되게 됩니다스케쥴의 인터벌 간격은 fps 간격을 기본으로해서 설정됩니다.


schedule(schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)

 방법은 메소드인터벌 뿐만 아니라타이머가 불리는 횟수와 처음 타이머가 호출되는 시간을 지정할  있습니다.

그래서 스케쥴을 실행하면, delay 정한 시간만큼 기다리고 있다가 실행되고그리고 인터벌 간격마다 리피트 횟수 만틈 호출됩니다그래서 결국 호출되는 횟수는 리피트로 지정한 횟수보다 한번  호출됩니다.


scheduleOnce(SEL_SCHEDULE selector, float delay)

 방법은 딜레이로 지정한 시간만큼만 기다렸다가  한번만 메소드를 호출하는 방법입니다.


scheduleUpdate()

 방법은 첫번째 방법과 거의 비슷하지만여기서는 호출할 메소드 이름조차 지정하지 않습니다따로 메소드를 지정하지 않아도 update(float delta)라는 메소드가 자동으로 호출됩니다.


scheduleUpdateWithPriority(int priority)

위에 있는 scheduleUpdate() 거의 동일한데 우선순위를 정할  있는 방법입니다우선 순위는 숫자가 적을수록 먼저 실행되며동시에 여러개의 scheduleUpdate() 사용해야  경우 사용하면 유용합니다.



2. SEL_SCHEDULE selector

스케쥴에서 SEL_SCHEDULE 셀럭테로 호출해야  메소드를 지정하며 사용방법은 아래와 같이 사용하면 됩니다.


HelloWorld::update(float delta) 메소드를 호출  경우

this->schedule(schedule_selector(HelloWorld:update));


위와 같이 일반적인 셀렉터를 사용하는 방법과 동일합니다일반적으로 스케쥴에서 호출하는 메소드는 deleta라는 값을 매개변수로 받고 있습니다 변수에는 스케쥴이 호출되는 시간간격이 들어옵니다셀렉터를 부를 때에는 당연히 ()부분과 매개변수를 빼고 메소드 이름만 입력합니다.



3. unschedule()

 이상 스케쥴을 사용하지 않을 경우에는 unschedule() 메소드를 사용해서 스케쥴일 해제합니다.


unschedule(SEL_SCHEDULE selector)

호출한 메소드를 지정해서 해당되는 스케쥴일 해제하는 방법입니다.


unscheduleAllSelectors()

호출한 모든 스케쥴일 해제하는 방법입니다.


unscheduleUpdate()

scheduleUpdate() 스케쥴만 해제하는 방법입니다.


참고 : http://injakaun.tistory.com/96


1. Sequence

시퀀스는 2개 이상의 액션들을 조합해서 순차적으로 실행하게 해주는 액션입니다. 


Sequence

MoveTo *action_0 = MoveTo::create(1.0f, Point(200, 200));
MoveTo *action_1 = MoveTo::create(1.0f, Point(150, 150));
Sequence *action_2 = Sequence::create(action_0, action_1, NULL);


2. Spawn

이 액션은 동시에 여러개의 액션을 실행시키는 액션입니다.


Spawn

MoveTo *action_0 = MoveTo::create(1.0f, Point(200, 200));
FadeTo *action_1 = FadeTo::create(2.0f, 128);

Spawn *action_2 = Spawn::create(action_0, action_1, NULL);


3. Reverse

리버스는 실행했던 액션을 반대로 실행시켜주는 기능입니다.

단, 반대로 실행할 수 있는 기능들만 실행됩니다.


MoveBy *action_0 = MoveBy::create(1.0f, Point(200, 200));

MoveBy *action_1 = action_0->reverse();

Sequence *action_2 = Sequence::create(action_0, action_1, NULL);


4. DelayTime

딜레이타임은 지정된 시간만큼 기다리는 액션입니다.

보통 2개 이상의 조합액션을 할 때 많이 사용됩니다.


CCDelayTime

MoveTo *action_0 = MoveTo::create(1.0f, Point(200, 200));
DelayTime *action_1 = DelayTime::create(3.0f);    // 시간
MoveTo *action_2 = MoveTo::create(1.0f, Point(150, 150));
Sequence *action_3 = Sequence::create(action_0, action_1, action_2, NULL);


5. Repeat, RepeatForever

이 액션은 지정된 액션을 지정한 횟수만큼 반복하는 액션입니다.


Repeat

MoveTo *action_0 = MoveTo::create(1.0f, Point(200, 200));

MoveTo *action_1 = MoveTo::create(1.0f, Point(150, 150));
Sequence *action_2 = Sequence::create(action_0, action_1, NULL);
Repeat *action_3 = Repeat::create(action_2, 10);    // 액션 , 횟수


횟수를 지정하지 않고 무한반복을 할 때에는 아래 액션을 사용하면 됩니다.


RepeatForever

MoveTo *action_0 = MoveTo::create(1.0f, Point(200, 200));

MoveTo *action_1 = MoveTo::create(1.0f, Point(150, 150));
Sequence *action_2 = Sequence::create(action_0, action_1, NULL);

RepeatForever *action_3 = RepeatForever::create(action_2);


6. Ease Action

이지액션은 어떠한 액션을 실행할때 등속이 아닌 특정한 가속도를 주어서 실행하게 해주는 액션입니다.

여기서 In은 가속부분에서 천천히 되는 부분이 앞에 있는 것을 말하며, Out는 천천히 되는 부분이 뒤에 있는 것을 말합니다. InOut는 앞뒤에 부분이 천천히 가속되는 것을 말합니다.


EaseIn, EaseOut, EaseInOut

가속의 범위를 탄성이라는 값으로 지정할 수 있는 액션입니다.


MoveTo *action_0 = MoveTo::create(3.0f, Point(300, 300));

EaseInOut *action_1 = EaseInOut::create(action_0, 3.0);    // action, 탄성


EaseExponentialIn, EaseExponentialOut, EaseExponentialInOut

가속의 차가 많이 나는 액션입니다.


MoveTo *action_0 = MoveTo::create(3.0f, Point(300, 300));

EaseExponentialIn *action_1 = EaseExponentialIn::create(action_0);


EaseSineIn, EaseSineOut, EaseSineInOut

가속의 차가 조금 나는 액션입니다.


MoveTo *action_0 = MoveTo::create(3.0f, Point(300, 300));

EaseSineIn *action_1 = EaseSineIn::create(action_0);


EaseElasticIn, EaseElasticOut, EaseElasticInOut

고무줄에 튕기는 듯한 느낌을 주는 액션입니다.


MoveTo *action_0 = MoveTo::create(3.0f, Point(300, 300));

EaseElasticIn *action_1 = EaseElasticIn::create(action_0);


EaseBounceIn, EaseBounceOut, EaseBounceInOut

공이 튀기는 듯한 느낌을 주는 액션입니다.


MoveTo *action_0 = MoveTo::create(3.0f, Point(300, 300));

EaseBounceIn *action_1 = EaseBounceIn::create(action_0);


EaseBackIn, EaseBackOut, EaseBackInOut

뒤로 갔다가 다시 앞으로 오는 액션입니다.


MoveTo *action_0 = MoveTo::create(3.0f, Point(300, 300));

EaseBackIn *action_1 = EaseBackIn::create(action_0);


7. Call Function

이 액션은 메소드를 호출하는 액션입니다.

메소드를 호출하면서 어떠한 값을 넘겨주느냐에 따라서 4종류의 액션으로 구분됩니다.


CallFunc

아무런 값을 넘겨주지 않고 메소드만 호출하는 액션입니다.


MoveTo *action_0 = MoveTo::create(1.0f, Point(200, 200));
CallFunc *action_1 = CallFunc::create(CC_CALLBACK_0(HelloWorld::goCall, this));
Sequence *action_2 = Sequence::create(action_0, action_1, NULL);


void HelloWorld::goCall() {

    CCLOG(__FUNCTION__);

}


CallFuncN

메소드를 호출하면서 액션을 실행하는 주체를 넘겨주는 액션입니다.

넘겨준 주체는 호출되는 메소드에서 아래와 같이 사용할 수 있습니다.


MoveTo *action_0 = MoveTo::create(1.0f, Point(200, 200));

CallFuncN *action_1 = CallFuncN::create(CC_CALLBACK_1(HelloWorld::goCall, this))
Sequence *action_2 = Sequence::actions(action_0, action_1, NULL);

spr->runAction(action_2);


void HelloWorld::goCall(Node *pSender) {

    Sprite *spr = (Sprite *)pSender;

    spr->setScale(2);

}


CallFuncN

메소드를 호출하면서 주체 및 특정한 값을 넘겨주는 액션입니다.


MoveTo *action_0 = MoveTo::create(1.0f, Point(200, 200));

CallFuncN *action_1 = CallFuncN::create(CC_CALLBACK_1(HelloWorld::goCall, this, (void*)"cocos2d-x"));
Sequence *action_2 = Sequence::create(action_0, action_1, NULL);

spr->runAction(action_2);


void HelloWorld::goCall(Node *pSender, void *d) {

    CCLOG("goCall %s", (char*)d);

    Sprite *spr = (Sprite *)pSender;

    spr->setScale(2);

}


CCCallFuncN

이 액션은 메소드를 호출하면서 액션을 실행하는 주체가 아닌 다른 오브젝트를 넘겨주는 액션입니다.


MoveTo *action_0 = MoveTo::create(1.0f, Point(200, 200));

CallFuncN *action_1 = CallFuncN::create(CC_CALLBACK_1(HelloWorld::goCall, this, spr_2));
Sequence *action_2 = Sequence::create(action_0, action_1, NULL);

spr_1->runAction(action_2);


void HelloWorld::goCall(Node *pSender, Object *o) {

    Sprite *spr = (Sprite *)o;

    spr->setScale(2);

}

참고 : http://injakaun.tistory.com/95


0. By, To

기능들을 배우기 전에 먼저 알아야 하는 것이 By와 To에 차이를 아는 것입니다.

간단하게 말하면 By는 상대값, To는 절대값을 나타내는 것입니다.

예를 들어서 어떠한 객체를 이동을 시키려고 합니다. 

이동 시키는 Action은 Move라는 것이 있는데, 입력값으로는 이동시간과 이동위치를 받습니다.

이때 By와 To에 따라서 아래와 같이 이동하게 됩니다.


MoveBy::create(3.0, Point(200, 200));

현재 좌표를 기준으로 (200, 200)만큼 이동합니다. 

즉, 지금 (100, 100)에 있다고 하면 (300, 300)으로 이동합니다.


MoveTo::create(3.0, Point(200, 200));

현재 좌표가 어디이든 상관없이 무조건 (200, 200)으로 이동합니다.

즉, 지금 (100, 100)에 있다고 해도 (200, 200)으로 이동합니다.



1. Position

MoveBy, MoveTo

지정한 시간동안 객체를 움직이는 액션입니다. 움직일 때에는 등속으로 움직입니다.

MoveBy::create(3.0, Point(200, 200));   // 시간, 위치


그럼 위에 액션을 가지고 간단한 예제 소스 코드를 만들어 보겠습니다.

일반적으로 액션을 실행하는 방법은 크게 차이가 없습니다.


Sprite *spr = Sprite::create("Icon.png");

spr->setAnchorPoint(Point(0.5, 0.5));

spr->setPosition(Point(100, 100));

this->addChild(spr);


MoveTo *pAction = MoveTo::create(3.0, Point(200, 200));

spr->runAction(pAction);


이렇게 액션을 만든다음에 액션을 실행시키는 주체에 runAction으로 액션을 실행하면 됩니다.

액션은 Node을 상속받는 객체들(Layer, Sprite, Label 등)에 실행시킬 수 있습니다.


JumpBy, JumpTo

지정된 시간동안 지정한 위치로 이동하면서 점프를 하는 액션입니다. 

점프의 높이와 횟수를 지정할 수 있습니다.

JumpBy::create(3.0f, Point(200, 200), 100, 5);   // 시간, 위치, 높이, 횟수


BezierBy, BezierTo

BezierConfig에 의해서 만들어진 곡선대로 지정된 시간동안 움직이는 액션입니다.

BezierBy *action = BezierBy::create(3.0f, bezier);    // 시간, BezierConfig


베지어곡선 액션의 경우 아래와 같이 BezierConfig를 만들어서 입력해야 합니다.


ccBezierConfig bezier;

bezier.controlPoint_1 = Point(150, 150);  // 첫번째 위치

bezier.controlPoint_2 = Point(250, 50);    // 두번째 위치

bezier.endPosition = Point(350, 0);    // 마지막 위치


Place

객체의 위치를 지정된 위치로 변경하는 액션입니다.

일반적으로 혼자 사용하는 것 보다는 나중에 배울 조합 액션에서 많이 사용되는 액션입니다.

Place::create(Point(200, 200));    // 위치


2. Scale

ScaleBy, ScaleTo

지정된 시간동안 객체를 확대 또는 축소시키는 액션입니다.

ScaleBy::create(3.0f, 2.0);    // 시간, 비율


3. Rotation

RotateBy, RotateTo

지정된 시간동안 지정한 각도만큼 객체를 회전시키는 액션입니다.

By, To가 어떻게 다른지 차이점을 알고 있어야 합니다.

RotateBy *action = RotateBy::create(3.0f, 60);              // 시간, 각도(z축 기준)

RotateBy *action = RotateBy::create(3.0f, 60, 90);        // 시간, 각도(x축), 각도(y축)


4. Visible

Show, Hide

객체를 보여주거나, 안보이게 할 때 사용되는 액션입니다.

setVisible()과 동일한 결과를 나타내는 액션입니다. 역시 혼자 사용되지는 않고 조합 액션에서

많이 사용되는 액션입니다.

Show *action = Show::action();

Hide *action = Hide::action();


Blink

지정된 시간동안 객체를 깜박이게 하는 액션입니다.

Blink::create(3.0f, 4);    // 시간, 횟수


ToggleVisibility

이 액션을 실행할때마다 setVisible()의 값을 반대로 하는 액션입니다.

즉, 객체가 보이고 있을 때 이 액션을 하면 객체가 안보이게 되고, 다시 액션을 실행하면 보이게 됩니다.

ToggleVisibility *action = ToggleVisibility::create();    

// 한번 실행하면 안보이고, 두번 실행하면 보이고...


5. Opacity

FadeIn, FadeOut

페이드인 액션은 객체의 투명도를 0에서 255로 변하게 하는 액션입니다.

즉, 안보이다가 보이게 하는 것입니다.

반대로 페이드아웃 액션은 객체의 투명도를 255에서 0으로 변하게 하는 액션입니다.

FadeIn *action = FadeIn::create(3.0f);    // 시간

FadeOut *action = FadeIn::create(3.0f);    // 시간


FadeTo

이 액션은 객체의 투명도를 지정한 투명도로 변경해 주는 액션입니다.

FadeTo *action = FadeTo::create(3.0f, 128);    // 시간, 투명도(0~255)


6. Flip

FlipX, FlipY

이 액션은 객체를 반전시키는 액션입니다.

FlipX *action = FlipX::create(true);


7. RemoveSelf

RemoveSelf

이 액션은 액션을 실행한 객체를 제거하는 액션입니다.

RemoveSelf *action = RemoveSelf::create(false);    // cleanup 여부, 생략 가능


8. Color

TintBy, TintTo

이 액션은 지정한 RGB의 값으로 색상을 변경하는 액션입니다.

TintTo *action = TintTo::create(3.0f, 0, 0, 255);    // 시간, R, G, B


더 많은 정보를 원하시면 맨 위에 있는 블로그를 참조 해주세요~



비트맵 제작 URL : http://kvazars.com/littera/



    Label* label = Label::createWithBMFont("fontName","temp");

    label->setHorizontalAlignment(TextHAlignment::RIGHT);

    label->setAnchorPoint(Vec2(0,1));

    label->setPosition(Point(90, 58));

    this->addChild(label);



 이상입니다.





cocos2d-x 3.x이상 버젼을 사용 하면서 작업시 

__Array 에서 인덱스 값을 갖고 올시 불편한 점이 많다.. 그래서 매크로를 만들어 놓고 작업을 하면됨


// Ref -> std::string

#define ccsf(...)        __String::createWithFormat(__VA_ARGS__)->getCString()

// Ref -> int

#define LMToInt(...)     ((__String*)(__VA_ARGS__))->intValue()

// Ref -> __String

#define LMToString(...)  (__String*)(__VA_ARGS__)


#define ccf(...)        __String::createWithFormat(__VA_ARGS__)



위 4개가 주로 이용 됨.


이상입니다.~


Shake.cpp


Shake.h



프로젝트에 추가 후 


사용 방법


    Shake *shake = Shake::actionWithDuration(0.5f, 30);

    this->runAction(shake);


이상입니다.


참고 : http://singleton.tistory.com/375


+ Recent posts