저번 정리에서는 CCNode에 대해서 알아 봤는데요 그놈이 대충 먼지알았으니까 그놈에 속성을 변경시키는 CCAction에 대해서 알아봅시다.

 

음 본격적으로 알아 보기전에 액션관련 클래스는 얼마나 몇 개나 있을까 하는 궁금함이 들어서확인해봤습니다.


관련 패키지만 8 클래스는 113 .  이런 씨부.~~~진짜 많네


org.cocos2d.actions  (5
)

org.cocos2d. base (5

org.cocos2d.actions. camera (2)

org.cocos2d.actions. ease (22)

org.cocos2d.actions. grid (17)

org.cocos2d.actions. instant(10)

org.cocos2d.actions. interval(28)

org.cocos2d.actions. tile(14)


더럽게 많네요  ㄷㄷ
자 그럼 본격적으로 가보죠 

위에 분류는 패키지별 분류입니다.

홈피에서는 분류는 속성을 기준으로 하여 분류해놓았더군요.

§  position

§  CCMoveBy

§  CCMoveTo

§  CCJumpBy

§  CCJumpTo

§  CCBezierBy

§  CCBezierTo

§  CCPlace

§  scale

§  CCScaleBy

§  CCScaleTo

§  rotation

§  CCRotateBy

§  CCRotateTo

§  visible

§  CCShow

§  CCHide

§  CCBlink

§  CCToggleVisibility

§  opacity

§  CCFadeIn

§  CCFadeOut

§  CCFadeTo

§  r, g, b

§  CCTintBy

§  CCTintTo

 

그럼 가장 첫번째 있는 position 속성을 변화 시키는 CCMoveBy 클래스를 보도록 하겟습니다.

기본액션 이라길래 org.cocos2d. base (5)에 있는줄 알고 차아 보니까 없더군요.. 머지 했습니다 그래서 다시 살펴보니 .
org.cocos2d.actions. interval(28
) 패키지에 있었습니다. 이것도 머지 했죠 . 머지 머지 ? 인터발 이면 시간인데.. 아하 위치 변경할 때도 시간을 줄수 있구나 . 오호 ~~~ 이런 세심한 배려까지 . ㄷㄷ 그래서나머지 부분들도 찾아 보았습니다. 결론은 basic Action중에서 

§  CCPlace

§  CCShow

§   CCHide   

§ CCToggleVisibility

요기 4가지는 org.cocos2d.actions.instant(10)있었습니다. 인스턴스는 일회적이란는 말인데 음....일회적 아니 빠른 순간적 이라는 말인가 ?
그럼
시간속성이 없다라는 말은 순간적으로 이루어 진다 시작 ~ ! 하면 바로 끝난다. 해서

CCInstantAction 

간단하죠 ㅎㅎㅎ 그렇다는 말은 홈피에서 말하는 기본액션중
위에 4가지만 쓰는 방법(함수형식) 다르고 나머지 들은 거의 같다 라는 이상한 결론이 도출되네요 .

그럼 실제로 비슷한지 코드를 한번 볼까요?  

CCMoveTo actionTo = CCMoveTo.action(2, CGPoint.ccp(s.width-40, s.height-40));
CCMoveBy actionBy = CCMoveBy.action(2, CGPoint.ccp(80,80));
CCJumpTo actionTo = CCJumpTo.action(2, CGPoint.ccp(300,300), 50, 4);

CCJumpBy actionBy = CCJumpBy.action(2, CGPoint.ccp(300,0), 50, 4);



CCBezierConfig bezier =
new CCBezierConfig();

bezier.controlPoint_1 = CGPoint.ccp(0, s.height/2);

bezier.controlPoint_2 = CGPoint.ccp(300, -s.height/2);

bezier.endPosition = CGPoint.ccp(300,100);

CCBezierBy bezierForward = CCBezierBy.action(3, bezier);

CCBezierConfig bezier2 = new CCBezierConfig();

bezier2.controlPoint_1 = CGPoint.ccp(100, s.height/2);

bezier2.controlPoint_2 = CGPoint.ccp(200, -s.height/2);

bezier2.endPosition = CGPoint.ccp(240,160);

CCBezierTo bezierTo1 = CCBezierTo.action(2, bezier2);

 

CCScaleTo actionTo = CCScaleTo.action(2, 0.5f);

CCScaleBy actionBy = CCScaleBy.action(2, 2);


CCRotateTo actionTo = CCRotateTo.action(2, 45);

CCRotateBy actionBy = CCRotateBy.action(2, 360);


CCBlink action1 = CCBlink.action(2, 10);

CCFadeIn action1 = CCFadeIn.action(1.0f);

CCFadeOut action1Back = action1.reverse();

CCFadeOut action2 = CCFadeOut.action(1.0f);

CCFadeIn action2Back = action2.reverse();

CCFadeTo action1= CCFadeTo.action1 (2, 3)


CCTintTo action1 = CCTintTo.action(2, ccColor3B.ccc3(255, 0, 255));

CCTintBy action2 = CCTintBy.action(2, ccColor3B.ccc3(-127, -255, -127));

 

오호 비슷하네요 파라미터로 2개를 가지구요.

첫번째는 시간관련 (참고로 데이터 형은 float )이구요

두번째 파라미터는 각속성과 관련된 변수(레퍼런스)들 입니다 

 

이렇게 보니까 간단하게 보이는건 저뿐인가요 ^^;; 아 참고로 한가지 더

시간 관련 파라미터의 단위는 (첫번째 파라미터) “ 입니다.

1 이라고 있으면 1초이고 0.5 0.5초입니다.

 

자그럼 시간이 포함된 기본액션 클래스들을 보았으니 시간 변수가 표함 기본액션들을 살펴 보겟습니다.시간이 포함안되어있으니까 시간 관련 파라미터는 없겟고 기본액션이니까 하나의 속성을 변화 시키는거니까 음.. 그럼 파라미터는 한 개 겟네 ? 라고 생각할수 있습니다.  과련 맞을까요?


그럼 살펴봅시다
.

CCPlace.action(CGPoint.ccp(200,200))

CCShow.action()

CCHide hide = CCHide.action();

CCToggleVisibility tog1 = CCToggleVisibility.action();

 

어라 CCPlace 말고는 파라미터가 없네요 . 이런젠장.

Show Hide로 묶으면 파라미터 하라고 주고 보여줄지 말지를 묶을수 있는데 ㅠ 그러면

ToggleVisibility 묶을수도 있었는데 ㅠㅠ 예상이 빛나가버렸네요 .

이건 cocos2d 있는 코드니까 예측이 빛나갔더라고 실망하지말자궁 ㅠㅠ. 그래도 반은 대충 맞추었자나요 ㅠㅠ  아그러고 보니 jump 인자값이 4개네요 시간 포지션 간격 횟수

이정도 ㅠㅠ아 젠장 페이드인이랑 페이드 아웃도 인자 값이 하나네요ㅠㅠ. 가만히 생각해보니까 인자 하나만 있으면 되네요. 어차피 사라질꺼 시간만 있으면 되는거였네요 . 생각보다 많이 빗나가는뎁쇼 ㅈㅅ. ㅠㅠ

 

 

.. 한가지 중요한 것을 빼먹었네요. 클래스 뒤에 By To 의미가 먼지 궁금하실수도 있겟네요. 이건 바로 절대값 상대값 차이입니다.

By = 상대적 개념
To = 절대적 개념


절대값이라
하면 기준을 0으로 한거구요 위치면 0,0이겟고  회전은 0 scale 이미지 기본사이즈에서 얼마만큼 커지던지 작아 지던지가 되게네요.

그럼 상대값은 준을 자기 자기 위치면 현재위치 회전은 현재 회전된 값부터 scale 조금 애매하긴하네 .
 
 

그리고 재밌는 것은 By To 상속해서 만들었다는 것입니다. 잘생각 해보면 To 기분 이미지정해져 있다는 것뿐이지 실제적인  처리는 By 같다는 거죠 . 다시 말해서

절대적이함은 절대적 기준은 가진다는 결국 기본값이 정해져있다라는 말고 동일하죠 .이걸 디폴트라고 하죠 ㅎㅎ. 이제 어느정도 정리가 되어 가나요?

 

 

마지막으로 cocos2d에서 재밌는 기능을 가진 것이 있네요.

바로 reverse 액션 현재 까지 변화시킨 속성을 반대로 되돌린다 것인데도 쓰는 법도 간단합니다.

action 클래스 변수에 대고 점하나 찍고 reverse라고 써주기만 하면됩니다.  

 

CCFadeOut action2 = CCFadeOut.action(1.0f);

CCFadeIn action2Back = action2.reverse();

 

이렇게요 . ㅋㅋ 쉽죠 ㅎ 

 이로써  기본 액션 Base Action에 대해서 정리 되었습니다.


자 마무리하자면
Action Node의 속성을 변화 시키는 것이다. 그리고

그 속성별로 액션을 구체화 하여 각족 Action 파생클래스를 만들어 쓰기 쉽게 만든것이다.

라고 하면 될까요 ㅎㅎ

 

자 이제 액션을 사용할 Node를 어떻게 선언하는지만 알면 실제 액션 사용 코드를 볼수 있겟네요. ㅎㅎㅎ 

오호 ~~` 그런데 기왕 액션에 온거 단일액션만 보지말고 액션조합 어떻게 하는지 보고 갈까요?


그럼 이제 우리가 알아 보았던 액션들을
  결합해봅시다.

액션을 순차적으로 진행 할수 있고

액션을 모아서 한번에 같이 진행할수 있고 . 

그리고 이런 것들을 몇번이나 반복할것인지 한번 ? 두번? 세번? 무한히?

그것들이 바로

§  Sequence action

§  Spawn action

§  Repeat action

§  RepeatForever action

입니다.

CCSequence  이렇게 사용합니다.

CCMoveBy move_tamara = CCMoveBy.action(1, CGPoint.ccp(100,0));

CCMoveBy move_tamara2 = CCMoveBy.action(1, CGPoint.ccp(50,0));

CCHide hide = CCHide.action();

CCSequence seq_tamara = CCSequence.actions(move_tamara, hide, move_tamara2);

 

CCSpawn 요렇게 사용하구요

CCAction action = CCSpawn.actions(

CCJumpBy.action(2, CGPoint.ccp(300,0), 50, 4),

CCRotateBy.action(2, 720));

CCRepeat 이러구요

CCRotateTo act1 = CCRotateTo.action(1, 90);

CCRotateTo act2 = CCRotateTo.action(1, 0);

CCSequence seq = CCSequence.actions(act1, act2);

CCRepeat rep2 = CCRepeat.action(seq, 10);


CCRepeatForever 도 있네요  
CCRepeatForever rep1 = CCRepeatForever.
action(seq);

 

추가로 액션의 복사 copy() 있습니다.

CCMoveBy a1 = CCMoveBy.action(1, CGPoint.ccp(150,0));

CCRepeatForever action2 = CCRepeatForever.action(

                           CCSequence.actions( a1.copy(), a1.reverse()));

 

이까지가 기본적인 액션에 대한 이해 였습니다.

자자 이제 슬슬 CCNode 선언 하러 가볼까요

Posted by 수다쟁이증후군 :


액션에 대해서 본격적인 작업이 진행 되네요.
공식 홈페이지에 이렇게 정의 되어 있습니다.


-Action이란-
 

액션은  CCNode 오브젝트에 명령을 내리는 것과 같습니다
보통 position, rotation, scale 등과 같이 객체의 속성을 변경합니다. 

근데 여기서 문제점. CCNode가 무엇인지를 모른다는 거죠  객체의 속성을 바꾼다라는 말이다 이해할수있으니 . 다른말로 풀자면 CCNode 오브젝트의 속성을 변경시키는행위(코드,API)를 말한다라고 할수 있습니다
그러나 여전히 CCNode가 모르긴 마찬가지네요

 

그래서 검색 cocos2d소스를 보니

org.cocos2d.nodes 패키지안에 있더군요.

 


그럼
 CCNode 가보겟습니다

CCNode mainelement로써 대부분 클래스의 최상위 클래스 라네요 java 에서 object클래스와유사 한듯 보입니다. 

물론 CCNode object 클래스를상속받지만정확히 하자는 것이 아니라 개념적으로 최상위 클래스 라는 이야기를 하고자 한말입니다.

CCNode 클래스는 최상위 클래스 이다 라는 말은 클래스적인 측면측면 봤을 때 하는 이야기 이고 그럼 이놈이 도대체 어던놈인가에 대한 물음은 여전히 남네요.

 
 

그래서 CCNode 클래스 설명을 다시 보게되네요.

Anything thats gets drawn or contains things that get drawn is a CCNode.
(화면에 그려지거나)  (그려지는 것을 포함하는 것 CCNode 이다. 

그려지는 건 머 글자나 이미지 이런것이겟고 이런 것을 포함하는게레이어 니까(이해가 안되신다면 이전강의를 참고-클릭하시면 새창으로 볼수 있습니다.  )
 

CCSplite 클래스와CCLayer 클래스를 상속하는 모든 클래스 가CCNode이다.(이말은 oop에서 is a 관계네요작가는 사람이다작자는 하위클래스 사람은 상위클래스)

2개를 합치면 화면에 그려지는 것들과 그것을 포함하는 것은 CCNode클래스를상속한다 이네요.(영어 한줄에 대한 주석이 몇줄이니 ㅠㅠ)


이정도면 감을 잡으셨을라나
  ㅎㅎ  우리가 화면에 그려지는 것을 좀더 깔끔하고 쉽게 하기위해서 cocos2d를 쓰는 것이니까 이제 대해서 좀더 상세히 살펴볼필요가 있겟네요.

CCNode 클래스위 주요특징 3가지

1.-1

They can contain other CCNode nodes (addChild, getChildByTag, removeChild, etc)

CCNode는 다른 CCNode를 포함할수 있다. 당연한 말이죠 정의에서 이미 화면에 그려지는것과 그것을 담을수 있는 것이CCNode 라고 했으니까 그러니까 패스

1-2.

They can schedule periodic callback (schedule,unschedule, etc)
주기적으로 콜백 호출할수 있다 

이말은  타이머네요여기서 콜백은 내부적으로

CCScheduler 클래스가 관리합니다. 소스를 하나 하나 따라 들어가면좋겟지만 일단 개념만 잡읍시다. cocos2d 사용하는게 편하자고 하는거지 이걸공부하자고 하는건 아니자나요너무 깊게 파고 들어가면 주객이 전도 되어 버릴듯하네요물론 잘사용하기 위해서는 내부적으로어떻어 돌아가는 것을 알면좋지만 말입니다이는 나중에 시간되는 대로 소스 분석해서 봅시다아니면 궁금하면 질문해주세요제가 분석가능한내로 설명해드릴께요일단 일정시간마다 특정행동을 할수 있다 이정도만 합시다.

1-3.

They can execute actions (runAction, stopAction, etc)

액션을 실행시킬수 있다 . 이제야 글의 제목과 관련있는 부분이 나오네요. action node와의 관계 ㅎㅎㅎ 요기서 지금까지 알수있는 내용만으로 정리 한번 하자면 
액션은 Node의 속성을 변화 시키고 그 시작은 Node가 한다. 이말은 액션변수를 파라미터로 하는 호출함수가 있다 또는 Node에 액션 변수가 있고 자신이 가지고 있는 액션을 시작하는 함수가 있다.  

 

그럼 CCAction CCNode의 속성을변경한다는건데 그 속성이 먼지도 모르는데 어떻게 CCAction을 파악할수 있다는건지 . ㅎㅎ

 

그럼 이제 속성에 대해서 알아봅시다몇가지 있느냐 하면 

- position
- scale (x, y)
- skew (x by degrees, y by degrees)
- rotation (in degrees, clockwise)
- CCCamera (an interface to gluLookAt )
- CCGridBase (to do mesh transformations)
- anchor point
- size
- visible
- z-order
- openGL z position


이렇게 11가지 있습니다.

위치 ,크기,기울기,회전각,카메라,메쉬를 위한그리드베이스 ,축 위치,크기,보여줄것인가 말것인가,레이어 순서 ,그리고 좀 이해안되는 z-position 이거는3D 개념인데 왜있는거지 . ㄷㄷㄷ

근데 메쉬가 머야 그리드는 격자무늬인데 이게왜 메쉬란놈이랑 연관되는거야 ?그리고 scale size의 차이점은 머지 이런 궁금증이 있을겁니다.
자도 궁금하네요 이게 도대체 멀까요  ㅎㅎㅎ일단은 

위에궁금한 사항들을 제외한 나머지 속성들은 CCNode 클래스 정의를다시 생각해보면 충분히 이해가 가리라 생각합니다

화면에 그려지는것과 그것을 포함하는것 화면에 어디에 그려그려질 것인가
?원래 크기를 줄일것인가 말것인가?이미지 좀기울이면안되나시계방향으로 좀회전시킬가회전시킬때상단 맨위위를 기준으로 할까 아니면 중앙을 기분으로 할까이런게 변화된 이미지를 보여줘야하나 ? 잠시 빼버릴까최상위레이어를 배경으로 쓰면 어떨까등등

화면에 그려지는 것에 대한 속성들을 모두 정리 해놓았습니다. 

대충 CCNode가 먼지  감이 오나요?  ㅎㅎㅎ
설명이 개떡 같아서 헷갈릴지도 모르지만헷갈리는건 질문해주세요 ㅎㅎ
 
 

그외에 CCNode의 프로그래밍적 측면을 위한 문구가 있더군요.

Some CCNode nodes provide extra functionality for them or their children.

Subclassing a CCNode usually means (one/all) of:
- overriding init to initialize resources and
schedule
callbacks
- create callbacks to handle the advancement of time
- overriding draw to render the node 


이런거라던지.

Order in transformations with grid disabled
 -# The node will be translated (position)
 -# The node will be rotated (rotation)
 -# The node will be skewed (skew)
 -# The node will be scaled (scale)
 -# The node will be moved according to the camera         values (camera)

 

 Order in transformations with grid enabled
 -# The node will be translated (position)
 -# The node will be rotated (rotation)
 -# The node will be skewed (skew)
 -# The node will be scaled (scale)
 -# The grid will capture the screen
 -# The node will be moved according to the camera         values (camera)
 -# The grid will render the captured screen

 

요런거 실제 프로그래밍 하면 이런게 더 와닿을지도 모릅니다다만이건 음..머랄까 일조의 tip이라고 생각합니다 물론 여기에대해서도 다룰겁니다그러나 아직은 개념 잡기 위한거니 다음 예제를 직접 보면서 할수 있을 때 정리해보도록하겟습니다.


~~ CCAction
을 알아볼라고했는데 어떻게 CCNode에 대해서 알아보았네요 .근데 무엇에 대한 action인지 에 대해서 모른다면 충분히 사용할수 없다라는 생각에 이렇게 장문의 글이 되고 말았네요.   잊지말것은 화면에 그려지는것과 그것을포함하는 것은 CCNode 를 상속한다입니다.

Posted by 수다쟁이증후군 :

코코스 홈페이지에 가면 정말 정리를 잘해놓았습니다.

따로 이렇게 강좌를 적을 필요도 없지만제가 이해한 것을 바탕으로

하나하나 다시 풀어 가보려 합니다.

 

게임개발에 대해서 저 처럼 처음인 사람들을 위해서 일단 용어 정리부터 해보려 합니다.

 

1.   sprite
스프라이트 별거 없습니다 그냥 이미지입니다단지 용어가 익숙하지 않을뿐다시 반복하자면 에스. 알아이 s p r i t e  
스프라이트.  2D 이미지 간단히 사진이라 그림,글자 그림 이라고 생각하시면 됩니다이는 물론 이동 회전 크기 Action(에니메이션)을 적용가능한니다한마디로 사진을 밀었다 땡겻다 돌렸다 뒤집었다 할수 있다는 말이죠

2.   Layer 
두번째로 할 것은 레이어 입니다레이어는간단히 종이 한장입니다물론 이 종이는 투명한 비닐 종이 일수도 있도 시커먼 먹지일수 도 있으며 새하얀 종이 일수도 있습니다여기 이 종이 위에 사진을 붙일수 있겟죠 즉 위에 서 설명한  . 를 레이어 위에 배치할수 있다는 거죠  즉 레이어는 스프라이트를 포함한다라고 정의해보겟습니다공식페이지서 설명한대로 게임 작업은 여기서 대부분에 시간을 보내게 됩니다.

3.   Scene
 
그리고 3번째로 장면이라고 해석해놓은 scene !!
Scene는 바로 레이어를 담는 그릇입니다.  

하나의 scene에 하나의 레이어도 올수 있고 다수의 레이어가 올라 갈수도 있습니다.  


     지금까지의  배용을 정리하면 
스프라이트는 레이어에 포함되고 레이어는
 Scene에 포함된다 라고 할 수 있습니다.

 

4.   Director 
자 마지막으로 디렉터는 간단하게 Scene를관리합니다scene 뒤에는 다음 씬이 나오고  다음 씬나오면 그다음씬 나오고 어라 생각해보나까 역순으로 돌리는 게 낮겟네  해서 씬순서 바꾸고 … 한마디로감독이죠 그리고 영화에서 감독은 한명입니다. cocos2D에서도 
디렉터는 하나분입니다프로그램 디자인에서 말하는 싱글톤.~~~

 

자 여기까지가 기본 개념입니다이제 세부 적으로들어가 봅시다물론 다음 강좌에서ㅎㅎ  아직 내용이 좀 허접합니다. ㅎ
Posted by 수다쟁이증후군 :