해당 프로젝트 우클릭 후

Android tool -> Clear Lint Markers 선택 후 컴파일 하면

오류가 해결 된다.


캡슐화와 정보은닉의 개념이 헷갈릴수가 있다. 아래의 예를 통해서 캡슐화를 알아 보자


class Key

{

public:

void Key() 

{

cout<<"키를 꼽습니다."<<endl;;

}

};

class StartButton

{

public:

void Button()

{

cout<<"시동 버튼을 누릅니다."<<endl;

}

};

class Car

{

public:

void TakeKey(Key &key);

void TakeStartButton(StartButton &button);

};


int main(void)

{

Key key;

StartButton button;


Car car;

car.TakeKey(key);

car.TakeStartButton(button);


return 0;

}


위 코드는 간략하게 자동차 시동을 켜는 방법을 클래스다. 그러나 위 예제가 캡슐화가 무너진 대표적인 예다. 왜냐 하면 자동차는 항상 키,시동버튼 행동을 포함 하게 된다. 또한 눈으로 확인 가능 하기가 어렵다.


따라서 아래 코드 처럼 변경 하면 좋다.


class Key

{

public:

void Take() 

{

cout<<"키를 꼽습니다."<<endl;;

}

};

class StartButton

{

public:

void Take()

{

cout<<"시동 버튼을 누릅니다."<<endl;

}

};


class CarStart

{

private:

Key key;

StartButton btn;


public:

void Take()

{

key.Take();

btn.Take();

}

};


class Car

{

public:

void TakeCarStart(CarStart &start)

{

start. Take();

}

};

int main(void)

{

CarStart carStart;

Car car;

car. TakeCarStart(carStart);


return 0;

}


여기서 가장 중요한 것은 캡슐화의 범위를 결정 하는 일이 쉽지 않다는 것이다. 







먼저 어떠한 좌표를 저장 하는 클래스를 기본적으로 만들어 보자


class Point 

{

public:

int x;  //x 좌표는 0보다 커야 한다.

int y;  //y 좌표는 0보다 커야 한다.

}


int main(void)

{

Point p1 = {-2,4};

Point p2 = {3,5};


return 0;

}


위 코드를 보듯이 Point 멤버 변수 x,y를 public로 선언을 하는 바람에 어디서든 접근이 가능 하게 되어 버렸다. 따라서 0보다 작은 수를 실수로 저장이 되어 버리는 현상이 발견 되었다. 이 부분을 방지 하기 위해서 임의로 막아 주는 부분이 필요 하다.


Point.h 파일


class Point

{

private:

int x;

int y;


public:

      void InitMembers(int xpos,int ypos);

int GetX();

int GetY();


bool SetX(int xpos);

bool SetY(int ypos);

}


Point.cpp 파일


bool Point::InitMembers(int xpos,int ypos) 

{

if(xpos < 0 || ypos < 0)

{

return false;

}


x = xpos;

y = ypos;


return true;

}


int Point::GetX()

{

return x;

}

int Point::GetY()

{

return y;

}

bool Point::SetX(int xpos)

{

if(xpos < 0)

{

return false;

}

x = xpos;

return true;

}

bool Point::SetY(int ypos)

{

if(ypos < 0)

{

return false;

}

y = ypos;

return true;

}


위 코드 처럼 Point 멤버 변수 x,y를 숨겨서 개발자가 실수를 최대한 줄여 줄수 있게 하는 방법 입니다. 

또한 GetY(),GetX() 를 GetY() const ,GetX() const를 함으로써 더욱 안정성을 높여 주는 것도 하나의 방법이다.



현재 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


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



이클립스 메뉴에 AVD manager 가 보이지 않는다면... 

AVD Manager 메뉴 활성화 방법

eclipse not showing AVD manager window and android project



Eclipse ADT 설치 후 아이콘 및 메뉴가 안 보일 때

Eclipse Window 메뉴 > Customize perspective > Command Groups Availability tab.  

"Android SDK and AVD Manager" 체크 후 확인을 클릭하시면 메뉴가 나타나게 됩니다.


이상입니다.



참고 : http://mdoli.blog.me/220111067492



스택과 힙의 큰 차이점은 동적, 정적의 차이라 볼 수 있겠다. 

동적 : 런타임시에 메모리 영역을 원하는 크기로 잡을 수 있다는 의미. 
정적 : 컴파일시에 크기가 정해져 있다는 의미. 

프로그래밍시 메모리 할당은 운영체제가 4개의 메모리에서 알아서 할당한다.
이를 단순화 시켜 하나의 공간으로 만든 것이 가상메모리 이다. 
코딩을 하면서 언급되는 메모리는 모두 가상메모리이다. 

가상메모리 영역 
* 코드 영역 - 코드가 저장됨
* 데이터 영역 - 전역변수, static 변수 처럼 프로그램 종료 될때까지 사라지지 않고 유지되는 는 정적인 영역 
* 스택 영역 지역변수, 매개변수 처럼 해당 영역을 빠져 나오면 소멸되는 영역
* 힙 영역 - 사용자가 실행중(런타임 중) 동적으로 생성, 소멸 시키는 영역 

 




이상입니다.




비트맵 제작 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);



 이상입니다.



+ Recent posts