在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 // EMSCRIPTEN NS_CC_BEGIN class CCSpriteBatchNode; class CCSpriteFrame; class CCAnimation; class CCRect; class CCPoint; class CCSize; class CCTexture2D; struct transformValues_; #define CCSpriteIndexNotInitialized 0xffffffff /// CCSprite invalid index on the CCSpriteBatchNode class 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://www.jb51.cc/article/p-cnhmsqly-za.html
创建好精灵后就可以使用精灵了,使用精灵可以参考本人的博客
玩转精灵:http://www.jb51.cc/article/p-rprxingx-za.html
当需要处理大量精灵时,为了提高编程效率需要用批处理精灵,批处理精灵的方法可以参考本人的博客
Cocos2d-X中实现批处理精灵:http://www.jb51.cc/article/p-psdqxryh-za.html
原文链接:https://www.f2er.com/cocos2dx/347016.html