Cocos2d-X中实现批处理精灵

使用普通方法实现批处理精灵

在Sprite.h中添加下面的代码

#ifndef __Sprite_SCENE_H__
#define __Sprite_SCENE_H__

#include "cocos2d.h"
USING_NS_CC;

class Sprite : public CCLayer
{
public:

    //初始化层
    bool init();  

    //创建场景
    static CCScene* scene();

    //响应触摸
    bool Sprite::ccTouchBegan(CCTouch* touch, CCEvent*);

    //用于创建:场景、菜单、层等东西
    CREATE_FUNC(Sprite);
};

#endif // __Sprite_SCENE_H__

在Sprite.cpp中添加下面的代码

#include "Sprite.h"

USING_NS_CC;

//创建场景
CCScene* Sprite::scene()
{
    //创建场景
    CCScene *scene = CCScene::create();

    //创建层
    Sprite *layer = Sprite::create();

    //将层加到场景上
    scene->addChild(layer);

    //返回场景
    return scene;
}

//初始化实例句柄
bool Sprite::init()
{
    //初始化父类CCLayer
    CCLayer::init();

    //得到窗口的尺寸
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    //设置坐标
    CCPoint ptCenter = ccp(winSize.width / 2, winSize.height / 2);

    //创建一个批处理结点容器
    CCSpriteBatchNode* batch = CCSpriteBatchNode::create("CloseNormal.png");

    //将精灵加到层中
    addChild(batch);

    //使用纹理创建精灵
    CCSprite* sprite = CCSprite::createWithTexture(batch->getTexture());

    //将精灵加到容器上
    batch->addChild(sprite);

    //设置精灵的位置
    sprite->setPosition(ptCenter);

    //设置触摸
    setTouchEnabled(true);
    setTouchMode(kCCTouchesOneByOne);

    return true;
}

//响应触摸
bool Sprite::ccTouchBegan(CCTouch* touch, CCEvent*)
{
     //得到窗口的尺寸
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    //循环100次,创建1000个精灵
    for (int i = 0; i < 1000; i++)
	{
        //创建精灵
        CCSprite* sprite = CCSprite::create("CloseNormal.png");

        //将精灵添加到层上
        addChild(sprite);

        //设置精灵的位置
        sprite->setPosition(ccp(CCRANDOM_0_1()*winSize.width, CCRANDOM_0_1()* winSize.height));
	}

	return true;
}

执行结果:

1、打开程序后的效果:启动程序后帧率为58.7

2、单击3次鼠标后的效果:单击三次鼠标后实现了批处理精灵帧率减少

使用纹理实现批处理精灵

在Sprite.h中添加下面的代码

#ifndef __Sprite_SCENE_H__
#define __Sprite_SCENE_H__

#include "cocos2d.h"
USING_NS_CC;

class Sprite : public CCLayer
{
public:

    //初始化层
    bool init();  

    //创建场景
    static CCScene* scene();

    //响应触摸
    bool Sprite::ccTouchBegan(CCTouch* touch, CCEvent*);

    CCSpriteBatchNode* _batch;

    //用于创建:场景、菜单、层等东西
    CREATE_FUNC(Sprite);
};

#endif // __Sprite_SCENE_H__

Sprite.cpp中的代码

#include "Sprite.h"

USING_NS_CC;

//创建场景
CCScene* Sprite::scene()
{
    //创建场景
    CCScene *scene = CCScene::create();

    //创建层
    Sprite *layer = Sprite::create();

    //将层加到场景上
    scene->addChild(layer);

    //返回场景
    return scene;
}

//初始化实例句柄
bool Sprite::init()
{
    //初始化父类CCLayer
    CCLayer::init();

    //得到窗口的尺寸
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    //设置坐标
    CCPoint ptCenter = ccp(winSize.width / 2, winSize.height / 2);

    //批处理精灵
    CCSpriteBatchNode* batch = CCSpriteBatchNode::create("CloseNormal.png");
	addChild(batch);

    _batch = batch;

	CCSprite* sprite = CCSprite::createWithTexture(batch->getTexture());

    batch->addChild(sprite);

	sprite->setPosition(ptCenter);

	setTouchEnabled(true);
	setTouchMode(kCCTouchesOneByOne);

	return true;
}

//响应触摸
bool Sprite::ccTouchBegan(CCTouch* touch, CCEvent*)
{
   CCSize winSize = CCDirector::sharedDirector()->getWinSize();

     for (int i = 0; i < 1000; i++)
	{
		CCSprite* sprite = CCSprite::createWithTexture(_batch->getTexture());

        _batch->addChild(sprite);

        sprite->setPosition(ccp(CCRANDOM_0_1()*winSize.width, CCRANDOM_0_1()* winSize.height));
	}

	return true;
}

执行结果:

1、打开程序后的效果:启动程序后帧率为58.7

2、单击多次后的效果,帧率没有明显变化

说明:CCSpriteBatchNode也是一个容器,但是它只能包容CCSprite对象,而且要求这些精灵来自同一个纹理



时间: 2024-10-14 18:30:59

Cocos2d-X中实现批处理精灵的相关文章

批处理精灵节点

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

【cocos2d-x学习笔记】三种文字类、批处理精灵、C++的四种cast

三种显示文字的类 CCLabelTTF, CCLabelAtlas, CCLabelBMFont CCLabelTTF:使用系统字体每个字符串会生成一个纹理,显示效率比较低下.适合无变化的文字 CCLabelAtlas: 使用NodeAtlas优化渲染,适合经常变化的数字,比如分数,金钱. CCLabelBMFont: 使用CCSpriteBatchNode,很灵活,每个字符都是一个精灵,可以对每一个字符进行操作. CCLabelAtlas *lable = CClabelAtlas::crea

如何在Cocos2D游戏中实现A*寻路算法(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 该篇博客由iOS课程团队的Johann Fradj发布,他现在是一个全职开发iOS的开发者.他是Hot Apps Factory(其是App Cooker的创造者)的共同创建

如何在Cocos2D 1.0 中掩饰一个精灵(六)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并且在init方法上方添加如下方法: - (CCSprite *)maskedSpriteWithSprite:(CCSprite *)textureSprite maskSprite:(CCSprite *)maskSprite { // 1 CCRenderTexture * rt = [CCRe

关于Cocos2d-x中节点和精灵的关系以及初始化

1.每一个对象类都有一个自己public的一个create函数(等价于CREATE_FUNC),和init函数. 2.create函数返回的是自身的类型,init函数是在ceate函数被调用的时候自动调用. 3.如果是场景对象类的话,还要public一个 static cocos2d::Scene* createScene();的函数,返回值是Scene类型 如果我们要呈现一个会动的人 1.定义一个对象类,继承自Node 2.定义一个private的Sprite * sprite属性 3.在in

关于Unity中NGUI图片精灵响应鼠标的方法

我在Unity里做NGUI的时候发现一个问题. 在Unity2D场景当中,一个精灵图片只要加上了Box Collider或者Box Collider2D,就可以相应OnMouseEnter和OnMouseExit事件,而到了NGUI里就不能响应了. 这真是一个大坑 虽然说NGUI提供了按钮组件,但是如果我们想要自己定制一个按钮的话,失效的那两个事件是不可或缺的. 在网上找了很久,我依旧没能找到相关问题的回答,是的,似乎很少有人碰到这个问题(难道是我新手的原因?). 故私再次记录下我的解决方法.

sql server中关于批处理与脚本的简单介绍

1.批处理 批处理指的是包含一条或多条T-SQL语句的语句组,这组语句从应用程序一次性地发送到SQL Server服务器执行.SQL Server服务器将批处理语句编译成一个可执行单元(即执行计划),执行计划中的语名每次执行一次. GO命令表示批处理的结束.如果在T-SQL脚本中没有GO命令,那么它将被作为单个批处理来执行. SQL Server讲批处理中的语句作为一个整体,编译为一个执行计划,因此批处理中的语句是一起提交给服务器的,所以可以节省系统开销. 当脚本中的一些事情必须发生在另一件事情

Unity中的批处理优化与GPU Instancing【转】

我们都希望能够在场景中投入一百万个物体,不幸的是,渲染和管理大量的游戏对象是以牺牲CPU和GPU性能为代价的,因为有太多Draw Call的问题,最后我们必须找到其他的解决方案. 在本文中,我们将讨论两种优化技术,它们可以帮助您减少Unity游戏中的Draw Call数量以提高整体性能:批处理和GPU Instancing. 批处理开发者在日常工作中遇到的最常见的问题之一是性能不足,这是由于CPU和GPU的运行能力不足.一些游戏可以运行在PC上,但是在移动设备上不行.游戏运行时运行是否流畅受Dr

如何在Cocos2D游戏中实现A*寻路算法(三)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 创建开放和闭合列表 接下来我们将使用2个NSMutableArray来跟踪保存我们的开放和闭合列表. 你可能奇怪为什么不用NSMutableSet代替.好吧,这里有2个原因: