Cocos2d-X 安卓中禁止锁屏,音量调节,TexturePacker文件在函数中的具体使用
2013-06-17 16:23
393 查看
做游戏过程中会有一些比较有价值的方法或要点,在此记下,为了方便自己日后查看,也为了给大家一个提醒!
1、有时候临时加载一个帧较多的动画可能会有点卡,但更重要的是可能会影响到其它的功能,我曾经遇到这样的问题:在点击菜单按钮时播放一个动画,结果这个动画帧数较多,播放的时候有些卡,接着可能出现点击了2次按钮动画才播放,同时这个按钮对应的方法也执行了两次,这就出现了大问题。出现这种情况时,我只找到了一个简单的方法,就是在init方法中预加载。因为图片资源加载到内存后,第二次播放就不会那么卡了。
2、安卓下的两个应用:关于调节声音和禁止锁屏
3、TexturePacker合成文件的使用步骤
使用TexturePacker的好处:
首先:帮助节省内存。OpenGL ES纹理要求宽和高都是2的n次幂的倍数。我们可以考虑将小的图片拼大图片,然后统一加载。
其次:提高渲染速度。OpenGL ES要求切换的纹理越少越好,将图片拼成大图片,减少了纹理的切换。
_1、在.h中初始化一个全局变量
CCSpriteFrameCache *cacheNpc;//怪物图
_2、在init函数或构造中初始化
cacheNpc = CCSpriteFrameCache::sharedSpriteFrameCache();
cacheNpc->addSpriteFramesWithFile("enemy.plist");
(这么写不对:cacheNpc = CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("enemy.plist");)
_3、使用合成图片资源
CCSprite *sp= CCSprite::createWithSpriteFrame(cacheNpc->spriteFrameByName("enemy1ying.png"));
_4、合成图片集可以在别的类中使用(比如说你要在GameMap类中使用GameLayer类中曾使用过的图片集中的某个图片)
我们在GameLayer类中按照以上前3个步骤完成了图片集的初始化:
(1)在GameLayer.h中添加:
//初始化一个变量名称cacheNpc
CCSpriteFrameCache *cacheNpc;//怪物图
static GameLayer* shareGameLayer();
写成一个静态方法是为了别的类中调用方便
(2)在GameLayer.cpp中实现一些方法:
static GameLayer * gl;
//获取当前静态实例
GameLayer* GameLayer::shareGameLayer()
{
if (gl !=NULL)
{
return gl;
}
return NULL;
}
别忘了在init()中添加:
cacheNpc = CCSpriteFrameCache::sharedSpriteFrameCache();
cacheNpc->addSpriteFramesWithFile("enemy.plist");
gl = this;
(3)我们要在GameMap类中使用,GameLayer图片集中的某个图片:
首先要添加:#include “GameLayer.h”
其次:CCSprite *sp=CCSprite::createWithSpriteFrame(GameLayer::shareGameLayer()->cacheNpc->spriteFrameByName("npc_1.png"));
综合(1)、(2)、(3)我们就完成了目的,当然如果在GameMap中重新按_1、_2、_3中的步骤写一遍的话也能达到目的!
_5、关于_4中说的问题补充个例子,也补充些其他内容,也注意几个问题
首先,TexturePacker好像不能把png和jpg打包到一个spritesheet上,不是说不能打包,是打包了不能用,也就是说可能其他格式的图片混合打包到一个spritesheet上,可能也不能用(现在还不知道为什么不能用)。
其次,关于图片的优化。
由于UI中用到了几个背景(图片是jpg格式的),用TexturePacker合成后竟然是1.23M(如图 2),有点大,
我们可以用PS优化下,以下是步骤。
第一步:用PS打开图片,操作:文件——>存储为web所用格式,然后出现配置界面,选中优化(如图 3所示),然后就是一些配置数据如图 4所示,设置完成后点击存储保存即可。我们看下优化后的spritesheet的大小,如图 5
以下是我在实际用的时候的例子,供大家参考:
在Go.h文件中初始化一个变量:
则在GameStart.cpp中使用时,记得添加引用
BackGroundJpg.h文件中代码:
1、有时候临时加载一个帧较多的动画可能会有点卡,但更重要的是可能会影响到其它的功能,我曾经遇到这样的问题:在点击菜单按钮时播放一个动画,结果这个动画帧数较多,播放的时候有些卡,接着可能出现点击了2次按钮动画才播放,同时这个按钮对应的方法也执行了两次,这就出现了大问题。出现这种情况时,我只找到了一个简单的方法,就是在init方法中预加载。因为图片资源加载到内存后,第二次播放就不会那么卡了。
2、安卓下的两个应用:关于调节声音和禁止锁屏
//禁止屏幕锁屏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); //声音设置 setVolumeControlStream(AudioManager.STREAM_MUSIC);
3、TexturePacker合成文件的使用步骤
使用TexturePacker的好处:
首先:帮助节省内存。OpenGL ES纹理要求宽和高都是2的n次幂的倍数。我们可以考虑将小的图片拼大图片,然后统一加载。
其次:提高渲染速度。OpenGL ES要求切换的纹理越少越好,将图片拼成大图片,减少了纹理的切换。
_1、在.h中初始化一个全局变量
CCSpriteFrameCache *cacheNpc;//怪物图
_2、在init函数或构造中初始化
cacheNpc = CCSpriteFrameCache::sharedSpriteFrameCache();
cacheNpc->addSpriteFramesWithFile("enemy.plist");
(这么写不对:cacheNpc = CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("enemy.plist");)
_3、使用合成图片资源
CCSprite *sp= CCSprite::createWithSpriteFrame(cacheNpc->spriteFrameByName("enemy1ying.png"));
_4、合成图片集可以在别的类中使用(比如说你要在GameMap类中使用GameLayer类中曾使用过的图片集中的某个图片)
我们在GameLayer类中按照以上前3个步骤完成了图片集的初始化:
(1)在GameLayer.h中添加:
//初始化一个变量名称cacheNpc
CCSpriteFrameCache *cacheNpc;//怪物图
static GameLayer* shareGameLayer();
写成一个静态方法是为了别的类中调用方便
(2)在GameLayer.cpp中实现一些方法:
static GameLayer * gl;
//获取当前静态实例
GameLayer* GameLayer::shareGameLayer()
{
if (gl !=NULL)
{
return gl;
}
return NULL;
}
别忘了在init()中添加:
cacheNpc = CCSpriteFrameCache::sharedSpriteFrameCache();
cacheNpc->addSpriteFramesWithFile("enemy.plist");
gl = this;
(3)我们要在GameMap类中使用,GameLayer图片集中的某个图片:
首先要添加:#include “GameLayer.h”
其次:CCSprite *sp=CCSprite::createWithSpriteFrame(GameLayer::shareGameLayer()->cacheNpc->spriteFrameByName("npc_1.png"));
综合(1)、(2)、(3)我们就完成了目的,当然如果在GameMap中重新按_1、_2、_3中的步骤写一遍的话也能达到目的!
_5、关于_4中说的问题补充个例子,也补充些其他内容,也注意几个问题
首先,TexturePacker好像不能把png和jpg打包到一个spritesheet上,不是说不能打包,是打包了不能用,也就是说可能其他格式的图片混合打包到一个spritesheet上,可能也不能用(现在还不知道为什么不能用)。
其次,关于图片的优化。
由于UI中用到了几个背景(图片是jpg格式的),用TexturePacker合成后竟然是1.23M(如图 2),有点大,
我们可以用PS优化下,以下是步骤。
第一步:用PS打开图片,操作:文件——>存储为web所用格式,然后出现配置界面,选中优化(如图 3所示),然后就是一些配置数据如图 4所示,设置完成后点击存储保存即可。我们看下优化后的spritesheet的大小,如图 5
以下是我在实际用的时候的例子,供大家参考:
在Go.h文件中初始化一个变量:
CCSpriteFrameCache *spriteFrame_go;在Go.cpp文件的init()方法中,完成初始化:
spriteFrame_go=CCSpriteFrameCache::sharedSpriteFrameCache(); spriteFrame_go->addSpriteFramesWithFile("go.plist"); gl=this;
则在GameStart.cpp中使用时,记得添加引用
#include "Go.h"代码如下:
//添加金币图片 CCSprite *gold=CCSprite::createWithSpriteFrame(Go::sharedGo()->spriteFrame_go->spriteFrameByName("gold.png")); gold->setPosition(ccp(190,455)); this->addChild(gold);上面的代码部分只是参考,也可以创建一个单独的类,来实现该动能:
BackGroundJpg.h文件中代码:
#pragma once #include "cocos2d.h" using namespace cocos2d; class BackGroundJpg: public cocos2d::CCLayer { public: //变量 //背景图片参数 CCSpriteFrameCache *backGroundJpg; //函数 static BackGroundJpg *sharedBackGroundJpg(); BackGroundJpg(void); ~BackGroundJpg(void); };BackGroundJpg.cpp文件中代码:
#include "BackGroundJpg.h" static BackGroundJpg*gl; BackGroundJpg::BackGroundJpg(void) { backGroundJpg=CCSpriteFrameCache::sharedSpriteFrameCache(); backGroundJpg->addSpriteFramesWithFile("background.plist"); gl=this; } BackGroundJpg *BackGroundJpg::sharedBackGroundJpg() { BackGroundJpg *bg=new BackGroundJpg();//只有new时,才会执行构造函数,完成初始化 if (gl!=NULL) { return gl; } return NULL; }在别的类中使用时先添加引用:
#include "BackGroundJpg.h"
shouye = CCSprite::createWithSpriteFrame(BackGroundJpg::sharedBackGroundJpg()->backGroundJpg->spriteFrameByName("shouye.jpg")); shouye->setPosition(ccp(400,240)); this->addChild(shouye);
相关文章推荐
- cocos2d-x之texturepacker的使用
- cocos2d-x for wp之TexturePackerGUI工具使用
- Cocos2d-x TexturePacker的使用
- Cocos2d-x TexturePacker的使用
- TexturePacker打包成的 plist文件的使用
- 将Texture Packer制作的.pvr.ccz和.plist文件还原为多个原图 -- 使用说明文档
- cocos2d-x之TexturePacker使用
- 1.在cocos2d里面如何使用texture-packer和像素格式来优化spritesheet.html
- 安卓使用http下载文件
- 关于 Delphi 中流的使用(9) 分割与合并文件的函数
- WinRAR文件分卷压缩具体使用方法图文教程
- 使用文件函数操作Memcache
- 【COCOS2DX-LUA 脚本开发之六】利用Lua强转函数解决使用CCNode报错或无法正常使用以及简单介绍 quick-cocos2d-x 与 OpenQuick 两款Lua免费开源框架
- cocos2d-x 使用JniHelper 调用 java代码 获取安卓生成的唯一标示UUID
- VC 6中使用不同调用规范的函数在符号文件里的表示方式
- 解决cocos2d-x 安卓锁屏再解锁,OPenGL报错;后台转前台异常问题解决办法 (续)
- 内核层读写应用层文件,使用filp_open函数——完美
- CodeProject - 在C#使用SHGetFileInfo获取(管理)文件或者文件夹图标(C#封装Win32函数的一个例子)
- 使用linux c 目录操作函数,读取任一目录下的所有目录信息文件信息
- Windows DIB文件操作具体解释-4.使用DIB Section