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 ...
随机推荐
- [XAF] How to hide individual navigation items and groups for certain users
https://www.devexpress.com/Support/Center/Example/Details/E380
- js jq 获取网页元素宽度
Javascript: IE中:document.body.clientWidth ==> BODY对象宽度document.body.clientHeight ==> BODY对象高度d ...
- springMVC静态文件访问
web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xs ...
- Atom.io设置ctrl+delete
一般常见的text editor,在文本前面的空白处按下ctrl+delete,只是删除空白符到单词前面停下,但是Atom.io的默认设置,把空白符后遇到的第一个单词也删掉了.改配置方法是在keyma ...
- Android Meun 用法
Android Meun 用法 点击菜单实体键弹出菜单:如下图 main_activity.xml <?xml version="1.0" encoding="ut ...
- 如何安装Docker UCP
parallels@ubuntu:~/Downloads/Docker$ ls DTR UCP parallels@ubuntu:~/Downloads/Docker$ sudo openssl re ...
- sphinx教程
http://www.php100.com/html/it/focus/2013/0916/6188.html### 以上一篇的email数据表为例: 数据结构: 01.CREATE TABLE em ...
- [渣译文] SignalR 2.0 系列:SignalR的服务器广播
英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with ASP.NET SignalR 2.0系列的翻译,这里是第八篇:SignalR的服务器广 ...
- 人人都是 DBA(XI)I/O 信息收集脚本汇编
什么?有个 SQL 执行了 8 秒! 哪里出了问题?臣妾不知道啊,得找 DBA 啊. DBA 人呢?离职了!!擦!!! 程序员在无处寻求帮助时,就得想办法自救,努力让自己变成 "伪 DBA& ...
- jenkins + Git 搭建持续集成环境
持续集成通过自动化构建.自动化测试以及自动化部署加上较高的集成频率保证了开发系统中的问题能迅速被发现和修复,降低了集成失败的风险,使得系统在开发中始终保持在一个稳定健康的集成状态.jenkins是目前 ...