java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "srand" referenced by
위 오류는 Application.mk 에 APP_PLATFORM=android-19 추가 하면 됩니다.
[출처] ndk r10e버젼과 함께하는 안드로이드 빌드|작성자 용이오빠
[출처] ndk r10e버젼과 함께하는 안드로이드 빌드|작성자 용이오빠
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "srand" referenced by
위 오류는 Application.mk 에 APP_PLATFORM=android-19 추가 하면 됩니다.
[출처] ndk r10e버젼과 함께하는 안드로이드 빌드|작성자 용이오빠
[출처] ndk r10e버젼과 함께하는 안드로이드 빌드|작성자 용이오빠
__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개의 파일을 추가 한다.
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 *shake = Shake::actionWithDuration(0.5f, 30);
this->runAction(shake);
이상입니다.
참고 : http://singleton.tistory.com/375