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 ...
随机推荐
- word-wrap&&word-break,奇偶行、列设置样式
1.word-wrap和word-break区分. 来源场景:机械租赁mvc驾驶员信息查看: 当备注的文字多的时候,第一列的值成这模样: 解决方案:设置table 的td可自动换行.首先table设置 ...
- oracle常用语句总结
一.用户管理类 1.创建用户: Create user username Identified by password Default tablespace tablespacename Tempor ...
- JAVA 正则表达式4种常用的功能
下面简单的说下它的4种常用功能: 查询: 以下是代码片段: String str="abc efg ABC"; String regEx="a|f" ...
- LiveCD DSET日志收集
DELL的LiveCD是一张PE光盘,最新版本7.1是基于CentOS 6.2系统的. 工具下载地址: http://downloads.dell.com/FOLDER01960516M/1/SL ...
- C++混合编程之idlcpp教程Python篇(5)
上一篇在这 C++混合编程之idlcpp教程Python篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial3中,同样加入了三个文件:Py ...
- 设计模式之美:Behavioral Patterns(行为型模式)
行为型模式涉及到算法和对象间职责的分配. 行为模式不仅描述对象或类的模式,还描述它们之间的通信模式. 这些模式刻划了在运行时难以跟踪的复杂的控制流.它们将你的注意力从控制流转移到对象间的联系方式上来. ...
- JavaScript函数编程-Ramdajs
在JavaScript语言世界,函数是第一等公民.JavaScript函数是继承自Function的对象,函数能作另一个函数的参数或者返回值使用,这便形成了我们常说的高阶函数(或称函数对象).这就构成 ...
- 那些VisualStudio隐藏的调试功能
VisualStudio是一个强大的调试工具,里面很多隐藏功能少有人问津,但是在特定场景可以节省你很多时间,本文主要介绍一些VisualStudio调试相关的隐藏功能,欢迎大家补充. 运行到指针(Ru ...
- 走进AngularJs(四)自定义指令----(中)
上一篇简单介绍了自定义一个指令的几个简单参数,restrict.template.templateUrl.replace.transclude,这几个理解起来相对容易很多,因为它们只涉及到了表现,而没 ...
- 用python语言讲解数据结构与算法
写在前面的话:关于数据结构与算法讲解的书籍很多,但是用python语言去实现的不是很多,最近有幸看到一本这样的书籍,由Brad Miller and David Ranum编写的<Problem ...