首页 > 代码库 > Cocos2d-X中的CCSprite

Cocos2d-X中的CCSprite



 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://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