游戏中最重要的元素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. Cannot refer to an instance field pageTitle while explicitly invoking a cons

    当下面这样时在第7行会提示:Cannot refer to an instance field pageTitle while explicitly invoking a cons public cl ...

  2. mysql命令化操作实用小技巧

    ★1.问:如果我的mysql数据库服务器程序在D:\program files\phpstudy\mysql,里,那么我该怎么在cmd命令状态下使用它?      进入cmd状态后,系统默认在当前用户 ...

  3. ZabbixCPU温度监视-Centos

    ZabbixCPU温度监视 1, lm_sensors安装 #yum install lm_sensors … #sensors-detect 出来的选项全部选yes 重启服务器 2, lm_sens ...

  4. input只读属性区别

    readonly disabled 相同点:都是禁止输入 不同点:readonly属性会把该input提交到form表单 disabled属性不会把该input提交到form表单

  5. ORACLE 自定义分页存储过程

    一.创建包 CREATE OR REPLACE PACKAGE PKG_JK_LAB_BASIC IS TYPE CURSOR_TYPE IS REF CURSOR; PROCEDURE SP_GET ...

  6. 使用ASP.NET Web API 2创建OData v4 终结点

    开放数据协议(Open Data Protocol[简称OData])是用于Web的数据访问协议.OData提供了一种对数据集进行CRUD操作(Create,Read,Update,Delete)的统 ...

  7. 压力测试工具ab使用

    ab全名是apache bench,是apache自带的一款压力测试工具.它通过创建多个线程来模拟并发,测试目标是基于URL的,因此不论是什么web服务器都可以支持. 使用ab非常简单,进入apach ...

  8. Javascript:是你的高阶函数

    在通常的编程语言中,函数的参数只能是基本类型或者对象引用,返回值也只是基本数据类型或对象引用.但在Javascript中函数作为一等公民,既可以当做参数传递,也可以被当做返回值返回.所谓高阶函数就是可 ...

  9. VS开发中的代码编写小技巧——避免重复代码编写的几种方法

    上一篇文章中程序员的幸福生活--有你的日子,每天都是情人节,收到了大家的很多好评.鼓励和祝福,非常感动,真诚的谢谢大家.也希望每个朋友都能保持一个积极向上的心态,去迎接丰富多彩的人生. 在开发过程中, ...

  10. 浅谈Excel开发:八 Excel 项目的安装部署

    前面几篇文章讲解了Excel开发的几个比较主要的也是比较重要的方面,比如菜单系统,Excel对象模型,自定义函数,RTD函数,异步自定义函数,用户自定义任务面板等,在实际开发中我们还会遇到各种“千奇百 ...