游戏中最重要的元素Sprite精灵,关于精灵的创建,精灵的控制等等。

涉及到的类Class:

AnimationFrame 动画帧。

Animation 动画对象;一个用来在精灵对象上表现动画的动画对象。

AnimationCache 动画缓存单例类。 如何你想要保存动画,你需要使用这个缓存。

Sprite 精灵;定义为二维图像。

SpriteBatchNode 与批量节点类似,如果包含子节点会在一次OpenGL调用内绘制完成。

SpriteFrame 一个精灵帧。

SpriteFrameCache 处理精灵帧的载入的单例。 它将精灵帧保存在缓存里。

下面依次说下用法

/************************************************************************/
/*Sprite定义为二维图像
可以通过一个图像或一个图像的矩形裁剪部分创建Sprite
Sprite的默认锚点(anchorPoint)为(0.5, 0.5)。 */
/************************************************************************/
Sprite* SpriteNodeTest::createSpriteByPath()
{
auto sprite = Sprite::create("grossinis_sister2.png");
auto size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
sprite->setPosition(Vec2(size.width/ + origin.x, size.height/ + origin.y));
return sprite;
}
/************************************************************************/
/* 一个精灵帧包括: 纹理:一个被精灵使用的二维纹理
矩形:一个纹理矩形 */
/************************************************************************/
Sprite* SpriteNodeTest::createSpriteBySpriteFrame()
{
auto sFrame = SpriteFrame::create("grossinis_sister2.png",Rect(,,,));
auto sprite = Sprite::createWithSpriteFrame(sFrame);
auto size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
sprite->setPosition(Vec2(size.width/ + origin.x, size.height/ + origin.y));
return sprite;
}
/************************************************************************/
/* 处理精灵帧的载入的单例。 它将精灵帧保存在缓存里。
只需要加载一次文件,在多个地方通过名字或标记就可以直接使用纹理和精灵帧
*/
/************************************************************************/
Sprite* SpriteNodeTest::createSpriteBySpriteFrameCache()
{
auto cache = SpriteFrameCache::getInstance();
cache->addSpriteFramesWithFile("grossini-aliases.plist");
auto sFrame = cache->getSpriteFrameByName("grossini_dance_01.png");
auto sprite = Sprite::createWithSpriteFrame(sFrame);
auto size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
sprite->setPosition(Vec2(size.width/ + origin.x, size.height/ + origin.y));
return sprite;
}
/************************************************************************/
/*
SpriteBatchNode与批量节点类似,如果包含子节点会在一次OpenGL调用内绘制完成
一个SpriteBatchNode可以引用一个且只有一个纹理(一个图像文件或一个纹理集),只有包含该纹理的Sprite可以加入到SpriteBatchNode中。
加入SpriteBatchNode的所有Sprite在一次OpenGL ES调用内绘制完成,而未加入SpriteBatchNode的Sprite每一个都需要单独调用OpenGL ES绘制,
这样效率比较低。这个可以自己去试一下效果做个对比就能看出。
*/
/************************************************************************/
SpriteBatchNode* SpriteNodeTest::createSpriteBySpriteBatchNode()
{
auto size = Director::getInstance()->getVisibleSize();
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("grossini-aliases.plist");
auto sBatch = SpriteBatchNode::create("grossini-aliases.png");
for (int len = ; len < ; len++)
{
auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
sprite->setPosition(Vec2(CCRANDOM_0_1()*size.width,CCRANDOM_0_1()*size.height));
sBatch->addChild(sprite);
}
return sBatch;
}
/************************************************************************/
/* 一个用来在精灵对象上表现动画的动画对象
动画对象包含动画帧对象, 还可能有一个设定这些帧之间延迟的参数.
你可以用动画动作(Animate action)来创建一个动画对象
*/
/************************************************************************/
Sprite* SpriteNodeTest::createSpriteByAnimation()
{
auto size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin(); auto cache = SpriteFrameCache::getInstance();
cache->addSpriteFramesWithFile("grossini-aliases.plist"); auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
sprite->setPosition(Vec2(size.width/ + origin.x, size.height/ + origin.y)); Vector<SpriteFrame*> aFrames();
char sFrameName[]={};
for (int len = ;len < ; len++)
{
sprintf(sFrameName,"dance_%02d",len);
auto sFrame = cache->getSpriteFrameByName(sFrameName);
aFrames.pushBack(sFrame);
}
auto animation = Animation::createWithSpriteFrames(aFrames,0.3f);
sprite->runAction(RepeatForever::create(Animate::create(animation))); return sprite;
}
/************************************************************************/
/* 动画缓存单例类。 如何你想要保存动画,你需要使用这个缓存
*/
/************************************************************************/
Sprite* SpriteNodeTest::createSpriteByAnimationCache()
{
auto size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin(); auto cache = SpriteFrameCache::getInstance();
//缓存animations要用到的资源
cache->addSpriteFramesWithFile("grossini-aliases.plist","grossini-aliases.png"); auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
sprite->setPosition(Vec2(size.width/ + origin.x, size.height/ + origin.y)); auto aCache = AnimationCache::getInstance();
//animations里面包含动画信息和名字,要确保animations包含的资源已经在SpriteFrameCache里面缓存
aCache->addAnimationsWithFile("animations-2.plist");
sprite->runAction(RepeatForever::create(Animate::create(aCache->animationByName("dance_1"))));
return sprite;
}

上面就是基本的用法,当然这很粗浅,更深的用法以及工具类,慢慢研究吧!

这是我写的测试类:

#ifndef __SpriteNodeTest__
#define __SpriteNodeTest__ #include "cocos2d.h"
USING_NS_CC; class SpriteNodeTest : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
CREATE_FUNC(SpriteNodeTest);
virtual bool init();
static Sprite* createSpriteByPath();
static Sprite* createSpriteBySpriteFrame();
static Sprite* createSpriteBySpriteFrameCache();
static SpriteBatchNode* createSpriteBySpriteBatchNode();
static Sprite* createSpriteByAnimation();
static Sprite* createSpriteByAnimationCache();
protected:
bool onTouchBeganFun(Touch* touch,Event* ev);
}; #endif

SpriteNodeTest.h

#include "SpriteNodeTest.h"

std::function<Node*()> demotest[]=
{
SpriteNodeTest::createSpriteByPath,
SpriteNodeTest::createSpriteBySpriteFrame,
SpriteNodeTest::createSpriteBySpriteFrameCache,
SpriteNodeTest::createSpriteBySpriteBatchNode,
SpriteNodeTest::createSpriteByAnimation,
SpriteNodeTest::createSpriteByAnimationCache
}; Scene* SpriteNodeTest::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create(); // 'layer' is an autorelease object
auto layer = SpriteNodeTest::create(); // add layer as a child to scene
scene->addChild(layer); // return the scene
return scene;
} bool SpriteNodeTest::init()
{
auto event = EventListenerTouchOneByOne::create();
event->onTouchBegan = CC_CALLBACK_2(SpriteNodeTest::onTouchBeganFun,this);
this->_eventDispatcher->addEventListenerWithSceneGraphPriority (event,this); createSpriteByPath();
return true;
}
#define MAX_LAYER (sizeof(demotest) / sizeof(demotest[0]))
int index=;
bool SpriteNodeTest::onTouchBeganFun(Touch* touch,Event* ev)
{
index++;
index = index % MAX_LAYER; this->removeAllChildren();
auto sprite = demotest[index]();
this->addChild(sprite);
return true;
} /************************************************************************/
/*Sprite定义为二维图像
可以通过一个图像或一个图像的矩形裁剪部分创建Sprite
Sprite的默认锚点(anchorPoint)为(0.5, 0.5)。 */
/************************************************************************/
Sprite* SpriteNodeTest::createSpriteByPath()
{
auto sprite = Sprite::create("grossinis_sister2.png");
auto size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
sprite->setPosition(Vec2(size.width/ + origin.x, size.height/ + origin.y));
return sprite;
} /************************************************************************/
/* 一个精灵帧包括: 纹理:一个被精灵使用的二维纹理
矩形:一个纹理矩形 */
/************************************************************************/
Sprite* SpriteNodeTest::createSpriteBySpriteFrame()
{
auto sFrame = SpriteFrame::create("grossinis_sister2.png",Rect(,,,));
auto sprite = Sprite::createWithSpriteFrame(sFrame);
auto size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
sprite->setPosition(Vec2(size.width/ + origin.x, size.height/ + origin.y));
return sprite;
}
/************************************************************************/
/* 处理精灵帧的载入的单例。 它将精灵帧保存在缓存里。
只需要加载一次文件,在多个地方通过名字或标记就可以直接使用纹理和精灵帧
*/
/************************************************************************/
Sprite* SpriteNodeTest::createSpriteBySpriteFrameCache()
{
auto cache = SpriteFrameCache::getInstance();
cache->addSpriteFramesWithFile("grossini-aliases.plist");
auto sFrame = cache->getSpriteFrameByName("grossini_dance_01.png");
auto sprite = Sprite::createWithSpriteFrame(sFrame);
auto size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
sprite->setPosition(Vec2(size.width/ + origin.x, size.height/ + origin.y));
return sprite;
}
/************************************************************************/
/*
SpriteBatchNode与批量节点类似,如果包含子节点会在一次OpenGL调用内绘制完成
一个SpriteBatchNode可以引用一个且只有一个纹理(一个图像文件或一个纹理集),只有包含该纹理的Sprite可以加入到SpriteBatchNode中。
加入SpriteBatchNode的所有Sprite在一次OpenGL ES调用内绘制完成,而未加入SpriteBatchNode的Sprite每一个都需要单独调用OpenGL ES绘制,
这样效率比较低。这个可以自己去试一下效果做个对比就能看出。
*/
/************************************************************************/
SpriteBatchNode* SpriteNodeTest::createSpriteBySpriteBatchNode()
{
auto size = Director::getInstance()->getVisibleSize();
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("grossini-aliases.plist");
auto sBatch = SpriteBatchNode::create("grossini-aliases.png");
for (int len = ; len < ; len++)
{
auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
sprite->setPosition(Vec2(CCRANDOM_0_1()*size.width,CCRANDOM_0_1()*size.height));
sBatch->addChild(sprite);
}
return sBatch;
}
/************************************************************************/
/* 一个用来在精灵对象上表现动画的动画对象
动画对象包含动画帧对象, 还可能有一个设定这些帧之间延迟的参数.
你可以用动画动作(Animate action)来创建一个动画对象
*/
/************************************************************************/
Sprite* SpriteNodeTest::createSpriteByAnimation()
{
auto size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin(); auto cache = SpriteFrameCache::getInstance();
cache->addSpriteFramesWithFile("grossini-aliases.plist"); auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
sprite->setPosition(Vec2(size.width/ + origin.x, size.height/ + origin.y)); Vector<SpriteFrame*> aFrames();
char sFrameName[]={};
for (int len = ;len < ; len++)
{
sprintf(sFrameName,"dance_%02d",len);
auto sFrame = cache->getSpriteFrameByName(sFrameName);
aFrames.pushBack(sFrame);
}
auto animation = Animation::createWithSpriteFrames(aFrames,0.3f);
sprite->runAction(RepeatForever::create(Animate::create(animation))); return sprite;
}
/************************************************************************/
/* 动画缓存单例类。 如何你想要保存动画,你需要使用这个缓存
*/
/************************************************************************/
Sprite* SpriteNodeTest::createSpriteByAnimationCache()
{
auto size = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin(); auto cache = SpriteFrameCache::getInstance();
//缓存animations要用到的资源
cache->addSpriteFramesWithFile("grossini-aliases.plist","grossini-aliases.png"); auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
sprite->setPosition(Vec2(size.width/ + origin.x, size.height/ + origin.y)); auto aCache = AnimationCache::getInstance();
//animations里面包含动画信息和名字,要确保animations包含的资源已经在SpriteFrameCache里面缓存
aCache->addAnimationsWithFile("animations-2.plist");
sprite->runAction(RepeatForever::create(Animate::create(aCache->animationByName("dance_1"))));
return sprite;
}

SpriteNodeTest.cpp

Cocos2d-x 3.2 学习笔记(五)Sprite Node的更多相关文章

  1. Node.js学习笔记(五) --- 使用Node.js搭建Web服务器

    1. Node.js 创建的第一个应用 1.引入http模块 var http = require("http"); 2. 创建服务器接下来我们使用 http.createServ ...

  2. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  3. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  4. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  5. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  6. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  8. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  9. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  10. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

随机推荐

  1. android开发学习之Level List篇

    Level List google 说明:A Drawable that manages a number of alternate Drawables, each assigned a maximu ...

  2. 解决Win7下VC6.0插入ActiveX控件对话框为空的问题

    在Win7环境下,编写MFC应用程序,Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中Gallery文件为空,也就无法 ...

  3. 基于AutoCAD的ObjectARX之NET扩展(mcnetarx)-AcdbEntMake

    1.创建一个结果缓冲区. 2.调用AcdbEntMake创建对象. 示例: ' 创建文字实体 Dim rb As ResultBuffer = New ResultBuffer rb.Add(New ...

  4. php CLI 模式下的传参方法

    在CLI模式(命令行界面 Command Line Interface)下,传入参数有如下3种方法: 一. getopt函数(PHP 4 >= 4.3.0, PHP 5) getopt - 从命 ...

  5. 关于最近的CSRF攻击

    摘要 最近公司内部爆出一大波页面没有加token校验,然后各路大神就开始进行CSRF攻击了.CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发消 ...

  6. UML-用例图

    用例图是指由参与者.用例以及它们之间的关系构成的用于描述系统功能的视图.用例图是被称为参与者的外部用户所能观察到的系统功能的模型图,呈现了一些参与者和一些用例,以及它们之间的关系,主要用于对系统.子系 ...

  7. linux 2.6 驱动笔记(二)

    字符设备驱动 linux 2.6的字符驱动由cdev结构体描述,具体参考globalmem例子,代码主要分以下几部分: 1. 定义一个字符类型设备驱动的结构体 struct globalmem_dev ...

  8. 讲讲HashCode的作用

    前言 Object提供给我们了一个Native的方法“public native int hashCode();”,本文讲讲Hash是什么以及HashCode的作用 Hash 先用一张图看下什么是Ha ...

  9. 一个App完成入门篇(五)- 完成新闻页面

    本节教程将介绍如何用DeviceOne简单而高效的完成一个新闻页面. 导入项目 数据模板分离MVVM模型 自定义事件 展示新闻 九宫格展示 将要学习的demo效果图如下所示 1. 导入完整项目 本节示 ...

  10. 05- Shell脚本学习--函数

    函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. 函数定义 Shell 函数的定义格式 ...