Cocos2d-x 3.x 기본 학습 : 3.2 노드 클래스 Node에 대한 자세한 요약

Cocos2d-x 3.x 2.x에 비해 Node 클래스 Node의 속성과 기능이 크게 수정되고 증가되었습니다. 오늘은 버전 3.2를 예로 들어 요약 해 보겠습니다.

【마디】

Node 클래스는 Scene, Layer, Sprite 및 스프라이트 컬렉션 SpriteBatchNode 등과 같은 대부분의 클래스 (모든 클래스가 Ref 클래스를 직접 상속하는 것은 아님)의 상위 클래스입니다. 상위 클래스는 Node입니다.

Node 클래스에는 몇 가지 기본 속성, 노드 관련, 작업 실행 및 타이머 관련 작업이 포함되어 있습니다.

물론 Node에는 부모 클래스가 Ref 인 부모 클래스도 있습니다.

상속 관계는 다음과 같습니다.

 

 

노드의 주요 기능 :

다른 노드 객체 (addChild, getChildByTag, removeChild 등)를 포함 할 수 있습니다.

정기적 인 콜백 (예약, 예약 취소 등)을 예약 할 수 있습니다.

일부 작업 (runAction, stopAction 등)을 수행 할 수 있습니다.

하위 클래스 노드는 일반적으로 다음을 의미합니다 (단일 / 모두).

* 초기화 리소스를 다시 작성하고 콜백을 정렬 할 수 있습니다.

* 시간을 운영하기 위해 콜백을 만듭니다.

* 렌더 노드에 "그리기"재정의;

노드의 속성은 위치, 확대 / 축소, 회전, 틸트, 앵커 포인트, 콘텐츠 크기, 가시성입니다.

다음은 노드의 일반적으로 사용되는 몇 가지 운영 기능과 새로운 기능을 소개합니다.

(1) 노드의 속성

(2) 노드 운영

(3) 액션 관련 액션

(4) 타이머 관련 일정

(5) NodeRBGA 클래스 통합

(6) 자식 노드 enumerateChildren 찾기

(7) 렌더링 순서 zOrder

(8) 좌표 변환

1. 노드의 속성

노드의 속성은 위치, 확대 / 축소, 회전, 기울기, 앵커 포인트, 콘텐츠 크기 및 가시성입니다.

//

/ **

* 위치

* 노드의 좌표 (x, y)를 설정합니다. OpenGL의 좌표

* 3D 좌표 추가

* 표준화 된 좌표 설정 추가

* /

가상 무효 setPosition (const Vec2 & position); // Vec2 坐标

virtual void setPosition (float x, float y); // (x, y), Vec2보다 효율적

가상 무효 setPositionX (float x);

가상 무효 setPositionY (float y);

가상 const Vec2 & getPosition () const;

가상 무효 getPosition (float * x, float * y) const;

가상 플로트 getPositionX (void) const;

가상 플로트 getPositionY (void) const;

// 3D 좌표 증가

가상 무효 setPosition3D (const Vec3 & 위치); // Vec3 坐标

가상 Vec3 getPosition3D () const;

가상 무효 setPositionZ (float positionZ);

가상 플로트 getPositionZ () const;

// 표준화 된 좌표 설정 추가

// 노드의 위치 픽셀은 부모 노드의 크기에 따라 계산됩니다.

// 크기 s = getParent ()-> getContentSize ();

// _ 위치 = 위치 * s;

가상 무효 setNormalizedPosition (const Vec2 & position);

가상 const Vec2 & getNormalizedPosition () const;

/ **

* 규모

* 노드 스케일 설정 XYZ 축 스케일

* 예 : 사진의 너비 X, 높이 Y, 깊이 Z 크기 조정

* /

virtual void setScaleX (float scaleX); // X 축소

virtual void setScaleY (float scaleY); // 줌 높이 Y

virtual void setScaleZ (float scaleZ); // 줌 깊이 Z

virtual void setScale (float scaleX, float scaleY); // X는 fScaleX 배, Y는 fScaleY 배

virtual void setScale (float scale); // XYZ는 동시에 확대 및 축소합니다.

가상 플로트 getScaleX () const;

가상 플로트 getScaleY () const;

가상 플로트 getScaleZ () const;

virtual float getScale () const; // x와 y 스케일 팩터가 같을 때 노드의 스케일 팩터를 얻습니다.

/ **

* 회전

* 노드의 회전 각도를 설정합니다. 시계 방향으로 음수, 시계 반대 방향으로 양수 회전

* 3D 회전 추가

* /

가상 무효 setRotation (부동 회전);

가상 플로트 getRotation () const;

// 3D 회전 증가

가상 무효 setRotation3D (const Vec3 & rotation);

가상 Vec3 getRotation3D () const;

/ **

* 틸트 스큐

* XY 축의 기울기 각도 설정

* setRotationalSkew ()는 Flash의 기울기 기능을 시뮬레이션합니다.

* setSkew ()는 실제 기울기 함수를 사용합니다.

* /

virtual void setSkewX (float skewX); // 수평 회전 및 기울기. 음의 시계 방향 변형

virtual void setSkewY (float skewY); // 세로 회전 및 기울기

가상 무효 setRotationSkewX (float rotationX);

가상 무효 setRotationSkewY (float rotationY);

가상 플로트 getSkewX () const;

가상 플로트 getSkewY () const;

가상 플로트 getRotationSkewX () const;

가상 플로트 getRotationSkewY () const;

/ **

* 앵커 포인트

* 앵커 포인트는 화면에 그림을 고정하는 압정과 같으며 앵커 포인트는 그림의 좌표입니다.

* 물론 압정은 왼쪽 하단, 오른쪽 상단 또는 사진 중앙에 고정 할 수 있습니다.

* (0,0)은 왼쪽 하단 모서리를 의미하고, (1,1)은 오른쪽 상단 모서리를 의미합니다.

* 기본 앵커 포인트는 노드의 정확한 중심 인 (0.5,0.5)입니다.

* /

virtual void setAnchorPoint (const Vec2 & anchorPoint); // 표준화 된 앵커 포인트

virtual const Vec2 & getAnchorPoint () const; // 표준화 된 앵커 포인트

virtual const Vec2 & getAnchorPointInPoints () const; // 절대 픽셀의 기준점, 즉 화면 좌표를 반환합니다.

// 앵커 포인트 설정 무시 여부

// 앵커 포인트 설정이 무시되면 앵커 포인트는 항상 (0,0)이됩니다.

// 기본값은 false이지만 Layer 및 Scene에서는 true입니다.

// 이것은 레이어와 씬에서만 사용되는 내부 메서드입니다. 직접 호출하지 마세요!

가상 무효 ignoreAnchorPointForPosition (bool ignore);

가상 부울 isIgnoreAnchorPointForPosition () const;

/ **

* 콘텐츠 크기

* contentSize는 노드의 크기 조정 또는 회전 여부에 관계없이 여전히 동일합니다.

* 모든 노드에는 크기가 있으며 레이어와 장면의 화면 크기는 동일합니다.

* /

가상 무효 setContentSize (const Size & contentSize);

가상 const Size & getContentSize () const;

/ **

* 표시

* /

가상 무효 setVisible (bool visible);

가상 부울 isVisible () const;

//

2. 노드 운영

노드 작업에는 태그, 이름, 사용자 지정 데이터, 상위 노드 관리, 하위 노드 관리 및 기타 작업 관리가 포함됩니다.

//

/ **

* 태그 및 이름

* setTag : 노드에 숫자 설정

* setName : 노드 이름 설정

* /

가상 무효 setTag (int tag);

가상 무효 setName (const std :: string & name);

virtual int getTag () const;

가상 std :: string getName () const;

/ **

* 사용자 정의 데이터 UserData / Object

* setUserData : 사용자 정의 데이터를 설정하며 데이터 블록, 구조 또는 객체가 될 수 있습니다.

* setUserObject : 사용자 정의 객체를 설정합니다. userData와 비슷하지만 void가 아닌 객체입니다 *

* /

가상 무효 setUserData (void * userData);

가상 무효 setUserObject (Ref * userObject);

가상 void * getUserData ();

가상 참조 * getUserObject ();

/ **

* 부모 노드 부모 설정

* setParent, removeFromParent

* /

가상 무효 setParent (노드 * 부모);

가상 노드 * getParent ();

가상 무효 removeFromParent ();

virtual void removeFromParentAndCleanup (bool cleanup); // true는 노드의 모든 액션과 콜백 함수를 삭제합니다.

/ **

* 자식 노드 자식 관리

* addChild,

* getChildBy **, getChildren, getChildrenCount

* removeChild, removeAllChildren

* reorderChild, sortAllChildren

* /

// 자식 노드 추가

// localZOrder Z 축 순서는 페인팅의 우선 순위입니다.

// 태그 노드 번호, 자식 노드는 태그를 통해 얻을 수 있습니다.

// 이름 노드 이름, 자식 노드는 이름으로 얻을 수 있습니다.

가상 무효 addChild (노드 * 자식);

가상 무효 addChild (Node * child, int localZOrder);

virtual void addChild (Node * child, int localZOrder, int tag);

virtual void addChild (Node * child, int localZOrder, const std :: string & name);

// 하위 노드 가져 오기

가상 노드 * getChildByTag (int tag) const;

가상 노드 * getChildByName (const std :: string & name) const;

virtual Vector & getChildren (); // 모든 자식 노드를 가져 와서 벡터 배열로 반환

virtual ssize_t getChildrenCount () const; // 총 자식 노드 수

// 자식 노드 삭제

virtual void removeChild (Node * child, bool cleanup = true);

virtual void removeChildByTag (int tag, bool cleanup = true);

virtual void removeChildByName (const std :: string & name, bool cleanup = true);

virtual void removeAllChildren (); // 모든 노드 삭제

virtual void removeAllChildrenWithCleanup (bool cleanup); // cleanup은 자식 노드의 모든 작업을 삭제하는 경우 true입니다.

// 자식 노드 재정렬

// 자식 노드를 재정렬하고 z 축의 새 값을 설정합니다.

// 자식이 추가되어야합니다.

// localZOrder 그리기 우선 순위에 대한 Z 축 순서

가상 무효 reorderChild (노드 * 자식, int localZOrder);

virtual void sortAllChildren (); // 모든 자식 노드 재정렬

/ **

* 기타 운영 관리

* /

virtual void onEnter (); // 노드가 스테이지에 진입하기 시작하면 호출되며 생성시 호출됩니다.

virtual void onEnterTransitionDidFinish (); // 노드가 스테이지에 진입 한 후 호출, 즉 생성 후 호출됩니다.

virtual void onExit (); // 노드가 스테이지를 떠날 때 호출됩니다. 제거되면 호출됩니다.

virtual void onExitTransitionDidStart (); // 노드가 스테이지를 떠나기 전에 호출됩니다.

// 노드 그리기

가상 void draw () 최종;

// 모든 자식 노드를 재귀 적으로 방문하고 다시 그리기

가상 무효 방문 () 최종;

// 노드 (노드)가 포함 된 장면 (장면)을 반환합니다.

// 어떤 장면에도 속하지 않으면 nullptr을 반환합니다.

가상 장면 * getScene () const;

// 부모 노드의 좌표에서 노드의 직사각형 경계 상자를 반환합니다.

가상 Rect getBoundingBox () const;

// 모든 활성 작업 및 스케줄러 일시 중지

가상 void cleanup ();

//

3. 액션 관련 액션

작업 관리 : 실행, 일시 중지, 취소 및 기타 작업.

//

/ **

* 액션 관리 액션

* setActionManager

* runAction, stopAction, getActionByTag, getNumberOfRunningActions

* /

// 모든 액션에서 사용하는 ActionManager 객체를 설정합니다.

// 새로운 ActionManager를 설정하면 이전에 생성 된 액션이 삭제됩니다.

가상 무효 setActionManager (ActionManager * actionManager);

가상 ActionManager * getActionManager ();

Action * runAction (Action * action); // 액션 실행

Action * getActionByTag (int tag); // 태그에 따라 작업 가져 오기

void stopAllActions (); // 작업 일시 중지

void stopAction (Action * action); // 작업 일시 중지

void stopActionByTag (int tag); // 작업 일시 중지

ssize_t getNumberOfRunningActions () const; // 실행중인 작업의 수를 가져옵니다.

//

4. 타이머 관련 일정

타이머 관리, 기본 타이머, 사용자 지정 타이머, 일회성 타이머.

//

/ **

* 타이머 관리 일정

* setScheduler

* scheduleUpdate : 기본 타이머

* 일정 : 맞춤 타이머

* scheduleOnce : 일회성 타이머

* /

// 모든 "업데이트"및 타이머를 예약하도록 스케줄러 개체 설정

// 새 스케줄러를 설정하면 이전에 생성 된 타이머 / 업데이트가 삭제됩니다.

가상 무효 setScheduler (Scheduler * 스케줄러);

virtual Scheduler * getScheduler (); // 스케줄러 객체 가져 오기

// 기본 타이머를 켭니다. 새로 고침 횟수는 초당 60 회, 즉 초당 60 프레임입니다.

// 업데이트 (부동 델타) 콜백 함수에 해당합니다.

// 타이머에 우선 순위를 부여합니다. 우선 순위가 낮을수록 우선 순위가 높습니다.

void scheduleUpdate (void);

void scheduleUpdateWithPriority (int priority);

void unscheduleUpdate (void); // 기본 타이머 취소

virtual void update (float delta); // update는 scheduleUpdate 타이머의 콜백 함수입니다.

// 맞춤 타이머를 설정합니다. 기본값은 초당 60 프레임입니다.

// interval : 간격 (초)마다 한 번씩 실행합니다.

// repeat : 반복 횟수.

// delay : 지연 시간, 즉 타이머 지연이 생성 된 후 실행을 시작합니다.

무효 일정 (SEL_SCHEDULE 선택기, 부동 간격, 부호없는 정수 반복, 부동 지연);

무효 일정 (SEL_SCHEDULE 선택기, 부동 간격);

void schedule (SEL_SCHEDULE selector); // 기본값은 초당 60 프레임입니다.

void scheduleOnce (SEL_SCHEDULE selector, float delay); // 한 번만 실행, 지연 시간 후 실행

void unschedule (SEL_SCHEDULE selector); // 맞춤 타이머 취소

void unscheduleAllSelectors (void); // 모든 타이머 취소

void resume (void); // 모든 타이머와 액션을 재개

void pause (void); // 모든 타이머 및 작업 일시 중지

//

5. NodeRGBA 클래스 통합

NodeRGBA 클래스를 통합하고 색상 및 투명도 설정을 높입니다.

//

/ **

* NodeRGBA 클래스 통합

* setOpacity : 투명도

* setColor : 색상

* /

가상 GLubyte getOpacity () const;

가상 GLubyte getDisplayedOpacity () const;

virtual void setOpacity (GLubyte opacity);

가상 const Color3B & getColor () const;

가상 const Color3B & getDisplayedColor () const;

가상 무효 setColor (const Color3B & color);

//

6 、 enumerateChildren

Node :: enumerateChildren 메서드를 추가하고 C ++ 11 정규식을 지원합니다.

노드 노드의 자식 노드를 열거하고 이름이 "이름 와일드 카드"와 일치하는 자식 노드가 콜백 함수를 실행하도록하는 데 사용됩니다.

콜백 함수의 반환 유형은 bool 값이어야하며 true를 반환하면 검색이 종료됩니다.

//

virtual void enumerateChildren (const std :: string & name, std :: function callback) const;

//

사용 예 :

//

// 이름이 'nameToFind'이고 숫자로 끝나는 노드를 찾습니다.

node-> enumerateChildren ( "nameToFind [[: digit :]] +",

[] (노드 * 노드)-> bool {... false를 반환합니다. // 첫 번째 일치에서 중지하려면 true를 반환});

// 이름이 'nameToFind'인 노드를 찾고 재귀 적으로 숫자로 끝납니다.

node-> enumerateChildren ( "nameToFind [[: digit :]] +",

[] (노드 * 노드)-> bool {... false를 반환합니다. // 첫 번째 일치에서 중지하려면 true를 반환});

//

와일드 카드 일치의 예 :

//

// 검색 구문 옵션

'//': 모든 하위 노드를 재귀 적으로 방문하며 검색 문자열의 시작 부분에만 배치 할 수 있습니다.

'..': 검색이 노드의 부모 노드로 이동하며 문자열 끝에 만 위치 할 수 있습니다.

'/': 노드로 이동 한 자식 노드를 검색하며, 검색 문자열의 시작을 제외한 모든 위치에 배치 할 수 있습니다.

// 코드 예

enumerateChildren ( "// MyName", ...) : Node.js의 모든 자식 노드를 재귀 적으로 방문합니다. "MyName"과 일치하는 자식 노드 찾기

enumerateChildren ( "[[: alnum :]] +", ...) : Node.js의 자식에서 찾습니다. 모든 아이템

enumerateChildren ( "A [[: digit :]]", ...) : Node.js의 자식에서 찾습니다. "A0", "A1", ..., "A9"라는 하위 노드

enumerateChildren ( "Abby / Normal", ...) : Node.js의 손자에서 찾습니다. 노드는 "Normal"이고 부모 노드는 "Abby"입니다.

enumerateChildren ( "// Abby / Normal", ...) : Node.js의 모든 자식 노드를 재귀 적으로 방문합니다. 노드는 "Normal"이고 부모 노드는 "Abby"입니다.

//

참고 : gccV4.8 이하로 빌드 된 프로그램은 실행시 충돌합니다. OTHER_LDFLAGS는 Xcode6 beta3에서 사용할 수 없으므로 iOS에서 64 비트 라이브러리 파일을 포함한 fat 라이브러리를 사용합니다. 그러나 Xcode 5.0 이하에서는이 방법을 지원하지 않습니다.

그래서 :

* Android 컴파일에는 NDK R9D 이상이 필요합니다.

* Linux 컴파일에는 GCC4.9 이상이 필요합니다.

* iOS 컴파일에는 Xcode5.1 이상이 필요합니다.

7. 렌더링 순서

2.x에서 Zorder는 노드 렌더링 순서를 제어하는 ​​데 사용됩니다. 3.x에서 렌더링 순서는 두 가지 요소에 의해 결정됩니다.

글로벌 Z 순서 : GlobalZOrder. 모든 노드 간의 비교.

로컬 Z 순서 : LocalZOrder. 형제 노드 간의 비교.

Z 순서가 작을수록 첫 번째 렌더링입니다.

7.1 글로벌 Z 순서

렌더링 노드의 순서를 정의합니다. 전역 Z 순서가 더 작은 노드가 먼저 렌더링됩니다.

가정 : 두 개 이상의 노드가 동일한 전역 Z 순서를 가지고 있으므로 렌더링 순서를 보장 할 수 없습니다. 유일한 예외는 노드의 전역 Z 순서가 0이면 장면 그래프 순서를 사용할 수 있다는 것입니다.

기본적으로 모든 노드의 전역 Z 순서는 0입니다. 즉, 기본적으로 노드를 렌더링하는 데 장면 그래프 순서가 사용됩니다.

전역 Z 순서는 장면 그래프 순서 대신 다른 순서로 노드를 렌더링해야 할 때 매우 유용합니다.

제한 사항 : "SpriteBatchNode"를 상속받은 노드는 전역 Z 순서를 사용할 수 없습니다.

//

가상 무효 setGlobalZOrder (float globalZOrder);

가상 플로트 getGlobalZOrder () const;

//

7.2 로컬 Z 순서

LocalZOrder는 노드와 형제 노드 간의 상관 관계를 구별하는 "키"입니다.

부모 노드는 LocalZOrder 값으로 모든 자식 노드를 구분합니다. 두 노드의 LocalZOrder가 동일한 경우 먼저 자식 노드 배열에 추가 된 노드가 나중에 추가되는 노드 앞에 표시됩니다.

마찬가지로 장면 그래프는 "순서대로 (순서대로)"순회 알고리즘을 사용하여 순회합니다. 그리고 LocalZOrder 값이 0보다 작은 노드는 "왼쪽"하위 트리 (왼쪽 하위 트리)이므로 LocalZOrder가 0보다 큰 값 노드는 "오른쪽"하위 트리 (오른쪽 하위 트리)입니다.

//

//이 노드의 로컬 Z 순서 설정 ((동위 노드에 상대적))

가상 무효 setLocalZOrder (int localZOrder);

virtual int getLocalZOrder () const;

//

8. 좌표 변환

참조 : "Cocos2d-x 3.0 좌표계 상세 설명"

8.1 좌표 변환 기능

좌표에는 두 가지 유형이 있습니다.

세계 좌표 : 상대 노드의 세계 좌표입니다.

로컬 좌표 : 상대 노드의 좌표.

8.2 예

 

 

 

 

node1의 좌표는 (20,40) 및 앵커 포인트 (0,0)입니다.

node2의 좌표는 (-5, -20), 앵커 포인트 (1,1)입니다.

Vec2 point1 = node1-> convertToNodeSpace (node2-> getPosition ());

* 결과 : (-25, -60). (즉 : 상대 노드 1 노드 좌표 위치, 상대 좌표)

* 분석 : node1에 대한 node2의 좌표는 (-5, -20)-(20,40)입니다.

* 즉, node1에 대한 node2의 좌표 위치입니다.

Vec2 point2 = node1-> convertToWorldSpace (node2-> getPosition ());

* 결과 : (15,20). (즉 : 세계 좌표 인 node1의 세계 좌표계를 기준으로 함)

* 분석 : node1을 참조로하고 세계 좌표로 변환 : (20,40) + (-5, -20).

* 즉, node2의 좌표는 이제 node1의 좌표 위치에 상대적인 것으로 간주되어 세계 좌표로 변환됩니다.

8.3 스크린 터치에서의 적용

터치 포인트가 스프라이트 이미지 sp의 내부 영역에 닿는 지 확인합니다.

//

bool HelloWorld :: onTouchBegan (터치 * touch, 이벤트 * unused_event)

{

// 접촉 좌표를 상대 노드 sp, 상대 좌표로 변환

Vec2 포인트 = sp-> convertTouchToNodeSpace (touch);

// sp의 크기 사각형 구성

크기 크기 = sp-> getContentSize ();

Rect rect = Rect (0, 0, size.width, size.height);

// 접촉이 sp 내부에 닿았는지 확인

if (rect.containsPoint (point)) {

CCLog ( "포인트 입력");

true를 반환하십시오.

}

거짓 반환;

}

//

추천

출처blog.csdn.net/qq_21743659/article/details/108660045