cocod2d-x 之 CCDirector、CCScene、CCSprite

  CCDirector是控制游戏流程的主要组件。

  

  1 typedef enum {
  2     /// sets a 2D projection (orthogonal projection)2D投机模式
  3     kCCDirectorProjection2D,
  4
  5     /// sets a 3D projection with a fovy=60, znear=0.5f and zfar=1500.3D投影
  6     kCCDirectorProjection3D,
  7
  8     /// it calls "updateProjection" on the projection delegate.
  9     kCCDirectorProjectionCustom,
 10
 11     /// Default projection is 3D projection
 12     kCCDirectorProjectionDefault = kCCDirectorProjection3D,
 13 } ccDirectorProjection;
 14
 15 class CC_DLL CCDirector : public CCObject, public TypeInfo
 16 {
 17 public:
 18
 19     CCDirector(void);
 20     virtual ~CCDirector(void);
 21     virtual bool init(void);
 22     virtual long getClassTypeInfo() {
 23         static const long id = cocos2d::getHashCodeByString(typeid(cocos2d::CCDirector).name());
 24         return id;
 25     }
 26
 27     //获取当前运行的Scene
 28     inline CCScene* getRunningScene(void) { return m_pRunningScene; }
 29
 30     /** Get the FPS value *///获取动画绘制间隔
 31     inline double getAnimationInterval(void) { return m_dAnimationInterval; }
 32     /** Set the FPS value. *///设置动画间隔
 33     virtual void setAnimationInterval(double dValue) = 0;
 34
 35     /** Whether or not to display the FPS on the bottom-left corner *///是否显示状态fps、绘制间隔等
 36     inline bool isDisplayStats(void) { return m_bDisplayStats; }
 37     /** Display the FPS on the bottom-left corner */
 38     inline void setDisplayStats(bool bDisplayStats) { m_bDisplayStats = bDisplayStats; }
 39
 40     /** seconds per frame *///每秒钟绘制多少帧
 41     inline float getSecondsPerFrame() { return m_fSecondsPerFrame; }
 42
 43     /** Get the CCEGLView, where everything is rendered
 44      * @js NA
 45      */
 46     inline CCEGLView* getOpenGLView(void) { return m_pobOpenGLView; }
 47     void setOpenGLView(CCEGLView *pobOpenGLView);
 48
 49     inline bool isNextDeltaTimeZero(void) { return m_bNextDeltaTimeZero; }
 50     void setNextDeltaTimeZero(bool bNextDeltaTimeZero);
 51
 52     /** Whether or not the Director is paused *///是否暂停
 53     inline bool isPaused(void) { return m_bPaused; }
 54
 55     /** How many frames were called since the director started *///共绘制了多少帧
 56     inline unsigned int getTotalFrames(void) { return m_uTotalFrames; }
 57
 58     /** Sets an OpenGL projection
 59      @since v0.8.2
 60      @js NA
 61      */
 62     inline ccDirectorProjection getProjection(void) { return m_eProjection; }
 63     void setProjection(ccDirectorProjection kProjection);
 64      /** reshape projection matrix when canvas has been change"*/画布改变后,重塑投影矩阵
 65     void reshapeProjection(const CCSize& newWindowSize);
 66
 67     /** Sets the glViewport*/
 68     void setViewport();
 69
 70     /** How many frames were called since the director started */
 71     inline bool isSendCleanupToScene(void) { return m_bSendCleanupToScene; }
 72
 73     CCNode* getNotificationNode();
 74     void setNotificationNode(CCNode *node);
 75
 76     /** CCDirector delegate. It shall implemente the CCDirectorDelegate protocol
 77      */
 78     CCDirectorDelegate* getDelegate() const;
 79     void setDelegate(CCDirectorDelegate* pDelegate);
 80
 81     // window size,设计分辨率
 82     /** returns the size of the OpenGL view in points.
 83     */
 84     CCSize getWinSize(void);
 85
 86     /** returns the size of the OpenGL view in pixels.
 87     */
 88     CCSize getWinSizeInPixels(void);
 89
 90     /** returns visible size of the OpenGL view in points.
 91      *  the value is equal to getWinSize if don‘t invoke
 92      *  CCEGLView::setDesignResolutionSize()
 93      *///openGL的可视区大小,是在 WinSize 之内,保持 FrameSize 的宽高比所能占用的最大区域?
 94     CCSize getVisibleSize();
 95
 96     /** returns visible origin of the OpenGL view in points.
 97      */
 98     CCPoint getVisibleOrigin();
 99
100     /** converts a UIKit coordinate to an OpenGL coordinate
101      Useful to convert (multi) touch coordinates to the current layout (portrait or landscape)
102      *///将一个点坐标从UI坐标(坐上角为原点)转换为openGL坐标(左下角为坐标),主要用于在点击事件中将点击坐标转换为屏幕坐标
103     CCPoint convertToGL(const CCPoint& obPoint);
104
105     /** converts an OpenGL coordinate to a UIKit coordinate
106      Useful to convert node points to window points for calls such as glScissor
107      *///将一个点转换为UI坐标的点
108     CCPoint convertToUI(const CCPoint& obPoint);
109
110     /// XXX: missing description
111     float getZEye(void);
112
113     // Scene Management
114
115     /** Enters the Director‘s main loop with the given Scene.
116      * Call it to run only your FIRST scene.
117      * Don‘t call it if there is already a running scene.
118      *
119      * It will call pushScene: and then it will call startAnimation
120      *///加载场景并运行,游戏开始时调用
121     void runWithScene(CCScene *pScene);
122
123     /** Suspends the execution of the running scene, pushing it on the stack of suspended scenes.
124      * The new scene will be executed.
125      * Try to avoid big stacks of pushed scenes to reduce memory allocation.
126      * ONLY call it if there is a running scene.
127      */
128     void pushScene(CCScene *pScene);
129
130     /** Pops out a scene from the queue.
131      * This scene will replace the running one.
132      * The running scene will be deleted. If there are no more scenes in the stack the execution is terminated.
133      * ONLY call it if there is a running scene.
134      */
135     void popScene(void);
136
137     /** Pops out all scenes from the queue until the root scene in the queue.
138      * This scene will replace the running one.
139      * Internally it will call `popToSceneStackLevel(1)`
140      */
141     void popToRootScene(void);
142
143     /** Pops out all scenes from the queue until it reaches `level`.
144      If level is 0, it will end the director.
145      If level is 1, it will pop all scenes until it reaches to root scene.
146      If level is <= than the current stack level, it won‘t do anything.
147      */
148      void popToSceneStackLevel(int level);
149
150     /** Replaces the running scene with a new one. The running scene is terminated.
151      * ONLY call it if there is a running scene.
152      */
153     void replaceScene(CCScene *pScene);
154
155     /** Ends the execution, releases the running scene.
156      It doesn‘t remove the OpenGL view from its parent. You have to do it manually.
157      *///游戏结束,释放场景,但未移除openGL view
158     void end(void);
159
160     /** Pauses the running scene.
161      The running scene will be _drawed_ but all scheduled timers will be paused
162      While paused, the draw rate will be 4 FPS to reduce CPU consumption
163      *///游戏暂停
164     void pause(void);
165
166     /** Resumes the paused scene
167      The scheduled timers will be activated again.
168      The "delta time" will be 0 (as if the game wasn‘t paused)
169      *///游戏恢复
170     void resume(void);
171
172     /** Stops the animation. Nothing will be drawn. The main loop won‘t be triggered anymore.
173      If you don‘t want to pause your animation call [pause] instead.
174      *///停止动画
175     virtual void stopAnimation(void) = 0;
176
177     /** The main loop is triggered again.
178      Call this function only if [stopAnimation] was called earlier
179      @warning Don‘t call this function to start the main loop. To run the main loop call runWithScene
180      *///开始动画
181     virtual void startAnimation(void) = 0;
182
183     /** Draw the scene.
184     This method is called every frame. Don‘t call it manually.
185     */
186     void drawScene(void);
187
188     // Memory Helper
189
190     /** Removes cached all cocos2d cached data.
191      It will purge the CCTextureCache, CCSpriteFrameCache, CCLabelBMFont cache
192      @since v0.99.3
193      *///清楚缓存数据,包括纹理、精灵、Label等
194     void purgeCachedData(void);
195
196     /** sets the default values based on the CCConfiguration info */
197     void setDefaultValues(void);
198
199     // OpenGL Helper
200
201     /** sets the OpenGL default values */
202     void setGLDefaultValues(void);
203
204     /** enables/disables OpenGL alpha blending */
205     void setAlphaBlending(bool bOn);
206
207     /** enables/disables OpenGL depth test */
208     void setDepthTest(bool bOn);
209
210     virtual void mainLoop(void) = 0;
211
212     /** The size in pixels of the surface. It could be different than the screen size.
213     High-res devices might have a higher surface size than the screen size.
214     Only available when compiled using SDK >= 4.0.
215     @since v0.99.4
216     *///设置缩放参数
217     void setContentScaleFactor(float scaleFactor);
218     float getContentScaleFactor(void);
219
220 public:
221     /** CCScheduler associated with this director
222      @since v2.0
223      *///声明成员属性
224     CC_PROPERTY(CCScheduler*, m_pScheduler, Scheduler);
225
226     /** CCActionManager associated with this director
227      @since v2.0
228      */
229     CC_PROPERTY(CCActionManager*, m_pActionManager, ActionManager);
230
231     /** CCTouchDispatcher associated with this director
232      @since v2.0
233      */
234     CC_PROPERTY(CCTouchDispatcher*, m_pTouchDispatcher, TouchDispatcher);
235
236     /** CCKeypadDispatcher associated with this director
237      @since v2.0
238      */
239     CC_PROPERTY(CCKeypadDispatcher*, m_pKeypadDispatcher, KeypadDispatcher);
240
241     /** CCAccelerometer associated with this director
242      @since v2.0
243      @js NA
244      @lua NA
245      */
246     CC_PROPERTY(CCAccelerometer*, m_pAccelerometer, Accelerometer);
247
248     /* delta time since last tick to main loop */
249     CC_PROPERTY_READONLY(float, m_fDeltaTime, DeltaTime);
250
251 public:
252     /** returns a shared instance of the director
253      *  @js getInstance
254      */
255     static CCDirector* sharedDirector(void);
256
257 protected:
258
259     void purgeDirector();//清空director
260     bool m_bPurgeDirecotorInNextLoop; // this flag will be set to true in end()
261
262     void setNextScene(void);
263
264     void showStats();
265     void createStatsLabel();
266     void calculateMPF();
267     void getFPSImageData(unsigned char** datapointer, unsigned int* length);
268
269     /** calculates delta time since last time it was called */
270     void calculateDeltaTime();
271 protected:
272     /* The CCEGLView, where everything is rendered */
273     CCEGLView    *m_pobOpenGLView;
274
275     double m_dAnimationInterval;
276     double m_dOldAnimationInterval;
277
278     /* landscape mode ? */
279     bool m_bLandscape;
280
281     bool m_bDisplayStats;
282     float m_fAccumDt;
283     float m_fFrameRate;
284
285     CCLabelAtlas *m_pFPSLabel;
286     CCLabelAtlas *m_pSPFLabel;
287     CCLabelAtlas *m_pDrawsLabel;
288
289     /** Whether or not the Director is paused */
290     bool m_bPaused;//是否暂停
291
292     /* How many frames were called since the director started */
293     /* 开始运行后共渲染了多少帧 */
294     unsigned int m_uTotalFrames;
295     unsigned int m_uFrames;
296     float m_fSecondsPerFrame;//每秒的帧率
297
298     /* The running scene */
299     CCScene *m_pRunningScene;//当前场景
300
301     /* will be the next ‘runningScene‘ in the next frame
302      nextScene is a weak reference. */
303     CCScene *m_pNextScene;//下一个场景
304
305     /* If YES, then "old" scene will receive the cleanup message */
306     bool    m_bSendCleanupToScene;//是否清空前一个场景
307
308     /* scheduled scenes */
309     CCArray* m_pobScenesStack;//scene场景列表
310
311     /* last time the main loop was updated */
312     struct cc_timeval *m_pLastUpdate;//游戏主循环上一次刷新的时间
313
314     /* whether or not the next delta time will be zero */
315     bool m_bNextDeltaTimeZero;
316
317     /* projection used */
318     ccDirectorProjection m_eProjection;
319
320     /* window size in points */
321     CCSize    m_obWinSizeInPoints;//窗口大小
322
323     /* content scale factor */
324     float    m_fContentScaleFactor;//缩放
325
326     /* store the fps string */
327     char *m_pszFPS;
328
329     /* This object will be visited after the scene. Useful to hook a notification node */
330     CCNode *m_pNotificationNode;
331
332     /* Projection protocol delegate */
333     CCDirectorDelegate *m_pProjectionDelegate;//代理
334
335     // CCEGLViewProtocol will recreate stats labels to fit visible rect//根据模式重绘画面,用于适配各种屏幕分辨率
336     friend class CCEGLViewProtocol;
337 };
338
339 CCDirector.h

  CCDirector常用方法

  CCDirector *pDirector = CCDirector::sharedDirector() //获取CCDirector

  runWithScene(CCScene* scene) //启动游戏并运行scene

  replaceScene(CCScene* scene) //使用传入的scene替换当前场景来切换画面,当前场景将被释放

  pushScene(CCScene* scene) //将当前运行中的场景暂停并压入到代执行场景栈中,再将传入的scene设置为当前运行场景

  popScene() //释放当前场景,再从代执行场景栈中弹出栈顶的场景,并将其设置为当前运行场景。如果栈为空,则直接结束应用

  pause() //暂停当前运行场景中的所有计时器和动作,场景仍然会显示在屏幕上

  resume() //恢复当前运行场景中被暂停的计时器和动作。它与pause配合使用
  end() //结束场景,同时退出应用

  以上三种切换场景的方法(replaceScene、pushScene、popScene)均是先将待切换的场景完全加载完毕后,才将当前运行的场景释放掉。所以,在新场景恰好完全加载完毕的瞬间,系统中同时存在着两个场景,这将是对内存的一个考验,若不注意的话,切换场景可能会造成内存不足

  

  CCScene定义了一个场景。场景只是层的容器,包含了所有需要显示的游戏元素

  CCLayer定义了一个层。与CCScene类似,层也扮演着容器的角色。然而与场景不同的是,层通常包含的是直接呈现在屏幕上的具体内容.

  

 1 //cocos2d-x-2.2/cocos2dx/layers_scenes_transitions_nodes/CCLayer.h
 2
 3  class CC_DLL CCLayer : public CCNode, public CCTouchDelegate, public CCAccelerometerDelegate, public CCKeypadDelegate
 4 {
 5 public:
 6     CCLayer();
 7     virtual ~CCLayer();
 8     virtual bool init();
 9     static CCLayer *create(void);
10     virtual void onEnter();
11     virtual void onExit();
12     virtual void onEnterTransitionDidFinish();
13
14     // 触摸事件处理函数
15     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
16     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
17     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
18     virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
19
20     // 多点触摸
21     virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
22     virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
23     virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
24     virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);
25
26     virtual void didAccelerate(CCAcceleration* pAccelerationValue);
27     void registerScriptAccelerateHandler(int nHandler);
28     void unregisterScriptAccelerateHandler(void);
29
30     virtual void registerWithTouchDispatcher(void);
31
32     /** Register script touch events handler */
33     //注册触摸事件
34     virtual void registerScriptTouchHandler(int nHandler, bool bIsMultiTouches = false, int nPriority = INT_MIN, bool bSwallowsTouches = false);
35     /** Unregister script touch events handler */
36     virtual void unregisterScriptTouchHandler(void);
37
38     /** 是否处理触摸事件
39     */
40     virtual bool isTouchEnabled();
41     virtual void setTouchEnabled(bool value);
42
43     virtual void setTouchMode(ccTouchesMode mode);
44     virtual int getTouchMode();
45
46     /** priority of the touch events. Default is 0 */
47     virtual void setTouchPriority(int priority);
48     virtual int getTouchPriority();
49
50     /** whether or not it will receive Accelerometer events
51     You can enable / disable accelerometer events with this property.
52     @since v0.8.1
53     */
54     virtual bool isAccelerometerEnabled();
55     virtual void setAccelerometerEnabled(bool value);
56     virtual void setAccelerometerInterval(double interval);
57
58     /** whether or not it will receive keypad events
59     You can enable / disable accelerometer events with this property.
60     it‘s new in cocos2d-x
61     */
62     virtual bool isKeypadEnabled();
63     virtual void setKeypadEnabled(bool value);
64
65     /** Register keypad events handler */
66     void registerScriptKeypadHandler(int nHandler);
67     /** Unregister keypad events handler */
68     void unregisterScriptKeypadHandler(void);
69
70     virtual void keyBackClicked(void);
71     virtual void keyMenuClicked(void);
72
73     inline CCTouchScriptHandlerEntry* getScriptTouchHandlerEntry() { return m_pScriptTouchHandlerEntry; };
74     inline CCScriptHandlerEntry* getScriptKeypadHandlerEntry() { return m_pScriptKeypadHandlerEntry; };
75     inline CCScriptHandlerEntry* getScriptAccelerateHandlerEntry() { return m_pScriptAccelerateHandlerEntry; };
76 protected:
77     bool m_bTouchEnabled;
78     bool m_bAccelerometerEnabled;
79     bool m_bKeypadEnabled;
80
81 private:
82     // Script touch events handler
83     CCTouchScriptHandlerEntry* m_pScriptTouchHandlerEntry;
84     CCScriptHandlerEntry* m_pScriptKeypadHandlerEntry;
85     CCScriptHandlerEntry* m_pScriptAccelerateHandlerEntry;
86
87     int m_nTouchPriority;
88     ccTouchesMode m_eTouchMode;
89
90     int  excuteScriptTouchHandler(int nEventType, CCTouch *pTouch);
91     int  excuteScriptTouchHandler(int nEventType, CCSet *pTouches);
92 };

  向场景中添加层,我们可以使用addChild方法。

  void addChild(CCNode* child);

  void addChild(CCNode* child, int zOrder);
  void addChild(CCNode* child, int zOrder, int tag);
  其中child参数为将要添加的节点。对于场景而言,通常我们添加的节点就是层。先添加的层会被置于后添加的层之下。如果想要为它们指定先后次序,可以使用不同的zOrder值,zOrder代表了该节点下元素的先后次序,值越大则显示顺序越靠上。zOrder的默认值为0。tag是元素的标识号码,如果为子节点设置了tag值,就可以在它的父节点中利用tag值找到它了。这里我们可以选择自己需要的方法来向场景中添加层。

  

  CCSprite是CCNode的一个最重要也最灵活的子类。说它重要是因为CCSprite代表了游戏中一个最小的可见单位,说它灵活则是由于其装载了一个平面纹理,具有丰富的表现力,而且可以通过多种方式加载。如果说CCScene和CCLayer代表了宏观的游戏元素管理,那么CCSprite则为微观世界提供了丰富灵活的细节表现。

  创建精灵

  CCSprite* fish = CCSprite::create("fish.png");

  这个工厂方法包含一个字符串参数,表示精灵所用纹理的文件名。CCSprite会自动把图片作为纹理载入到游戏中,然后使用纹理初始化精灵。

  CCSprite* smallFish = CCSprite::create("fishes.png", CCRectMake(0, 0, 100, 100));

  仅显示纹理的一部分。

  向层中添加精灵

  this->addChild(fish);

  

  初始化方法

  static CCSprite* create(const char *pszFileName);

  static CCSprite* create(const char *pszFileName, const CCRect& rect);

  bool initWithFile(const char *pszFilename);

   bool initWithFile(const char *pszFilename, const CCRect& rect);

  使用CCTexture2D纹理创建精灵

  static CCSprite* create(CCTexture2D *pTexture);

  static CCSprite* create(CCTexture2D *pTexture, const CCRect& rect);
  bool initWithTexture(CCTexture2D *pTexture);
  bool initWithTexture(CCTexture2D *pTexture, const CCRect& rect);

  使用CCSpriteFrame精灵框帧创建精灵

  static CCSprite* create(CCSpriteFrame *pSpriteFrame);

  bool initWithSpriteFrame(CCSpriteFrame *pSpriteFrame);

  1 //cocos2d-x-2.2/cocos2dx/sprite_nodes/CCSprite.h
  2 class CC_DLL CCSprite : public CCNodeRGBA, public CCTextureProtocol
  3 #ifdef EMSCRIPTEN
  4 , public CCGLBufferedNode
  5 #endif // EMSCRIPTEN
  6 {
  7 public:
  8     /// @{
  9     /// @name Creators
 10
 11     /**
 12      * Creates an empty sprite without texture. You can call setTexture method subsequently.
 13      *
 14      * @return An empty sprite object that is marked as autoreleased.
 15      */
 16     static CCSprite* create();
 17
 18     /**
 19      * Creates a sprite with an image filename.
 20      *
 21      * After creation, the rect of sprite will be the size of the image,
 22      * and the offset will be (0,0).
 23      *
 24      * @param   pszFileName The string which indicates a path to image file, e.g., "scene1/monster.png".
 25      * @return  A valid sprite object that is marked as autoreleased.
 26      */
 27     static CCSprite* create(const char *pszFileName);
 28
 29     /**
 30      * Creates a sprite with an image filename and a rect.
 31      *
 32      * @param   pszFileName The string wich indicates a path to image file, e.g., "scene1/monster.png"
 33      * @param   rect        Only the contents inside rect of pszFileName‘s texture will be applied for this sprite.
 34      * @return  A valid sprite object that is marked as autoreleased.
 35      */
 36     static CCSprite* create(const char *pszFileName, const CCRect& rect);
 37
 38     /**
 39      * Creates a sprite with an exsiting texture contained in a CCTexture2D object
 40      * After creation, the rect will be the size of the texture, and the offset will be (0,0).
 41      *
 42      * @param   pTexture    A pointer to a CCTexture2D object.
 43      * @return  A valid sprite object that is marked as autoreleased.
 44      */
 45     static CCSprite* createWithTexture(CCTexture2D *pTexture);
 46
 47     /**
 48      * Creates a sprite with a texture and a rect.
 49      *
 50      * After creation, the offset will be (0,0).
 51      *
 52      * @param   pTexture    A pointer to an existing CCTexture2D object.
 53      *                      You can use a CCTexture2D object for many sprites.
 54      * @param   rect        Only the contents inside the rect of this texture will be applied for this sprite.
 55      * @return  A valid sprite object that is marked as autoreleased.
 56      */
 57     static CCSprite* createWithTexture(CCTexture2D *pTexture, const CCRect& rect);
 58
 59     /**
 60      * Creates a sprite with an sprite frame.
 61      *
 62      * @param   pSpriteFrame    A sprite frame which involves a texture and a rect
 63      * @return  A valid sprite object that is marked as autoreleased.
 64      */
 65     static CCSprite* createWithSpriteFrame(CCSpriteFrame *pSpriteFrame);
 66
 67     /**
 68      * Creates a sprite with an sprite frame name.
 69      *
 70      * A CCSpriteFrame will be fetched from the CCSpriteFrameCache by pszSpriteFrameName param.
 71      * If the CCSpriteFrame doesn‘t exist it will raise an exception.
 72      *
 73      * @param   pszSpriteFrameName A null terminated string which indicates the sprite frame name.
 74      * @return  A valid sprite object that is marked as autoreleased.
 75      */
 76     static CCSprite* createWithSpriteFrameName(const char *pszSpriteFrameName);
 77
 78     /// @}  end of creators group
 79
 80
 81
 82     /// @{
 83     /// @name Initializers
 84
 85     /**
 86      * Default constructor
 87      * @js ctor
 88      */
 89     CCSprite(void);
 90
 91     /**
 92      * Default destructor
 93      * @js NA
 94      * @lua NA
 95      */
 96     virtual ~CCSprite(void);
 97
 98     /**
 99      * Initializes an empty sprite with nothing init.
100      */
101     virtual bool init(void);
102
103     /**
104      * Initializes a sprite with a texture.
105      *
106      * After initialization, the rect used will be the size of the texture, and the offset will be (0,0).
107      *
108      * @param   pTexture    A pointer to an existing CCTexture2D object.
109      *                      You can use a CCTexture2D object for many sprites.
110      * @return  true if the sprite is initialized properly, false otherwise.
111      */
112     virtual bool initWithTexture(CCTexture2D *pTexture);
113
114     /**
115      * Initializes a sprite with a texture and a rect.
116      *
117      * After initialization, the offset will be (0,0).
118      *
119      * @param   pTexture    A pointer to an exisiting CCTexture2D object.
120      *                      You can use a CCTexture2D object for many sprites.
121      * @param   rect        Only the contents inside rect of this texture will be applied for this sprite.
122      * @return  true if the sprite is initialized properly, false otherwise.
123      */
124     virtual bool initWithTexture(CCTexture2D *pTexture, const CCRect& rect);
125
126     /**
127      * Initializes a sprite with a texture and a rect in points, optionally rotated.
128      *
129      * After initialization, the offset will be (0,0).
130      * @note    This is the designated initializer.
131      *
132      * @param   pTexture    A CCTexture2D object whose texture will be applied to this sprite.
133      * @param   rect        A rectangle assigned the contents of texture.
134      * @param   rotated     Whether or not the texture rectangle is rotated.
135      * @return  true if the sprite is initialized properly, false otherwise.
136      */
137     virtual bool initWithTexture(CCTexture2D *pTexture, const CCRect& rect, bool rotated);
138
139     /**
140      * Initializes a sprite with an SpriteFrame. The texture and rect in SpriteFrame will be applied on this sprite
141      *
142      * @param   pSpriteFrame  A CCSpriteFrame object. It should includes a valid texture and a rect
143      * @return  true if the sprite is initialized properly, false otherwise.
144      */
145     virtual bool initWithSpriteFrame(CCSpriteFrame *pSpriteFrame);
146
147     /**
148      * Initializes a sprite with an sprite frame name.
149      *
150      * A CCSpriteFrame will be fetched from the CCSpriteFrameCache by name.
151      * If the CCSpriteFrame doesn‘t exist it will raise an exception.
152      *
153      * @param   pszSpriteFrameName  A key string that can fected a volid CCSpriteFrame from CCSpriteFrameCache
154      * @return  true if the sprite is initialized properly, false otherwise.
155      */
156     virtual bool initWithSpriteFrameName(const char *pszSpriteFrameName);
157
158     /**
159      * Initializes a sprite with an image filename.
160      *
161      * This method will find pszFilename from local file system, load its content to CCTexture2D,
162      * then use CCTexture2D to create a sprite.
163      * After initialization, the rect used will be the size of the image. The offset will be (0,0).
164      *
165      * @param   pszFilename The path to an image file in local file system
166      * @return  true if the sprite is initialized properly, false otherwise.
167      * @js init
168      */
169     virtual bool initWithFile(const char *pszFilename);
170
171     /**
172      * Initializes a sprite with an image filename, and a rect.
173      *
174      * This method will find pszFilename from local file system, load its content to CCTexture2D,
175      * then use CCTexture2D to create a sprite.
176      * After initialization, the offset will be (0,0).
177      *
178      * @param   pszFilename The path to an image file in local file system.
179      * @param   rect        The rectangle assigned the content area from texture.
180      * @return  true if the sprite is initialized properly, false otherwise.
181      * @js init
182      */
183     virtual bool initWithFile(const char *pszFilename, const CCRect& rect);
184
185     /// @} end of initializers
186
187     /// @{
188     /// @name Functions inherited from CCTextureProtocol
189     virtual void setTexture(CCTexture2D *texture);
190     virtual CCTexture2D* getTexture(void);
191     inline void setBlendFunc(ccBlendFunc blendFunc) { m_sBlendFunc = blendFunc; }
192     /**
193      * @js NA
194      */
195     inline ccBlendFunc getBlendFunc(void) { return m_sBlendFunc; }
196     /// @}
197
198     /// @{
199     /// @name Functions inherited from CCNode
200     virtual void setScaleX(float fScaleX);
201     virtual void setScaleY(float fScaleY);
202     /**
203      * @lua NA
204      */
205     virtual void setPosition(const CCPoint& pos);
206     virtual void setRotation(float fRotation);
207     virtual void setRotationX(float fRotationX);
208     virtual void setRotationY(float fRotationY);
209     virtual void setSkewX(float sx);
210     virtual void setSkewY(float sy);
211     virtual void removeChild(CCNode* pChild, bool bCleanup);
212     virtual void removeAllChildrenWithCleanup(bool bCleanup);
213     virtual void reorderChild(CCNode *pChild, int zOrder);
214     virtual void addChild(CCNode *pChild);
215     virtual void addChild(CCNode *pChild, int zOrder);
216     virtual void addChild(CCNode *pChild, int zOrder, int tag);
217     virtual void sortAllChildren();
218     virtual void setScale(float fScale);
219     virtual void setVertexZ(float fVertexZ);
220     virtual void setAnchorPoint(const CCPoint& anchor);
221     virtual void ignoreAnchorPointForPosition(bool value);
222     virtual void setVisible(bool bVisible);
223     virtual void draw(void);
224     /// @}
225
226     /// @{
227     /// @name Functions inherited from CCNodeRGBA
228     virtual void setColor(const ccColor3B& color3);
229     virtual void updateDisplayedColor(const ccColor3B& parentColor);
230     virtual void setOpacity(GLubyte opacity);
231     virtual void setOpacityModifyRGB(bool modify);
232     virtual bool isOpacityModifyRGB(void);
233     virtual void updateDisplayedOpacity(GLubyte parentOpacity);
234     /// @}
235
236
237     /// @{
238     /// @name BatchNode methods
239
240     /**
241      * Updates the quad according the rotation, position, scale values.
242      */
243     virtual void updateTransform(void);
244
245     /**
246      * Returns the batch node object if this sprite is rendered by CCSpriteBatchNode
247      *
248      * @return The CCSpriteBatchNode object if this sprite is rendered by CCSpriteBatchNode,
249      *         NULL if the sprite isn‘t used batch node.
250      */
251     virtual CCSpriteBatchNode* getBatchNode(void);
252     /**
253      * Sets the batch node to sprite
254      * @warning This method is not recommended for game developers. Sample code for using batch node
255      * @code
256      * CCSpriteBatchNode *batch = CCSpriteBatchNode::create("Images/grossini_dance_atlas.png", 15);
257      * CCSprite *sprite = CCSprite::createWithTexture(batch->getTexture(), CCRectMake(0, 0, 57, 57));
258      * batch->addChild(sprite);
259      * layer->addChild(batch);
260      * @endcode
261      */
262     virtual void setBatchNode(CCSpriteBatchNode *pobSpriteBatchNode);
263
264     /// @} end of BatchNode methods
265
266
267
268     /// @{
269     /// @name Texture methods
270
271     /**
272      * Updates the texture rect of the CCSprite in points.
273      * It will call setTextureRect:rotated:untrimmedSize with rotated = NO, and utrimmedSize = rect.size.
274      */
275     virtual void setTextureRect(const CCRect& rect);
276
277     /**
278      * Sets the texture rect, rectRotated and untrimmed size of the CCSprite in points.
279      * It will update the texture coordinates and the vertex rectangle.
280      */
281     virtual void setTextureRect(const CCRect& rect, bool rotated, const CCSize& untrimmedSize);
282
283     /**
284      * Sets the vertex rect.
285      * It will be called internally by setTextureRect.
286      * Useful if you want to create 2x images from SD images in Retina Display.
287      * Do not call it manually. Use setTextureRect instead.
288      */
289     virtual void setVertexRect(const CCRect& rect);
290
291     /// @} end of texture methods
292
293
294
295     /// @{
296     /// @name Frames methods
297
298     /**
299      * Sets a new display frame to the CCSprite.
300      */
301     virtual void setDisplayFrame(CCSpriteFrame *pNewFrame);
302
303     /**
304      * Returns whether or not a CCSpriteFrame is being displayed
305      */
306     virtual bool isFrameDisplayed(CCSpriteFrame *pFrame);
307
308     /**
309      * Returns the current displayed frame.
310      * @js NA
311      */
312     virtual CCSpriteFrame* displayFrame(void);
313
314     /// @} End of frames methods
315
316
317     /// @{
318     /// @name Animation methods
319     /**
320      * Changes the display frame with animation name and index.
321      * The animation name will be get from the CCAnimationCache
322      */
323     virtual void setDisplayFrameWithAnimationName(const char *animationName, int frameIndex);
324     /// @}
325
326
327     /// @{
328     /// @name Sprite Properties‘ setter/getters
329
330     /**
331      * Whether or not the Sprite needs to be updated in the Atlas.
332      *
333      * @return true if the sprite needs to be updated in the Atlas, false otherwise.
334      */
335     inline virtual bool isDirty(void) { return m_bDirty; }
336
337     /**
338      * Makes the Sprite to be updated in the Atlas.
339      */
340     inline virtual void setDirty(bool bDirty) { m_bDirty = bDirty; }
341
342     /**
343      * Returns the quad (tex coords, vertex coords and color) information.
344      * @js NA
345      */
346     inline ccV3F_C4B_T2F_Quad getQuad(void) { return m_sQuad; }
347
348     /**
349      * Returns whether or not the texture rectangle is rotated.
350      */
351     inline bool isTextureRectRotated(void) { return m_bRectRotated; }
352
353     /**
354      * Returns the index used on the TextureAtlas.
355      */
356     inline unsigned int getAtlasIndex(void) { return m_uAtlasIndex; }
357
358     /**
359      * Sets the index used on the TextureAtlas.
360      * @warning Don‘t modify this value unless you know what you are doing
361      */
362     inline void setAtlasIndex(unsigned int uAtlasIndex) { m_uAtlasIndex = uAtlasIndex; }
363
364     /**
365      * Returns the rect of the CCSprite in points
366      */
367     inline const CCRect& getTextureRect(void) { return m_obRect; }
368
369     /**
370      * Gets the weak reference of the CCTextureAtlas when the sprite is rendered using via CCSpriteBatchNode
371      */
372     inline CCTextureAtlas* getTextureAtlas(void) { return m_pobTextureAtlas; }
373
374     /**
375      * Sets the weak reference of the CCTextureAtlas when the sprite is rendered using via CCSpriteBatchNode
376      */
377     inline void setTextureAtlas(CCTextureAtlas *pobTextureAtlas) { m_pobTextureAtlas = pobTextureAtlas; }
378
379     /**
380      * Gets the offset position of the sprite. Calculated automatically by editors like Zwoptex.
381      */
382     inline const CCPoint& getOffsetPosition(void) { return m_obOffsetPosition; }
383
384
385     /**
386      * Returns the flag which indicates whether the sprite is flipped horizontally or not.
387      *
388      * It only flips the texture of the sprite, and not the texture of the sprite‘s children.
389      * Also, flipping the texture doesn‘t alter the anchorPoint.
390      * If you want to flip the anchorPoint too, and/or to flip the children too use:
391      * sprite->setScaleX(sprite->getScaleX() * -1);
392      *
393      * @return true if the sprite is flipped horizaontally, false otherwise.
394      * @js isFlippedX
395      */
396     bool isFlipX(void);
397     /**
398      * Sets whether the sprite should be flipped horizontally or not.
399      *
400      * @param bFlipX true if the sprite should be flipped horizaontally, false otherwise.
401      */
402     void setFlipX(bool bFlipX);
403
404     /**
405      * Return the flag which indicates whether the sprite is flipped vertically or not.
406      *
407      * It only flips the texture of the sprite, and not the texture of the sprite‘s children.
408      * Also, flipping the texture doesn‘t alter the anchorPoint.
409      * If you want to flip the anchorPoint too, and/or to flip the children too use:
410      * sprite->setScaleY(sprite->getScaleY() * -1);
411      *
412      * @return true if the sprite is flipped vertically, flase otherwise.
413      * @js isFlippedY
414      */
415     bool isFlipY(void);
416     /**
417      * Sets whether the sprite should be flipped vertically or not.
418      *
419      * @param bFlipY true if the sprite should be flipped vertically, flase otherwise.
420      */
421     void setFlipY(bool bFlipY);
422
423     /// @} End of Sprite properties getter/setters
424
425 protected:
426     void updateColor(void);
427     virtual void setTextureCoords(CCRect rect);
428     virtual void updateBlendFunc(void);
429     virtual void setReorderChildDirtyRecursively(void);
430     virtual void setDirtyRecursively(bool bValue);
431
432     //
433     // Data used when the sprite is rendered using a CCSpriteSheet
434     //
435     CCTextureAtlas*     m_pobTextureAtlas;      /// CCSpriteBatchNode texture atlas (weak reference)
436     unsigned int        m_uAtlasIndex;          /// Absolute (real) Index on the SpriteSheet
437     CCSpriteBatchNode*  m_pobBatchNode;         /// Used batch node (weak reference)
438
439     bool                m_bDirty;               /// Whether the sprite needs to be updated
440     bool                m_bRecursiveDirty;      /// Whether all of the sprite‘s children needs to be updated
441     bool                m_bHasChildren;         /// Whether the sprite contains children
442     bool                m_bShouldBeHidden;      /// should not be drawn because one of the ancestors is not visible
443     CCAffineTransform   m_transformToBatch;
444
445     //
446     // Data used when the sprite is self-rendered
447     //
448     ccBlendFunc        m_sBlendFunc;            /// It‘s required for CCTextureProtocol inheritance
449     CCTexture2D*       m_pobTexture;            /// CCTexture2D object that is used to render the sprite
450
451     //
452     // Shared data
453     //
454
455     // texture
456     CCRect m_obRect;                            /// Retangle of CCTexture2D
457     bool   m_bRectRotated;                      /// Whether the texture is rotated
458
459     // Offset Position (used by Zwoptex)
460     CCPoint m_obOffsetPosition;
461     CCPoint m_obUnflippedOffsetPositionFromCenter;
462
463     // vertex coords, texture coords and color info
464     ccV3F_C4B_T2F_Quad m_sQuad;
465
466     // opacity and RGB protocol
467     bool m_bOpacityModifyRGB;
468
469     // image is flipped
470     bool m_bFlipX;                              /// Whether the sprite is flipped horizaontally or not.
471     bool m_bFlipY;                              /// Whether the sprite is flipped vertically or not.
472 };
473
474 CCSprite.h

  CCNode与坐标系

  Cocos2d-x采用了场景、层、精灵的层次结构来组织游戏元素,与此同时,这个层次结构还对应了游戏的渲染层次,因此游戏元素可以组织成树形结构,称作渲染树。Cocos2d-x把渲染树上的每一个游戏元素抽象为一个节点,即CCNode。一切游戏元素都继承自CCNode,因此它们都具有CCNode所提供的特性。

   1 //cocos2d-x-2.2/cocos2dx/base_nodes/CCNode.h
   2
   3 enum {
   4     kCCNodeTagInvalid = -1,
   5 };
   6
   7 enum {
   8     kCCNodeOnEnter,
   9     kCCNodeOnExit,
  10     kCCNodeOnEnterTransitionDidFinish,
  11     kCCNodeOnExitTransitionDidStart,
  12     kCCNodeOnCleanup
  13 };
  14
  15
  16 class CC_DLL CCNode : public CCObject
  17 {
  18 public:
  19     /// @{
  20     /// @name Constructor, Distructor and Initializers
  21
  22     /**
  23      * Default constructor
  24      * @js ctor
  25      */
  26     CCNode(void);
  27
  28     /**
  29      * Default destructor
  30      * @js NA
  31      * @lua NA
  32      */
  33     virtual ~CCNode(void);
  34
  35     /**
  36      *  Initializes the instance of CCNode
  37      *  @return Whether the initialization was successful.
  38      */
  39     virtual bool init();
  40     /**
  41      * Allocates and initializes a node.
  42      * @return A initialized node which is marked as "autorelease".
  43      */
  44     static CCNode * create(void);
  45
  46     /**
  47      * Gets the description string. It makes debugging easier.
  48      * @return A string terminated with ‘\0‘
  49      * @js NA
  50      */
  51     const char* description(void);
  52
  53     /// @} end of initializers
  54
  55
  56
  57     /// @{
  58     /// @name Setters & Getters for Graphic Peroperties
  59
  60     /**
  61      * Sets the Z order which stands for the drawing order, and reorder this node in its parent‘s children array.
  62      *
  63      * The Z order of node is relative to its "brothers": children of the same parent.
  64      * It‘s nothing to do with OpenGL‘s z vertex. This one only affects the draw order of nodes in cocos2d.
  65      * The larger number it is, the later this node will be drawn in each message loop.
  66      * Please refer to setVertexZ(float) for the difference.
  67      *
  68      * @param nZOrder   Z order of this node.
  69      */
  70     virtual void setZOrder(int zOrder);
  71     /**
  72      * Sets the z order which stands for the drawing order
  73      *
  74      * This is an internal method. Don‘t call it outside the framework.
  75      * The difference between setZOrder(int) and _setOrder(int) is:
  76      * - _setZOrder(int) is a pure setter for m_nZOrder memeber variable
  77      * - setZOrder(int) firstly changes m_nZOrder, then recorder this node in its parent‘s chilren array.
  78      */
  79     virtual void _setZOrder(int z);
  80     /**
  81      * Gets the Z order of this node.
  82      *
  83      * @see setZOrder(int)
  84      *
  85      * @return The Z order.
  86      */
  87     virtual int getZOrder();
  88
  89
  90     /**
  91      * Sets the real OpenGL Z vertex.
  92      *
  93      * Differences between openGL Z vertex and cocos2d Z order:
  94      * - OpenGL Z modifies the Z vertex, and not the Z order in the relation between parent-children
  95      * - OpenGL Z might require to set 2D projection
  96      * - cocos2d Z order works OK if all the nodes uses the same openGL Z vertex. eg: vertexZ = 0
  97      *
  98      * @warning Use it at your own risk since it might break the cocos2d parent-children z order
  99      *
 100      * @param fVertexZ  OpenGL Z vertex of this node.
 101      */
 102     virtual void setVertexZ(float vertexZ);
 103     /**
 104      * Gets OpenGL Z vertex of this node.
 105      *
 106      * @see setVertexZ(float)
 107      *
 108      * @return OpenGL Z vertex of this node
 109      */
 110     virtual float getVertexZ();
 111
 112
 113     /**
 114      * Changes the scale factor on X axis of this node
 115      *
 116      * The deafult value is 1.0 if you haven‘t changed it before
 117      *
 118      * @param fScaleX   The scale factor on X axis.
 119      */
 120     virtual void setScaleX(float fScaleX);
 121     /**
 122      * Returns the scale factor on X axis of this node
 123      *
 124      * @see setScaleX(float)
 125      *
 126      * @return The scale factor on X axis.
 127      */
 128     virtual float getScaleX();
 129
 130
 131     /**
 132      * Changes the scale factor on Y axis of this node
 133      *
 134      * The Default value is 1.0 if you haven‘t changed it before.
 135      *
 136      * @param fScaleY   The scale factor on Y axis.
 137      */
 138     virtual void setScaleY(float fScaleY);
 139     /**
 140      * Returns the scale factor on Y axis of this node
 141      *
 142      * @see setScaleY(float)
 143      *
 144      * @return The scale factor on Y axis.
 145      */
 146     virtual float getScaleY();
 147
 148
 149     /**
 150      * Changes both X and Y scale factor of the node.
 151      *
 152      * 1.0 is the default scale factor. It modifies the X and Y scale at the same time.
 153      *
 154      * @param scale     The scale factor for both X and Y axis.
 155      */
 156     virtual void setScale(float scale);
 157     /**
 158      * Gets the scale factor of the node,  when X and Y have the same scale factor.
 159      *
 160      * @warning Assert when m_fScaleX != m_fScaleY.
 161      * @see setScale(float)
 162      *
 163      * @return The scale factor of the node.
 164      */
 165     virtual float getScale();
 166
 167
 168     /**
 169      * Changes both X and Y scale factor of the node.
 170      *
 171      * 1.0 is the default scale factor. It modifies the X and Y scale at the same time.
 172      *
 173      * @param fScaleX     The scale factor on X axis.
 174      * @param fScaleY     The scale factor on Y axis.
 175      */
 176     virtual void setScale(float fScaleX,float fScaleY);
 177
 178
 179     /**
 180      * Changes the position (x,y) of the node in OpenGL coordinates
 181      *
 182      * Usually we use ccp(x,y) to compose CCPoint object.
 183      * The original point (0,0) is at the left-bottom corner of screen.
 184      * For example, this codesnip sets the node in the center of screen.
 185      * @code
 186      * CCSize size = CCDirector::sharedDirector()->getWinSize();
 187      * node->setPosition( ccp(size.width/2, size.height/2) )
 188      * @endcode
 189      *
 190      * @param position  The position (x,y) of the node in OpenGL coordinates
 191      * @js NA
 192      */
 193     virtual void setPosition(const CCPoint &position);
 194     /**
 195      * Gets the position (x,y) of the node in OpenGL coordinates
 196      *
 197      * @see setPosition(const CCPoint&)
 198      *
 199      * @return The position (x,y) of the node in OpenGL coordinates
 200      */
 201     virtual const CCPoint& getPosition();
 202     /**
 203      * Sets position in a more efficient way.
 204      *
 205      * Passing two numbers (x,y) is much efficient than passing CCPoint object.
 206      * This method is binded to lua and javascript.
 207      * Passing a number is 10 times faster than passing a object from lua to c++
 208      *
 209      * @code
 210      * // sample code in lua
 211      * local pos  = node::getPosition()  -- returns CCPoint object from C++
 212      * node:setPosition(x, y)            -- pass x, y coordinate to C++
 213      * @endcode
 214      *
 215      * @param x     X coordinate for position
 216      * @param y     Y coordinate for position
 217      * @js NA
 218      */
 219     virtual void setPosition(float x, float y);
 220     /**
 221      * Gets position in a more efficient way, returns two number instead of a CCPoint object
 222      *
 223      * @see setPosition(float, float)
 224      */
 225     virtual void getPosition(float* x, float* y);
 226     /**
 227      * Gets/Sets x or y coordinate individually for position.
 228      * These methods are used in Lua and Javascript Bindings
 229      */
 230     virtual void  setPositionX(float x);
 231     virtual float getPositionX(void);
 232     virtual void  setPositionY(float y);
 233     virtual float getPositionY(void);
 234
 235
 236     /**
 237      * Changes the X skew angle of the node in degrees.
 238      *
 239      * This angle describes the shear distortion in the X direction.
 240      * Thus, it is the angle between the Y axis and the left edge of the shape
 241      * The default skewX angle is 0. Positive values distort the node in a CW direction.
 242      *
 243      * @param fSkewX The X skew angle of the node in degrees.
 244      */
 245     virtual void setSkewX(float fSkewX);
 246     /**
 247      * Returns the X skew angle of the node in degrees.
 248      *
 249      * @see setSkewX(float)
 250      *
 251      * @return The X skew angle of the node in degrees.
 252      */
 253     virtual float getSkewX();
 254
 255
 256     /**
 257      * Changes the Y skew angle of the node in degrees.
 258      *
 259      * This angle describes the shear distortion in the Y direction.
 260      * Thus, it is the angle between the X axis and the bottom edge of the shape
 261      * The default skewY angle is 0. Positive values distort the node in a CCW direction.
 262      *
 263      * @param fSkewY    The Y skew angle of the node in degrees.
 264      */
 265     virtual void setSkewY(float fSkewY);
 266     /**
 267      * Returns the Y skew angle of the node in degrees.
 268      *
 269      * @see setSkewY(float)
 270      *
 271      * @return The Y skew angle of the node in degrees.
 272      */
 273     virtual float getSkewY();
 274
 275
 276     /**
 277      * Sets the anchor point in percent.
 278      *
 279      * anchorPoint is the point around which all transformations and positioning manipulations take place.
 280      * It‘s like a pin in the node where it is "attached" to its parent.
 281      * The anchorPoint is normalized, like a percentage. (0,0) means the bottom-left corner and (1,1) means the top-right corner.
 282      * But you can use values higher than (1,1) and lower than (0,0) too.
 283      * The default anchorPoint is (0.5,0.5), so it starts in the center of the node.
 284      *
 285      * @param anchorPoint   The anchor point of node.
 286      */
 287     virtual void setAnchorPoint(const CCPoint& anchorPoint);
 288     /**
 289      * Returns the anchor point in percent.
 290      *
 291      * @see setAnchorPoint(const CCPoint&)
 292      *
 293      * @return The anchor point of node.
 294      */
 295     virtual const CCPoint& getAnchorPoint();
 296     /**
 297      * Returns the anchorPoint in absolute pixels.
 298      *
 299      * @warning You can only read it. If you wish to modify it, use anchorPoint instead.
 300      * @see getAnchorPoint()
 301      *
 302      * @return The anchor point in absolute pixels.
 303      */
 304     virtual const CCPoint& getAnchorPointInPoints();
 305
 306
 307     /**
 308      * Sets the untransformed size of the node.
 309      *
 310      * The contentSize remains the same no matter the node is scaled or rotated.
 311      * All nodes has a size. Layer and Scene has the same size of the screen.
 312      *
 313      * @param contentSize   The untransformed size of the node.
 314      */
 315     virtual void setContentSize(const CCSize& contentSize);
 316     /**
 317      * Returns the untransformed size of the node.
 318      *
 319      * @see setContentSize(const CCSize&)
 320      *
 321      * @return The untransformed size of the node.
 322      */
 323     virtual const CCSize& getContentSize() const;
 324
 325
 326     /**
 327      * Sets whether the node is visible
 328      *
 329      * The default value is true, a node is default to visible
 330      *
 331      * @param visible   true if the node is visible, false if the node is hidden.
 332      */
 333     virtual void setVisible(bool visible);
 334     /**
 335      * Determines if the node is visible
 336      *
 337      * @see setVisible(bool)
 338      *
 339      * @return true if the node is visible, false if the node is hidden.
 340      */
 341     virtual bool isVisible();
 342
 343
 344     /**
 345      * Sets the rotation (angle) of the node in degrees.
 346      *
 347      * 0 is the default rotation angle.
 348      * Positive values rotate node clockwise, and negative values for anti-clockwise.
 349      *
 350      * @param fRotation     The roration of the node in degrees.
 351      */
 352     virtual void setRotation(float fRotation);
 353     /**
 354      * Returns the rotation of the node in degrees.
 355      *
 356      * @see setRotation(float)
 357      *
 358      * @return The rotation of the node in degrees.
 359      */
 360     virtual float getRotation();
 361
 362
 363     /**
 364      * Sets the X rotation (angle) of the node in degrees which performs a horizontal rotational skew.
 365      *
 366      * 0 is the default rotation angle.
 367      * Positive values rotate node clockwise, and negative values for anti-clockwise.
 368      *
 369      * @param fRotationX    The X rotation in degrees which performs a horizontal rotational skew.
 370      */
 371     virtual void setRotationX(float fRotaionX);
 372     /**
 373      * Gets the X rotation (angle) of the node in degrees which performs a horizontal rotation skew.
 374      *
 375      * @see setRotationX(float)
 376      *
 377      * @return The X rotation in degrees.
 378      */
 379     virtual float getRotationX();
 380
 381
 382     /**
 383      * Sets the Y rotation (angle) of the node in degrees which performs a vertical rotational skew.
 384      *
 385      * 0 is the default rotation angle.
 386      * Positive values rotate node clockwise, and negative values for anti-clockwise.
 387      *
 388      * @param fRotationY    The Y rotation in degrees.
 389      */
 390     virtual void setRotationY(float fRotationY);
 391     /**
 392      * Gets the Y rotation (angle) of the node in degrees which performs a vertical rotational skew.
 393      *
 394      * @see setRotationY(float)
 395      *
 396      * @return The Y rotation in degrees.
 397      */
 398     virtual float getRotationY();
 399
 400
 401     /**
 402      * Sets the arrival order when this node has a same ZOrder with other children.
 403      *
 404      * A node which called addChild subsequently will take a larger arrival order,
 405      * If two children have the same Z order, the child with larger arrival order will be drawn later.
 406      *
 407      * @warning This method is used internally for zOrder sorting, don‘t change this manually
 408      *
 409      * @param uOrderOfArrival   The arrival order.
 410      */
 411     virtual void setOrderOfArrival(unsigned int uOrderOfArrival);
 412     /**
 413      * Returns the arrival order, indecates which children is added previously.
 414      *
 415      * @see setOrderOfArrival(unsigned int)
 416      *
 417      * @return The arrival order.
 418      */
 419     virtual unsigned int getOrderOfArrival();
 420
 421
 422     /**
 423      * Sets the state of OpenGL server side.
 424      *
 425      * @param glServerState     The state of OpenGL server side.
 426      * @js NA
 427      */
 428     virtual void setGLServerState(ccGLServerState glServerState);
 429     /**
 430      * Returns the state of OpenGL server side.
 431      *
 432      * @return The state of OpenGL server side.
 433      * @js NA
 434      */
 435     virtual ccGLServerState getGLServerState();
 436
 437
 438     /**
 439      * Sets whether the anchor point will be (0,0) when you position this node.
 440      *
 441      * This is an internal method, only used by CCLayer and CCScene. Don‘t call it outside framework.
 442      * The default value is false, while in CCLayer and CCScene are true
 443      *
 444      * @param ignore    true if anchor point will be (0,0) when you position this node
 445      * @todo This method shoud be renamed as setIgnoreAnchorPointForPosition(bool) or something with "set"
 446      */
 447     virtual void ignoreAnchorPointForPosition(bool ignore);
 448     /**
 449      * Gets whether the anchor point will be (0,0) when you position this node.
 450      *
 451      * @see ignoreAnchorPointForPosition(bool)
 452      *
 453      * @return true if the anchor point will be (0,0) when you position this node.
 454      */
 455     virtual bool isIgnoreAnchorPointForPosition();
 456
 457     /// @}  end of Setters & Getters for Graphic Peroperties
 458
 459
 460     /// @{
 461     /// @name Children and Parent
 462
 463     /**
 464      * Adds a child to the container with z-order as 0.
 465      *
 466      * If the child is added to a ‘running‘ node, then ‘onEnter‘ and ‘onEnterTransitionDidFinish‘ will be called immediately.
 467      *
 468      * @param child A child node
 469      */
 470     virtual void addChild(CCNode * child);
 471     /**
 472      * Adds a child to the container with a z-order
 473      *
 474      * If the child is added to a ‘running‘ node, then ‘onEnter‘ and ‘onEnterTransitionDidFinish‘ will be called immediately.
 475      *
 476      * @param child     A child node
 477      * @param zOrder    Z order for drawing priority. Please refer to setZOrder(int)
 478      */
 479     virtual void addChild(CCNode * child, int zOrder);
 480     /**
 481      * Adds a child to the container with z order and tag
 482      *
 483      * If the child is added to a ‘running‘ node, then ‘onEnter‘ and ‘onEnterTransitionDidFinish‘ will be called immediately.
 484      *
 485      * @param child     A child node
 486      * @param zOrder    Z order for drawing priority. Please refer to setZOrder(int)
 487      * @param tag       A interger to identify the node easily. Please refer to setTag(int)
 488      */
 489     virtual void addChild(CCNode* child, int zOrder, int tag);
 490     /**
 491      * Gets a child from the container with its tag
 492      *
 493      * @param tag   An identifier to find the child node.
 494      *
 495      * @return a CCNode object whose tag equals to the input parameter
 496      */
 497     CCNode * getChildByTag(int tag);
 498     /**
 499      * Return an array of children
 500      *
 501      * Composing a "tree" structure is a very important feature of CCNode
 502      * Here‘s a sample code of traversing children array:
 503      * @code
 504      * CCNode* node = NULL;
 505      * CCARRAY_FOREACH(parent->getChildren(), node)
 506      * {
 507      *     node->setPosition(0,0);
 508      * }
 509      * @endcode
 510      * This sample code traverses all children nodes, and set theie position to (0,0)
 511      *
 512      * @return An array of children
 513      */
 514     virtual CCArray* getChildren();
 515
 516     /**
 517      * Get the amount of children.
 518      *
 519      * @return The amount of children.
 520      */
 521     unsigned int getChildrenCount(void) const;
 522
 523     /**
 524      * Sets the parent node
 525      *
 526      * @param parent    A pointer to the parnet node
 527      */
 528     virtual void setParent(CCNode* parent);
 529     /**
 530      * Returns a pointer to the parent node
 531      *
 532      * @see setParent(CCNode*)
 533      *
 534      * @returns A pointer to the parnet node
 535      */
 536     virtual CCNode* getParent();
 537
 538
 539     ////// REMOVES //////
 540
 541     /**
 542      * Removes this node itself from its parent node with a cleanup.
 543      * If the node orphan, then nothing happens.
 544      * @see removeFromParentAndCleanup(bool)
 545      */
 546     virtual void removeFromParent();
 547     /**
 548      * Removes this node itself from its parent node.
 549      * If the node orphan, then nothing happens.
 550      * @param cleanup   true if all actions and callbacks on this node should be removed, false otherwise.
 551      * @js removeFromParent
 552      */
 553     virtual void removeFromParentAndCleanup(bool cleanup);
 554     /**
 555      * Removes a child from the container with a cleanup
 556      *
 557      * @see removeChild(CCNode, bool)
 558      *
 559      * @param child     The child node which will be removed.
 560      */
 561     virtual void removeChild(CCNode* child);
 562     /**
 563      * Removes a child from the container. It will also cleanup all running actions depending on the cleanup parameter.
 564      *
 565      * @param child     The child node which will be removed.
 566      * @param cleanup   true if all running actions and callbacks on the child node will be cleanup, false otherwise.
 567      */
 568     virtual void removeChild(CCNode* child, bool cleanup);
 569     /**
 570      * Removes a child from the container by tag value with a cleanup.
 571      *
 572      * @see removeChildByTag(int, bool)
 573      *
 574      * @param tag       An interger number that identifies a child node
 575      */
 576     virtual void removeChildByTag(int tag);
 577     /**
 578      * Removes a child from the container by tag value. It will also cleanup all running actions depending on the cleanup parameter
 579      *
 580      * @param tag       An interger number that identifies a child node
 581      * @param cleanup   true if all running actions and callbacks on the child node will be cleanup, false otherwise.
 582      */
 583     virtual void removeChildByTag(int tag, bool cleanup);
 584     /**
 585      * Removes all children from the container with a cleanup.
 586      *
 587      * @see removeAllChildrenWithCleanup(bool)
 588      */
 589     virtual void removeAllChildren();
 590     /**
 591      * Removes all children from the container, and do a cleanup to all running actions depending on the cleanup parameter.
 592      *
 593      * @param cleanup   true if all running actions on all children nodes should be cleanup, false oterwise.
 594      * @js removeAllChildren
 595      */
 596     virtual void removeAllChildrenWithCleanup(bool cleanup);
 597
 598     /**
 599      * Reorders a child according to a new z value.
 600      *
 601      * @param child     An already added child node. It MUST be already added.
 602      * @param zOrder    Z order for drawing priority. Please refer to setZOrder(int)
 603      */
 604     virtual void reorderChild(CCNode * child, int zOrder);
 605
 606     /**
 607      * Sorts the children array once before drawing, instead of every time when a child is added or reordered.
 608      * This appraoch can improves the performance massively.
 609      * @note Don‘t call this manually unless a child added needs to be removed in the same frame
 610      */
 611     virtual void sortAllChildren();
 612
 613     /// @} end of Children and Parent
 614
 615
 616
 617     /// @{
 618     /// @name Grid object for effects
 619
 620     /**
 621      * Returns a grid object that is used when applying effects
 622      *
 623      * @return A CCGrid object that is used when applying effects
 624      * @js NA
 625      */
 626     virtual CCGridBase* getGrid();
 627     /**
 628      * Changes a grid object that is used when applying effects
 629      *
 630      * @param A CCGrid object that is used when applying effects
 631      */
 632     virtual void setGrid(CCGridBase *pGrid);
 633
 634     /// @} end of Grid
 635
 636
 637     /// @{
 638     /// @name Tag & User data
 639
 640     /**
 641      * Returns a tag that is used to identify the node easily.
 642      *
 643      * You can set tags to node then identify them easily.
 644      * @code
 645      * #define TAG_PLAYER  1
 646      * #define TAG_MONSTER 2
 647      * #define TAG_BOSS    3
 648      * // set tags
 649      * node1->setTag(TAG_PLAYER);
 650      * node2->setTag(TAG_MONSTER);
 651      * node3->setTag(TAG_BOSS);
 652      * parent->addChild(node1);
 653      * parent->addChild(node2);
 654      * parent->addChild(node3);
 655      * // identify by tags
 656      * CCNode* node = NULL;
 657      * CCARRAY_FOREACH(parent->getChildren(), node)
 658      * {
 659      *     switch(node->getTag())
 660      *     {
 661      *         case TAG_PLAYER:
 662      *             break;
 663      *         case TAG_MONSTER:
 664      *             break;
 665      *         case TAG_BOSS:
 666      *             break;
 667      *     }
 668      * }
 669      * @endcode
 670      *
 671      * @return A interger that identifies the node.
 672      */
 673     virtual int getTag() const;
 674     /**
 675      * Changes the tag that is used to identify the node easily.
 676      *
 677      * Please refer to getTag for the sample code.
 678      *
 679      * @param A interger that indentifies the node.
 680      */
 681     virtual void setTag(int nTag);
 682
 683     /**
 684      * Returns a custom user data pointer
 685      *
 686      * You can set everything in UserData pointer, a data block, a structure or an object.
 687      *
 688      * @return A custom user data pointer
 689      * @js NA
 690      */
 691     virtual void* getUserData();
 692     /**
 693      * Sets a custom user data pointer
 694      *
 695      * You can set everything in UserData pointer, a data block, a structure or an object, etc.
 696      * @warning Don‘t forget to release the memroy manually,
 697      *          especially before you change this data pointer, and before this node is autoreleased.
 698      *
 699      * @return A custom user data pointer
 700      * @js NA
 701      */
 702     virtual void setUserData(void *pUserData);
 703
 704     /**
 705      * Returns a user assigned CCObject
 706      *
 707      * Similar to userData, but instead of holding a void* it holds an object
 708      *
 709      * @return A user assigned CCObject
 710      * @js NA
 711      */
 712     virtual CCObject* getUserObject();
 713     /**
 714      * Returns a user assigned CCObject
 715      *
 716      * Similar to UserData, but instead of holding a void* it holds an object.
 717      * The UserObject will be retained once in this method,
 718      * and the previous UserObject (if existed) will be relese.
 719      * The UserObject will be released in CCNode‘s destructure.
 720      *
 721      * @param A user assigned CCObject
 722      */
 723     virtual void setUserObject(CCObject *pUserObject);
 724
 725     /// @} end of Tag & User Data
 726
 727
 728     /// @{
 729     /// @name Shader Program
 730     /**
 731      * Return the shader program currently used for this node
 732      *
 733      * @return The shader program currelty used for this node
 734      */
 735     virtual CCGLProgram* getShaderProgram();
 736     /**
 737      * Sets the shader program for this node
 738      *
 739      * Since v2.0, each rendering node must set its shader program.
 740      * It should be set in initialize phase.
 741      * @code
 742      * node->setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColor));
 743      * @endcode
 744      *
 745      * @param The shader program which fetchs from CCShaderCache.
 746      */
 747     virtual void setShaderProgram(CCGLProgram *pShaderProgram);
 748     /// @} end of Shader Program
 749
 750
 751     /**
 752      * Returns a camera object that lets you move the node using a gluLookAt
 753      *
 754      * @code
 755      * CCCamera* camera = node->getCamera();
 756      * camera->setEyeXYZ(0, 0, 415/2);
 757      * camera->setCenterXYZ(0, 0, 0);
 758      * @endcode
 759      *
 760      * @return A CCCamera object that lets you move the node using a gluLookAt
 761      */
 762     virtual CCCamera* getCamera();
 763
 764     /**
 765      * Returns whether or not the node accepts event callbacks.
 766      *
 767      * Running means the node accept event callbacks like onEnter(), onExit(), update()
 768      *
 769      * @return Whether or not the node is running.
 770      */
 771     virtual bool isRunning();
 772
 773
 774     /// @{
 775     /// @name Script Bindings for lua
 776
 777     /**
 778      * Registers a script function that will be called in onEnter() & onExit() seires functions.
 779      *
 780      * This handler will be removed automatically after onExit() called.
 781      * @code
 782      * -- lua sample
 783      * local function sceneEventHandler(eventType)
 784      *     if eventType == kCCNodeOnEnter then
 785      *         -- do something
 786      *     elseif evetType == kCCNodeOnExit then
 787      *         -- do something
 788      *     end
 789      * end
 790      * scene::registerScriptHandler(sceneEventHandler)
 791      * @endcode
 792      *
 793      * @warning This method is for internal usage, don‘t call it manually.
 794      * @todo Perhaps we should rename it to get/set/removeScriptHandler acoording to the function name style.
 795      *
 796      * @param handler   A number that indicates a lua function.
 797      */
 798     virtual void registerScriptHandler(int handler);
 799     /**
 800      * Unregisters a script function that will be called in onEnter() & onExit() series functions.
 801      *
 802      * @see registerScriptHandler(int)
 803      */
 804     virtual void unregisterScriptHandler(void);
 805     /**
 806      * Gets script handler for onEnter/onExit event.
 807      * This is an internal method. g
 808      * @see registerScriptHandler(int)
 809      *
 810      * @return A number that indicates a lua function.
 811      */
 812     inline int getScriptHandler() { return m_nScriptHandler; };
 813
 814     /**
 815      * Schedules for lua script.
 816      * @js NA
 817      */
 818     void scheduleUpdateWithPriorityLua(int nHandler, int priority);
 819
 820     /// @}  end Script Bindings
 821
 822
 823     /// @{
 824     /// @name Event Callbacks
 825
 826     /**
 827      * Event callback that is invoked every time when CCNode enters the ‘stage‘.
 828      * If the CCNode enters the ‘stage‘ with a transition, this event is called when the transition starts.
 829      * During onEnter you can‘t access a "sister/brother" node.
 830      * If you override onEnter, you shall call its parent‘s one, e.g., CCNode::onEnter().
 831      * @js NA
 832      * @lua NA
 833      */
 834     virtual void onEnter();
 835
 836     /** Event callback that is invoked when the CCNode enters in the ‘stage‘.
 837      * If the CCNode enters the ‘stage‘ with a transition, this event is called when the transition finishes.
 838      * If you override onEnterTransitionDidFinish, you shall call its parent‘s one, e.g. CCNode::onEnterTransitionDidFinish()
 839      * @js NA
 840      * @lua NA
 841      */
 842     virtual void onEnterTransitionDidFinish();
 843
 844     /**
 845      * Event callback that is invoked every time the CCNode leaves the ‘stage‘.
 846      * If the CCNode leaves the ‘stage‘ with a transition, this event is called when the transition finishes.
 847      * During onExit you can‘t access a sibling node.
 848      * If you override onExit, you shall call its parent‘s one, e.g., CCNode::onExit().
 849      * @js NA
 850      * @lua NA
 851      */
 852     virtual void onExit();
 853
 854     /**
 855      * Event callback that is called every time the CCNode leaves the ‘stage‘.
 856      * If the CCNode leaves the ‘stage‘ with a transition, this callback is called when the transition starts.
 857      * @js NA
 858      * @lua NA
 859      */
 860     virtual void onExitTransitionDidStart();
 861
 862     /// @} end of event callbacks.
 863
 864
 865     /**
 866      * Stops all running actions and schedulers
 867      */
 868     virtual void cleanup(void);
 869
 870     /**
 871      * Override this method to draw your own node.
 872      * The following GL states will be enabled by default:
 873      * - glEnableClientState(GL_VERTEX_ARRAY);
 874      * - glEnableClientState(GL_COLOR_ARRAY);
 875      * - glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 876      * - glEnable(GL_TEXTURE_2D);
 877      * AND YOU SHOULD NOT DISABLE THEM AFTER DRAWING YOUR NODE
 878      * But if you enable any other GL state, you should disable it after drawing your node.
 879      */
 880     virtual void draw(void);
 881
 882     /**
 883      * Visits this node‘s children and draw them recursively.
 884      */
 885     virtual void visit(void);
 886
 887
 888     /**
 889      * Returns a "local" axis aligned bounding box of the node.
 890      * The returned box is relative only to its parent.
 891      *
 892      * @note This method returns a temporaty variable, so it can‘t returns const CCRect&
 893      * @todo Rename to getBoundingBox() in the future versions.
 894      *
 895      * @return A "local" axis aligned boudning box of the node.
 896      * @js getBoundingBox
 897      */
 898     CCRect boundingBox(void);
 899
 900     /// @{
 901     /// @name Actions
 902
 903     /**
 904      * Sets the CCActionManager object that is used by all actions.
 905      *
 906      * @warning If you set a new CCActionManager, then previously created actions will be removed.
 907      *
 908      * @param actionManager     A CCActionManager object that is used by all actions.
 909      */
 910     virtual void setActionManager(CCActionManager* actionManager);
 911     /**
 912      * Gets the CCActionManager object that is used by all actions.
 913      * @see setActionManager(CCActionManager*)
 914      * @return A CCActionManager object.
 915      */
 916     virtual CCActionManager* getActionManager();
 917
 918     /**
 919      * Executes an action, and returns the action that is executed.
 920      *
 921      * This node becomes the action‘s target. Refer to CCAction::getTarget()
 922      * @warning Actions don‘t retain their target.
 923      *
 924      * @return An Action pointer
 925      */
 926     CCAction* runAction(CCAction* action);
 927
 928     /**
 929      * Stops and removes all actions from the running action list .
 930      */
 931     void stopAllActions(void);
 932
 933     /**
 934      * Stops and removes an action from the running action list.
 935      *
 936      * @param An action object to be removed.
 937      */
 938     void stopAction(CCAction* action);
 939
 940     /**
 941      * Removes an action from the running action list by its tag.
 942      *
 943      * @param A tag that indicates the action to be removed.
 944      */
 945     void stopActionByTag(int tag);
 946
 947     /**
 948      * Gets an action from the running action list by its tag.
 949      *
 950      * @see setTag(int), getTag().
 951      *
 952      * @return The action object with the given tag.
 953      */
 954     CCAction* getActionByTag(int tag);
 955
 956     /**
 957      * Returns the numbers of actions that are running plus the ones that are schedule to run (actions in actionsToAdd and actions arrays).
 958      *
 959      * Composable actions are counted as 1 action. Example:
 960      *    If you are running 1 Sequence of 7 actions, it will return 1.
 961      *    If you are running 7 Sequences of 2 actions, it will return 7.
 962      * @todo Rename to getNumberOfRunningActions()
 963      *
 964      * @return The number of actions that are running plus the ones that are schedule to run
 965      */
 966     unsigned int numberOfRunningActions(void);
 967
 968     /// @} end of Actions
 969
 970
 971     /// @{
 972     /// @name Scheduler and Timer
 973
 974     /**
 975      * Sets a CCScheduler object that is used to schedule all "updates" and timers.
 976      *
 977      * @warning If you set a new CCScheduler, then previously created timers/update are going to be removed.
 978      * @param scheduler     A CCShdeduler object that is used to schedule all "update" and timers.
 979      * @js NA
 980      */
 981     virtual void setScheduler(CCScheduler* scheduler);
 982     /**
 983      * Gets a CCSheduler object.
 984      *
 985      * @see setScheduler(CCScheduler*)
 986      * @return A CCScheduler object.
 987      * @js NA
 988      */
 989     virtual CCScheduler* getScheduler();
 990
 991     /**
 992      * Checks whether a selector is scheduled.
 993      *
 994      * @param selector      A function selector
 995      * @return Whether the funcion selector is scheduled.
 996      * @js NA
 997      * @lua NA
 998      */
 999     bool isScheduled(SEL_SCHEDULE selector);
1000
1001     /**
1002      * Schedules the "update" method.
1003      *
1004      * It will use the order number 0. This method will be called every frame.
1005      * Scheduled methods with a lower order value will be called before the ones that have a higher order value.
1006      * Only one "update" method could be scheduled per node.
1007      * @lua NA
1008      */
1009     void scheduleUpdate(void);
1010
1011     /**
1012      * Schedules the "update" method with a custom priority.
1013      *
1014      * This selector will be called every frame.
1015      * Scheduled methods with a lower priority will be called before the ones that have a higher value.
1016      * Only one "update" selector could be scheduled per node (You can‘t have 2 ‘update‘ selectors).
1017      * @lua NA
1018      */
1019     void scheduleUpdateWithPriority(int priority);
1020
1021     /*
1022      * Unschedules the "update" method.
1023      * @see scheduleUpdate();
1024      */
1025     void unscheduleUpdate(void);
1026
1027     /**
1028      * Schedules a custom selector.
1029      *
1030      * If the selector is already scheduled, then the interval parameter will be updated without scheduling it again.
1031      * @code
1032      * // firstly, implement a schedule function
1033      * void MyNode::TickMe(float dt);
1034      * // wrap this function into a selector via schedule_selector marco.
1035      * this->schedule(schedule_selector(MyNode::TickMe), 0, 0, 0);
1036      * @endcode
1037      *
1038      * @param interval  Tick interval in seconds. 0 means tick every frame. If interval = 0, it‘s recommended to use scheduleUpdate() instead.
1039      * @param repeat    The selector will be excuted (repeat + 1) times, you can use kCCRepeatForever for tick infinitely.
1040      * @param delay     The amount of time that the first tick will wait before execution.
1041      * @lua NA
1042      */
1043     void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);
1044
1045     /**
1046      * Schedules a custom selector with an interval time in seconds.
1047      * @see schedule(SEL_SCHEDULE, float, unsigned int, float)
1048      *
1049      * @param selector      A function wrapped as a selector
1050      * @param interval      Callback interval time in seconds. 0 means tick every frame,
1051      * @lua NA
1052      */
1053     void schedule(SEL_SCHEDULE selector, float interval);
1054
1055     /**
1056      * Schedules a selector that runs only once, with a delay of 0 or larger
1057      * @see schedule(SEL_SCHEDULE, float, unsigned int, float)
1058      *
1059      * @param selector      A function wrapped as a selector
1060      * @param delay         The amount of time that the first tick will wait before execution.
1061      * @lua NA
1062      */
1063     void scheduleOnce(SEL_SCHEDULE selector, float delay);
1064
1065     /**
1066      * Schedules a custom selector, the scheduled selector will be ticked every frame
1067      * @see schedule(SEL_SCHEDULE, float, unsigned int, float)
1068      *
1069      * @param selector      A function wrapped as a selector
1070      * @lua NA
1071      */
1072     void schedule(SEL_SCHEDULE selector);
1073
1074     /**
1075      * Unschedules a custom selector.
1076      * @see schedule(SEL_SCHEDULE, float, unsigned int, float)
1077      *
1078      * @param selector      A function wrapped as a selector
1079      * @lua NA
1080      */
1081     void unschedule(SEL_SCHEDULE selector);
1082
1083     /**
1084      * Unschedule all scheduled selectors: custom selectors, and the ‘update‘ selector.
1085      * Actions are not affected by this method.
1086      */
1087     void unscheduleAllSelectors(void);
1088
1089     /**
1090      * Resumes all scheduled selectors and actions.
1091      * This method is called internally by onEnter
1092      * @js NA
1093      * @lua NA
1094      */
1095     void resumeSchedulerAndActions(void);
1096     /**
1097      * Pauses all scheduled selectors and actions.
1098      * This method is called internally by onExit
1099      * @js NA
1100      * @lua NA
1101      */
1102     void pauseSchedulerAndActions(void);
1103
1104     /*
1105      * Update method will be called automatically every frame if "scheduleUpdate" is called, and the node is "live"
1106      */
1107     virtual void update(float delta);
1108
1109     /// @} end of Scheduler and Timer
1110
1111     /// @{
1112     /// @name Transformations
1113
1114     /**
1115      * Performs OpenGL view-matrix transformation based on position, scale, rotation and other attributes.
1116      */
1117     void transform(void);
1118     /**
1119      * Performs OpenGL view-matrix transformation of it‘s ancestors.
1120      * Generally the ancestors are already transformed, but in certain cases (eg: attaching a FBO)
1121      * It‘s necessary to transform the ancestors again.
1122      */
1123     void transformAncestors(void);
1124     /**
1125      * Calls children‘s updateTransform() method recursively.
1126      *
1127      * This method is moved from CCSprite, so it‘s no longer specific to CCSprite.
1128      * As the result, you apply CCSpriteBatchNode‘s optimization on your customed CCNode.
1129      * e.g., batchNode->addChild(myCustomNode), while you can only addChild(sprite) before.
1130      */
1131     virtual void updateTransform(void);
1132
1133     /**
1134      * Returns the matrix that transform the node‘s (local) space coordinates into the parent‘s space coordinates.
1135      * The matrix is in Pixels.
1136      */
1137     virtual CCAffineTransform nodeToParentTransform(void);
1138
1139     /**
1140      * Returns the matrix that transform parent‘s space coordinates to the node‘s (local) space coordinates.
1141      * The matrix is in Pixels.
1142      */
1143     virtual CCAffineTransform parentToNodeTransform(void);
1144
1145     /**
1146      * Returns the world affine transform matrix. The matrix is in Pixels.
1147      */
1148     virtual CCAffineTransform nodeToWorldTransform(void);
1149
1150     /**
1151      * Returns the inverse world affine transform matrix. The matrix is in Pixels.
1152      */
1153     virtual CCAffineTransform worldToNodeTransform(void);
1154
1155     /// @} end of Transformations
1156
1157
1158     /// @{
1159     /// @name Coordinate Converters
1160
1161     /**
1162      * Converts a Point to node (local) space coordinates. The result is in Points.
1163      */
1164     CCPoint convertToNodeSpace(const CCPoint& worldPoint);
1165
1166     /**
1167      * Converts a Point to world space coordinates. The result is in Points.
1168      */
1169     CCPoint convertToWorldSpace(const CCPoint& nodePoint);
1170
1171     /**
1172      * Converts a Point to node (local) space coordinates. The result is in Points.
1173      * treating the returned/received node point as anchor relative.
1174      */
1175     CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint);
1176
1177     /**
1178      * Converts a local Point to world space coordinates.The result is in Points.
1179      * treating the returned/received node point as anchor relative.
1180      */
1181     CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint);
1182
1183     /**
1184      * convenience methods which take a CCTouch instead of CCPoint
1185      */
1186     CCPoint convertTouchToNodeSpace(CCTouch * touch);
1187
1188     /**
1189      * converts a CCTouch (world coordinates) into a local coordinate. This method is AR (Anchor Relative).
1190      */
1191     CCPoint convertTouchToNodeSpaceAR(CCTouch * touch);
1192
1193     /**
1194      *  Sets the additional transform.
1195      *
1196      *  @note The additional transform will be concatenated at the end of nodeToParentTransform.
1197      *        It could be used to simulate `parent-child` relationship between two nodes (e.g. one is in BatchNode, another isn‘t).
1198      *  @code
1199         // create a batchNode
1200         CCSpriteBatchNode* batch= CCSpriteBatchNode::create("Icon-114.png");
1201         this->addChild(batch);
1202
1203         // create two sprites, spriteA will be added to batchNode, they are using different textures.
1204         CCSprite* spriteA = CCSprite::createWithTexture(batch->getTexture());
1205         CCSprite* spriteB = CCSprite::create("Icon-72.png");
1206
1207         batch->addChild(spriteA);
1208
1209         // We can‘t make spriteB as spriteA‘s child since they use different textures. So just add it to layer.
1210         // But we want to simulate `parent-child` relationship for these two node.
1211         this->addChild(spriteB);
1212
1213         //position
1214         spriteA->setPosition(ccp(200, 200));
1215
1216         // Gets the spriteA‘s transform.
1217         CCAffineTransform t = spriteA->nodeToParentTransform();
1218
1219         // Sets the additional transform to spriteB, spriteB‘s postion will based on its pseudo parent i.e. spriteA.
1220         spriteB->setAdditionalTransform(t);
1221
1222         //scale
1223         spriteA->setScale(2);
1224
1225         // Gets the spriteA‘s transform.
1226         t = spriteA->nodeToParentTransform();
1227
1228         // Sets the additional transform to spriteB, spriteB‘s scale will based on its pseudo parent i.e. spriteA.
1229         spriteB->setAdditionalTransform(t);
1230
1231         //rotation
1232         spriteA->setRotation(20);
1233
1234         // Gets the spriteA‘s transform.
1235         t = spriteA->nodeToParentTransform();
1236
1237         // Sets the additional transform to spriteB, spriteB‘s rotation will based on its pseudo parent i.e. spriteA.
1238         spriteB->setAdditionalTransform(t);
1239      *  @endcode
1240      */
1241     void setAdditionalTransform(const CCAffineTransform& additionalTransform);
1242
1243     /// @} end of Coordinate Converters
1244
1245       /// @{
1246     /// @name component functions
1247     /**
1248      *   gets a component by its name
1249      */
1250     CCComponent* getComponent(const char *pName) const;
1251
1252     /**
1253      *   adds a component
1254      */
1255     virtual bool addComponent(CCComponent *pComponent);
1256
1257     /**
1258      *   removes a component by its name
1259      */
1260     virtual bool removeComponent(const char *pName);
1261
1262     /**
1263      *   removes all components
1264      */
1265     virtual void removeAllComponents();
1266     /// @} end of component functions
1267
1268 private:
1269     /// lazy allocs
1270     void childrenAlloc(void);
1271
1272     /// helper that reorder a child
1273     void insertChild(CCNode* child, int z);
1274
1275     /// Removes a child, call child->onExit(), do cleanup, remove it from children array.
1276     void detachChild(CCNode *child, bool doCleanup);
1277
1278     /** Convert cocos2d coordinates to UI windows coordinate.
1279      * @js NA
1280      * @lua NA
1281      */
1282     CCPoint convertToWindowSpace(const CCPoint& nodePoint);
1283
1284 protected:
1285     float m_fRotationX;                 ///< rotation angle on x-axis
1286     float m_fRotationY;                 ///< rotation angle on y-axis
1287
1288     float m_fScaleX;                    ///< scaling factor on x-axis
1289     float m_fScaleY;                    ///< scaling factor on y-axis
1290
1291     float m_fVertexZ;                   ///< OpenGL real Z vertex
1292
1293     CCPoint m_obPosition;               ///< position of the node
1294
1295     float m_fSkewX;                     ///< skew angle on x-axis
1296     float m_fSkewY;                     ///< skew angle on y-axis
1297
1298     CCPoint m_obAnchorPointInPoints;    ///< anchor point in points
1299     CCPoint m_obAnchorPoint;            ///< anchor point normalized (NOT in points)
1300
1301     CCSize m_obContentSize;             ///< untransformed size of the node
1302
1303
1304     CCAffineTransform m_sAdditionalTransform; ///< transform
1305     CCAffineTransform m_sTransform;     ///< transform
1306     CCAffineTransform m_sInverse;       ///< transform
1307
1308     CCCamera *m_pCamera;                ///< a camera
1309
1310     CCGridBase *m_pGrid;                ///< a grid
1311
1312     int m_nZOrder;                      ///< z-order value that affects the draw order
1313
1314     CCArray *m_pChildren;               ///< array of children nodes
1315     CCNode *m_pParent;                  ///< weak reference to parent node
1316
1317     int m_nTag;                         ///< a tag. Can be any number you assigned just to identify this node
1318
1319     void *m_pUserData;                  ///< A user assingned void pointer, Can be point to any cpp object
1320     CCObject *m_pUserObject;            ///< A user assigned CCObject
1321
1322     CCGLProgram *m_pShaderProgram;      ///< OpenGL shader
1323
1324     ccGLServerState m_eGLServerState;   ///< OpenGL servier side state
1325
1326     unsigned int m_uOrderOfArrival;     ///< used to preserve sequence while sorting children with the same zOrder
1327
1328     CCScheduler *m_pScheduler;          ///< scheduler used to schedule timers and updates
1329
1330     CCActionManager *m_pActionManager;  ///< a pointer to ActionManager singleton, which is used to handle all the actions
1331
1332     bool m_bRunning;                    ///< is running
1333
1334     bool m_bTransformDirty;             ///< transform dirty flag
1335     bool m_bInverseDirty;               ///< transform dirty flag
1336     bool m_bAdditionalTransformDirty;   ///< The flag to check whether the additional transform is dirty
1337     bool m_bVisible;                    ///< is this node visible
1338
1339     bool m_bIgnoreAnchorPointForPosition; ///< true if the Anchor Point will be (0,0) when you position the CCNode, false otherwise.
1340                                           ///< Used by CCLayer and CCScene.
1341
1342     bool m_bReorderChildDirty;          ///< children order dirty flag
1343
1344     int m_nScriptHandler;               ///< script handler for onEnter() & onExit(), used in Javascript binding and Lua binding.
1345     int m_nUpdateScriptHandler;         ///< script handler for update() callback per frame, which is invoked from lua & javascript.
1346     ccScriptType m_eScriptType;         ///< type of script binding, lua or javascript
1347
1348     CCComponentContainer *m_pComponentContainer;        ///< Dictionary of components
1349
1350 };
1351
1352 CCNode.h

  在Cocos2d-x中,存在两种坐标系。

  绘图坐标系。它是最常见的坐标系,与OpenGL采用的坐标系相同,以左下角为原点,向右为x轴正方向,向上为y轴正方向。在Cocos2d-x中,一切绘图相关的操作都使用绘图坐标系,如游戏元素中的Position和AnchorPoint等属性。

  纹理坐标系。纹理坐标系以左上角为原点,向右为x轴正方向,向下为y轴正方向,如图3-2所示。在Cocos2d-x中,只有从纹理中截取部分矩形时才使用这个坐标系,如CCSprite的TextureRect属性。

  CCRect ContentSize:获取或设置此节点的内容大小。任何一个节点都需要确定它的内容大小,以便进行图形变换。对于精灵来说,ContentSize是它的纹理显示部分的大小;对于层或场景等全屏的大型节点来说,ContentSize则是屏幕大小。

  CCPoint AnchorPoint与CCPoint Position:AnchorPoint用于设置一个锚点,以便精确地控制节点的位置和变换。AnchorPoint的两个参量x和y的取值通常都是0到1之间的实数,表示锚点相对于节点长宽的位置。例如,把节点左下角作为锚点,值为(0,0);把节点的中心作为锚点,值为(0.5,0.5);把节点右下角作为锚点,值为(1,0)。精灵的AnchorPoint默认值为(0.5,0.5),其他节点的默认值为(0,0)。

  Position用于设置节点的位置。由于Position指的是锚点在父节点中的坐标值,节点显示的位置通常与锚点有关。因此,如果层与场景保持默认的位置,只需把层中精灵位置设为窗口长宽的一半即可让它显示在屏幕中央。

  对于场景或层等大型节点,它们的IgnoreAnchorPointForPosition属性为true,此时引擎会认为AnchorPoint永远为(0,0);而其他节点的该属性为flase,它们的锚点不会被忽略。

  int Tag:获取或设置节点的标号。在Cocos2d-x中,Tag的作用类似于标识符,以便快速地从节点的所有子节点中找出所需节点。Tag可以用于定位子节点,因此添加到同一节点的所有CCNode之中,不能有两个节点的Tag相同,否则就给定位带来了麻烦。与Tag相关的方法有getChildByTag、removeChildByTag等。

  

  定时器事件

  定时器是以一定时间间隔连续引发游戏事件的工具。。Cocos2d-x为我们提供了两种方式实现定时机制--使用update方法以及使用schedule方法。

  第一种定时机制是CCNode的刷新事件update方法,该方法在每帧绘制之前都会被触发一次。由于绘图帧率有限,而每次更新最终会反映到画面上,所以在每帧之间刷新一次已经足够应付大部分游戏逻辑处理的要求了。CCNode默认并没有启用update事件,为了启用定时器,我们需要调用scheduleUpdate方法,并重载update以执行自己的代码。对应地,我们可以使用unscheduleUpdate方法停止定时器。

  另一种定时机制是CCNode提供的schedule方法,可以实现以一定的时间间隔连续调用某个函数。由于引擎的调度机制,这里的时间间隔必须大于两帧的间隔,否则两帧期间的多次调用会被合并成一次调用。

  由于Cocos2d-x的调度是纯粹的串行机制,因此所有函数都运行在同一个线程,不会存在并行程序的种种麻烦。

  CCNode中与定时器相关的方法

方法 描述
isScheduled(SEL_SCHEDULE selector)
返回一个值,表示selector对应的函数是否已被添加为定时器

scheduleUpdate 启用update定时器
scheduleUpdateWithPriority(int priority) 启用update定时器,并设定定时器的优先级
unscheduleUpdate 取消update定时器

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

float delay)


添加一个schedule定时器,其中selector
参数为定时器的事件函数,interval参
数为定时器的时间间隔,repeat参数为定
时事件触发一次后还会再次触发
的次数(默认值为kCCRepeatForever,
表示触发无穷多次),delay为第一次触
发事件前的延时。此处时间都以秒为单位


scheduleOnce(SEL_SCHEDULE selector,

float delay)

添加一个schedule定时器,但定时器只触发一次
unschedule(SEL_SCHEDULE selector) 取消selector所对应函数的定时器
unscheduleAllSelectors 取消此节点所关联的全部定时器
pauseSchedulerAndActions 暂停此节点所关联的全部定时器与动作
resumeSchedulerAndActions 继续执行此节点所关联的定时器与动作
onEnter() 当此节点所在场景即将呈现时,会调用此方法
onEnterTransitionDidFinish()
当此节点所在场景的入场动作结束后,会调用此方法。如果所在场景没有入场动作,则此方法会紧接着onEnter()后被调用

onExit() 当此节点所在场景即将退出时,会调用此方法
onExitTransitionDidStart()
当此节点所在场景的出场动作结束后,会调用此方法。如果所在场景没有出场动作,则此方法会紧接着onExit()后被调用

  

  Cocos2d-x内置的常用层

  为了方便游戏开发者,Cocos2d-x内置了3种特殊的CCLayer。CCLayerColor:一个单纯的实心色块。CCLayerGradient:一个色块,但可以设置两种颜色的渐变效果。CCMenu:十分常用的游戏菜单。

  CCLayerColor拥有以下初始化方法:如果采用指定了宽与高的初始化方法,则创建一个指定大小的色块;如果采用不指定大小的初始化方法,则创建一个屏幕大小的色块。CCLayerColor的创建方法和初始化方法如下所示:

  static CCLayerColor * create(const ccColor4B& color);

  static CCLayerColor * create(const ccColor4B& color, GLfloat width, GLfloat height);
  bool initWithColor(const ccColor4B& color);
  bool initWithColor(const ccColor4B& color, GLfloat width, GLfloat height);
  CCLayerGradient与CCLayerColor类似,但是它在初始化时需要指定两种颜色以及渐变的方向。在初始化方法中,start参数为起始颜色,end参数为结束颜色,而v是方向向量。CCLayerGradient的创建方法和初始化方法如下所示:
  static CCLayerGradient* create(const ccColor4B& start, const ccColor4B& end);
  static CCLayerGradient* create(const ccColor4B& start, const ccColor4B& end, const CCPoint& v);
  bool initWithColor(const ccColor4B& start, const ccColor4B& end);
  bool initWithColor(const ccColor4B& start, const ccColor4B& end, const CCPoint& v);
  在色块创建后,也可以通过下面列举的方法来修改色块大小:
  void changeWidth(GLfloat w);
  void changeHeight(GLfloat h);
  void changeWidthAndHeight(GLfloat w ,GLfloat h);

  

  CCMenu:游戏菜单
  菜单是游戏不可或缺的一部分。在Cocos2d-x中,菜单由两部分组成,分别是菜单项和菜单本身。CCMenuItem表示一个菜单项,每个菜单项都是一个独立的按钮,定义了菜单的视觉表现和响应动作;CCMenu则是菜单,它负责将菜单项组织到一起并添加到场景中,转换屏幕的触摸事件到各个菜单项。
  CCMenuItemImage::create(
    "CloseNormal.png", //普通状态下的图片
    "CloseSelected.png", //按下状态下的图片
    this, //响应对象
    menu_selector(HelloWorld::menuCloseCallback)); //响应函数
  其中响应函数必须满足SEL_MenuHandler形式:返回值为空,带一个CCNode*型的参数。

  

cocod2d-x 之 CCDirector、CCScene、CCSprite,布布扣,bubuko.com

时间: 2024-10-25 17:08:10

cocod2d-x 之 CCDirector、CCScene、CCSprite的相关文章

08--动作系统(二)使用即时动作

前一篇文章大致理解了动作系统的结构,今天先学习一个简单的即时动作如何使用.首先使用配置好的环境创建一个项目DemoActionInstant 命令:python create_project.py -project DemoActionInstant -package demo.game.action -language cpp 然后在projects目录下找到win32工程文件,使用vs2010打开 改造一下项目,留下关闭按钮菜单,让他出发动作. 这里使用CCFlipX . CCFlipY.C

Cocos2d-x学习笔记(四)CCScene分析

原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38730335 前言 之前提到CCScene是场景,是整个游戏的舞台,通过查看源码我们不难发现CCScene也是CCNode的子节点,那么它也拥有我们上一节讲的CCNode的所有非private属性及方法. CCScene的作用十为了联系所有的CCNode节点(包括CCLayer.CCSprite等). 当清楚知道每个场景要显示的内容,那么定义出不同的CCNode,然后

cocos2d-x ios游戏开发初认识(五) CCsprite精灵类

这次写一下精灵创建的几种类型: 一.通过文件创建: 在原有的基础上添加如下代码: //一.通过文件创建精灵 CCSprite *bg =CCSprite::create("map.png"); CCSize winSize  =CCDirector::sharedDirector()->getWinSize(); //得到屏幕的尺寸 bg->setPosition(ccp(winSize.width/2, winSize.height/2)); this->addCh

第四讲:CCSprite精灵类 -- 创建精灵

创建精灵类的6种方法: 1.最常用的方法 //获取屏幕大小 CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSprite *sp1 = CCSprite::create("icon.png"); sp1->setPosition(size.width*0.2, size.height*0.7); this->addChild(sp1); 2. CCSprite *sp2 = CCSprite::c

七、CCScene

CCScene一般情况是游戏里面的根节点,称之为"场景",运行游戏时需要通过CCDirector启动第一个场景.当然,游戏稍微复杂一点的话,可能会包含很多个场景,这就涉及到场景的切换,也是通过CCDirector来完成.CCScene是个抽象的概念,也没有可视化显示的功能,对比CCNode,CCScene基本上没有额外的代码: [java] view plaincopy // CCScene.h #import "CCNode.h" @interface CCSce

四、CCSprite

在介绍CCSprite之前,先要理解游戏开发中的一个核心概念:精灵.精灵也称为游戏对象,它可以用来表示游戏中的任何物体,比如敌人.子弹.甚至是一个背景图片.一段文字.CCSprite可以说是在cocos2d中最常用的一个类,可以称之为"精灵类",它能够以图片的形式将精灵显示到屏幕上. 创建精灵 在谈怎么创建一个精灵之前,先了解下游戏开发中另一个核心概念:纹理.纹理其实就是用来描述物体表面细节的图形,也称为纹理贴图,把纹理按照特定的方式映射到物体表面上的时候能使物体看上去更加真实.我们将

[windows+cocos2dx]CCSprite精灵类

序言 回想cocos2dx,之前在mac+Xcode平台学习了一遍cocos2dx,一年时间不接触cocos了.一直在搞Unity3d.如今还是就之前所学温故温故,但不再用Xcode来写.用经常使用的Windows+VS2012做为开发环境来回想cocos2dx.从CCSprite精灵类開始回想起. CCSprite多种创建方式 创建CCSprite精灵类有好多中方式,好多构造函数,这里列举集中创建形式.包含要显示某个部分和缓存帧,2D贴图创建和普通创建等. if ( !CCLayer::ini

cocos2d-x CCSprite 精灵监听点击事件

参考文章: cocos2d-x 精灵监听点击事件 http://labs.easymobi.cn/?p=5167 实现过程,实现CCTouchDelegate接口,在enter 的时候添加监听,exit 和析构时移除监听,点击时将touch 的坐标转化为相对精灵的坐标,如果是否在精灵的范围内,则响应点击.主要是参考前面两篇文章中的例子,不同的地方在判断区域,个人觉得太复杂.所以稍微修改了下,看起来更容易理解. PianoTile.h class PianoTile : public cocos2

cocos2dx 2.2.3笔记 - CCDirector导演类

导演类创建和操作主窗口,并且管理什么时候创建并执行场景(CCSene).导演类同时还负责 OpenGl的相关创建( 因为目前水平有限,对Opengl不甚理解,学习后补充 ). 导演类是一个单例模式类. 主要成员变量: CCEGLView* m_pobOpenGLView; 所有东西渲染处理的类 CCScene* m_pRunningScene;当前运行的场景 CCScene* m_pNextScene;下一帧要运行的场景 bool m_bSendCleanupToScene;true则发送旧场景