Cocos2d-x 3.2 学习笔记(五)Sprite Node
游戏中最重要的元素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的更多相关文章
- Node.js学习笔记(五) --- 使用Node.js搭建Web服务器
1. Node.js 创建的第一个应用 1.引入http模块 var http = require("http"); 2. 创建服务器接下来我们使用 http.createServ ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍
python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...
- Go语言学习笔记五: 条件语句
Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...
随机推荐
- 百度地图API多个点聚合时,标注添加的标签label地图刷新就丢失的问题解决
当将自定义的Marker(含有Label)通过MarkerClusterer 管理的时候,当地图发生任何移动.缩放 的时候,Marker 的Label 就会自动消失. 这个问题主要是由于百度的点聚合A ...
- 练习ajax的时候出现这个问题 还没解决
VM601:1 Uncaught SyntaxError: Unexpected end of JSON input 应该怎么办呢
- 道路翻新 (Revamping Trails, USACO 2009 Feb)
题意:给定m<=50000的1-n有联通的图,求最多可以使K<=20条边变为0的情况下的最短路是多少.. 思路:简单的分层图最短路,对于每个点拆成K个点.. 然后求一边最短路.. code ...
- 《利用Python进行数据分析》第8章学习笔记
绘图和可视化 matplotlib入门 创建窗口和画布 fig = plt.figure() ax1 = fig.add_subplot(2,2,1) ax2 = fig.add_subplot(2, ...
- SSIS oracle 64位 数据源链接
新建数据源 提供程序选择:本机OLE DB ORACLE Provider For OLE DB 服务器名或文件名中选择Oracle Net Manager中配置好的服务名即可 填写账号,密码,测试, ...
- codeblocks配置GLUT
codeblocks配置OPENGL GLUT 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据G ...
- Linux Ubuntu上手动安装.NET Core SDK
今天重装了一台Linux服务器的Ubuntu 14.04系统,需要重新安装.NET Core 1.0. 按照官网上的文档用apt-get命令进行安装: sudo sh -c 'echo "d ...
- Java IO7:管道流、对象流
前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...
- C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)
上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yunfeifei/p/392 ...
- 用“MEAN”技术栈开发web应用(一)AngularJs前端架构
前言 不知何时突然冒出“MEAN技术栈”这个新词,听起来很牛逼的样子,其实就是我们已经熟悉了的近两年在前端比较流行的技术,mongodb.express.angularjs.nodejs,由于这几项技 ...