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

时间: 10-11

Cocos2d-X中的CCSprite的相关文章

如何在Cocos2D游戏中实现A*寻路算法(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 该篇博客由iOS课程团队的Johann Fradj发布,他现在是一个全职开发iOS的开发者.他是Hot Apps Factory(其是App Cooker的创造者)的共同创建

Cocos2d中的CCSprite

精灵是游戏中十分重要的组成部分,随处可见,如:游戏背景.NPC.人物.道具等.在cocos2d-x引擎中,只要是用图片展示的,基本上需要使用精灵类. 1. 首先来了解一下跟精灵相关的几个类: (1) CCTexture2D 可以把它看成一个纹理,它是cocos2d-x渲染图形的重要参数,用来贴图,因为cocos2d-x使用opengl es绘制2d图形的,它的尺寸是2的n次方.一般通过以下方式获得: 1 CCTexture2D* cache = CCTextureCache::sharedTex

如何在Cocos2D游戏中实现A*寻路算法(三)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 创建开放和闭合列表 接下来我们将使用2个NSMutableArray来跟踪保存我们的开放和闭合列表. 你可能奇怪为什么不用NSMutableSet代替.好吧,这里有2个原因:

如何在Cocos2D游戏中实现A*寻路算法(五)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 跟随着黄色砖块前进 现在我们已经找到了我们的路径,我们只需要让猫咪跟随它. 我们接下来要做的是记住整个路径,并且使得猫咪根据路径一步一步的移动. 在CatSprite.h中建

如何在Cocos2D游戏中实现A*寻路算法(八)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 就拿上图中左上角的情况举个栗子. 这只猫咪想要从原点(O)到左下角的对角线方块中去.如果在左边或底下(或全部都有)有墙壁并且测试穿过对角线将会切入一个墙角(或2个).所以左下

cocos2d JS 中的数组拼接与排序

1 var arrA = [];//创建三个局部变量的新数组 2 var arrB = []; 3 var arrC = []; 4 var newCards = this.MyMahjong;//创建一个新的局部变量等于一个全局变量的数组:并把里面的内容依次拆开再全部拼接 5 for(var t=0;t<newCards.length;t++){ 6 var char = newCards[t].charAt(0); 7 if(char == "a"){ 8 arrA.push

关于 Android ios cocos2d 中的广播监听

1. 关于广播监听 第一次使用是在Android中,broadcast.主要用在2个activity之间进行传递数据,发出一个广播,对这个广播有兴趣的就去监听它,做出相应的回应即可.主要是传递数据,触发机制比较好,跟全局变量或者单例有点像,但是使用场合有区别,比如2个activity之间传递数据,activity这种有生命周期的弄成全局变量和单例就不合适了. 2.Android的广播 发送广播: Intent intent = new Intent("OUR_BLE_CENTRAL_MANAGE

cocos2D(三)---- 第一cocos2d的程序代码分析

在第一讲中已经新建了第一个cocos2d程序,执行效果例如以下: 在这讲中我们来分析下里面的代码,了解cocos2d的工作原理,看看屏幕上的这个"Hello World"是怎样显示出来的. 这是HelloWorld项目的代码结构: 以下,我们開始分析项目中的这些源文件: 从程序的入口点開始 这么多源文件在这里,到底先看哪个呢?有些人可能会先挑内容少的来看,认为这样就能够轻松解决掉一个源文件了.事实上这是不正确的,这样看起来更加是一头雾水,根本搞不清楚每一个源文件之间的联系.正确的做法应

《黑马程序猿》 cocos2d游戏引擎复习笔记一

/** ----------------------------游戏场景的搭建-------------------------------- 1首先创建一个surfaceview ,它能够在子线程中更新UI(全局的) 2然后在oncreate方法中对这个surfaceview进行实例化 3使用setcontentview方法将这个surfaceview对象给设置到界面上显示出来 4获取一个导演 5告诉导演将画面现到surfaceview上 即让cocos2d和surfaceview对象产生关系