Cocos2d-X中的CCSprite,Cocos2d-XCCSprite
在cocos2d-x中,精靈CCSprite是整個遊戲開發處理的主要對象,例如天上的飛機、地上的坦克、玩家控制的任務等等都是精靈。甚至天上隨機飄過的一朵白雲、飛過的一隻鳥也都是精靈。實際上,精靈就是一個可以不斷變化的圖片,變化包括位置變化、旋轉、放大、運動等等。
可見,精靈在遊戲中是十分重要的組成部分,隨處可見。在cocos2d-x中,要用到圖片展示的,基本上會使用到精靈類,CCSprite類在cocos2d-x中類結構圖如
為了觀察CCSprite的功能開啟CCSprite.h檔案,CCSprite.h檔案中通過代碼描述了CCSprite的功能和實現方法
#ifndef __SPITE_NODE_CCSPRITE_H__#define __SPITE_NODE_CCSPRITE_H__#include "base_nodes/CCNode.h"#include "CCProtocols.h"#include "textures/CCTextureAtlas.h"#include "ccTypes.h"#include "cocoa/CCDictionary.h"#include <string>#ifdef EMSCRIPTEN#include "base_nodes/CCGLBufferedNode.h"#endif // EMSCRIPTENNS_CC_BEGINclass CCSpriteBatchNode;class CCSpriteFrame;class CCAnimation;class CCRect;class CCPoint;class CCSize;class CCTexture2D;struct transformValues_;#define CCSpriteIndexNotInitialized 0xffffffff /// CCSprite invalid index on the CCSpriteBatchNodeclass CC_DLL CCSprite : public CCNodeRGBA, public CCTextureProtocol#ifdef EMSCRIPTEN, public CCGLBufferedNode#endif // EMSCRIPTEN{public: //建立一個空的精靈 static CCSprite* create(); //通過檔案建立精靈 static CCSprite* create(const char *pszFileName); //通過檔案和矩形建立精靈 static CCSprite* create(const char *pszFileName, const CCRect& rect); //通過紋理建立精靈 static CCSprite* createWithTexture(CCTexture2D *pTexture); //通過紋理和矩形建立精靈 static CCSprite* createWithTexture(CCTexture2D *pTexture, const CCRect& rect); //通過精靈幀建立精靈 static CCSprite* createWithSpriteFrame(CCSpriteFrame *pSpriteFrame); //通過精靈幀和矩形建立精靈 static CCSprite* createWithSpriteFrameName(const char *pszSpriteFrameName); //建構函式 CCSprite(void); //解構函式 virtual ~CCSprite(void); //初始化執行個體 virtual bool init(void); //初始化紋理 virtual bool initWithTexture(CCTexture2D *pTexture); //初始化紋理和矩形 virtual bool initWithTexture(CCTexture2D *pTexture, const CCRect& rect); //初始化紋理、矩形和扭轉 virtual bool initWithTexture(CCTexture2D *pTexture, const CCRect& rect, bool rotated); //初始化精靈幀 virtual bool initWithSpriteFrame(CCSpriteFrame *pSpriteFrame); //初始化精靈幀 virtual bool initWithSpriteFrameName(const char *pszSpriteFrameName); //初始設定檔案 virtual bool initWithFile(const char *pszFilename); //初始設定檔案和矩形 virtual bool initWithFile(const char *pszFilename, const CCRect& rect); //設定紋理 virtual void setTexture(CCTexture2D *texture); //得到紋理 virtual CCTexture2D* getTexture(void); //設定精靈條 inline void setBlendFunc(ccBlendFunc blendFunc) { m_sBlendFunc = blendFunc; } //得到精靈條 inline ccBlendFunc getBlendFunc(void) { return m_sBlendFunc; } //設定精靈的比例 virtual void setScaleX(float fScaleX); virtual void setScaleY(float fScaleY); //設定精靈的座標 virtual void setPosition(const CCPoint& pos); //旋轉精靈,角度為單位,正數是順時針,負數是逆時針 virtual void setRotation(float fRotation); virtual void setRotationX(float fRotationX); virtual void setRotationY(float fRotationY); //精靈扭曲,跟單向量的旋轉差不多,但是不會顛倒 virtual void setSkewX(float sx); virtual void setSkewY(float sy); //銷毀精靈 virtual void removeChild(CCNode* pChild, bool bCleanup); //從父節點中刪除當前子節點 如果Cleanup為true則刪除當前節點的所有動作 virtual void removeAllChildrenWithCleanup(bool bCleanup); //重新設定精靈的zOrder virtual void reorderChild(CCNode *pChild, int zOrder); //添加精靈 virtual void addChild(CCNode *pChild); virtual void addChild(CCNode *pChild, int zOrder); virtual void addChild(CCNode *pChild, int zOrder, int tag); //重新排列所有精靈 virtual void sortAllChildren(); //設定精靈的比例 virtual void setScale(float fScale); //設定VertexZ(VertexZ和Zorder的功能一樣,都表示渲染順序) virtual void setVertexZ(float fVertexZ); //設定描點的座標 virtual void setAnchorPoint(const CCPoint& anchor); //是否忽略描點 virtual void ignoreAnchorPointForPosition(bool value); //設定精靈是否可見 virtual void setVisible(bool bVisible); //繪圖 virtual void draw(void); //設定顏色 virtual void setColor(const ccColor3B& color3); //更新顯示的顏色 virtual void updateDisplayedColor(const ccColor3B& parentColor); //設定透明度 virtual void setOpacity(GLubyte opacity); //修改顏色的透明度 virtual void setOpacityModifyRGB(bool modify); virtual bool isOpacityModifyRGB(void); //更新透明度 virtual void updateDisplayedOpacity(GLubyte parentOpacity); //更新變化 virtual void updateTransform(void); //得到批量結點 virtual CCSpriteBatchNode* getBatchNode(void); //設定批量結點 virtual void setBatchNode(CCSpriteBatchNode *pobSpriteBatchNode); //設定紋理所在的矩形地區 virtual void setTextureRect(const CCRect& rect); //設定紋理所在的矩形地區 virtual void setTextureRect(const CCRect& rect, bool rotated, const CCSize& untrimmedSize); //設定頂點矩形 virtual void setVertexRect(const CCRect& rect); //設定顯示精靈幀 virtual void setDisplayFrame(CCSpriteFrame *pNewFrame); //判斷是否建立了精靈幀 virtual bool isFrameDisplayed(CCSpriteFrame *pFrame); //返回當前顯示的精靈幀 virtual CCSpriteFrame* displayFrame(void); //設定精靈幀的名字和索引 virtual void setDisplayFrameWithAnimationName(const char *animationName, int frameIndex); //返回精靈是否需要更新 inline virtual bool isDirty(void) { return m_bDirty; } //設定精靈是否需要更新 inline virtual void setDirty(bool bDirty) { m_bDirty = bDirty; } //返回特克斯座標、頂點座標和顏色 inline ccV3F_C4B_T2F_Quad getQuad(void) { return m_sQuad; } //是否旋轉紋理所在的矩形 inline bool isTextureRectRotated(void) { return m_bRectRotated; } //得到紋理索引 inline unsigned int getAtlasIndex(void) { return m_uAtlasIndex; } //設定紋理索引 inline void setAtlasIndex(unsigned int uAtlasIndex) { m_uAtlasIndex = uAtlasIndex; } //得到精靈的座標 inline const CCRect& getTextureRect(void) { return m_obRect; } //得到精靈引用 inline CCTextureAtlas* getTextureAtlas(void) { return m_pobTextureAtlas; } //設定精靈引用 inline void setTextureAtlas(CCTextureAtlas *pobTextureAtlas) { m_pobTextureAtlas = pobTextureAtlas; } //得到精靈位移的位置 inline const CCPoint& getOffsetPosition(void) { return m_obOffsetPosition; } //返回精靈是否快速翻轉 bool isFlipX(void); //設定精靈翻轉 void setFlipX(bool bFlipX); //判斷精靈翻轉 bool isFlipY(void); //設定精靈翻轉 void setFlipY(bool bFlipY); protected: void updateColor(void); virtual void setTextureCoords(CCRect rect); virtual void updateBlendFunc(void); virtual void setReorderChildDirtyRecursively(void); virtual void setDirtyRecursively(bool bValue); CCTextureAtlas* m_pobTextureAtlas; /// CCSpriteBatchNode texture atlas (weak reference) unsigned int m_uAtlasIndex; /// Absolute (real) Index on the SpriteSheet CCSpriteBatchNode* m_pobBatchNode; /// Used batch node (weak reference) bool m_bDirty; /// Whether the sprite needs to be updated bool m_bRecursiveDirty; /// Whether all of the sprite's children needs to be updated bool m_bHasChildren; /// Whether the sprite contains children bool m_bShouldBeHidden; /// should not be drawn because one of the ancestors is not visible CCAffineTransform m_transformToBatch; // // Data used when the sprite is self-rendered // ccBlendFunc m_sBlendFunc; /// It's required for CCTextureProtocol inheritance CCTexture2D* m_pobTexture; /// CCTexture2D object that is used to render the sprite // // Shared data // // texture CCRect m_obRect; /// Retangle of CCTexture2D bool m_bRectRotated; /// Whether the texture is rotated // Offset Position (used by Zwoptex) CCPoint m_obOffsetPosition; CCPoint m_obUnflippedOffsetPositionFromCenter; // vertex coords, texture coords and color info ccV3F_C4B_T2F_Quad m_sQuad; bool m_bOpacityModifyRGB;//是否不透明 //精靈翻轉 bool m_bFlipX;//是否沿著x軸翻轉 bool m_bFlipY;//是否沿著y軸翻轉 };NS_CC_END#endif // __SPITE_NODE_CCSPRITE_H__
在使用Sprite之前需要建立Sprite,建立Sprite的方法可以看我的部落格
Cocos2d-X中建立精靈 :http://blog.csdn.net/u010105970/article/details/39617335
建立好精靈後就可以使用精靈了,使用精靈可以參考本人的部落格
玩轉精靈:http://blog.csdn.net/u010105970/article/details/39638009
當需要處理大量精靈時,為了提高編程效率需要用批處理精靈,批處理精靈的方法可以參考本人的部落格
Cocos2d-X中實現批處理精靈:http://blog.csdn.net/u010105970/article/details/39899399
cocos2d-x怎最佳化CCSprite的繪製
你先用TexturePacker產生pvr圖,然後用CCSpriteBatchNode載入pvr,把CCSpriteBatchNode添加到Layer中,然後添加CCSprite的時候,建立好CCSprite後,把CCSprite中添加到CCSpriteBatchNode中,讓CCSpriteNode自己去最佳化CCSprite。
不知道這個回答你時候滿意。
cocos2d-x中 CCSprite怎沒有create函數?還有很多CCArray也沒有create? 為何?
cocos2d-x 版本不同所以構造方法名稱不同; 你使用的版本和你查看的資料不是一個版本;
如果沒有 CCSprite::Create... 你可以試試有沒有 CCSprite::SpriteWith... ,
其他的也一樣比如: CCArray::ArrayWith...