您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-X 安卓中禁止锁屏,音量调节,TexturePacker文件在函数中的具体使用

2013-06-17 16:23 393 查看
做游戏过程中会有一些比较有价值的方法或要点,在此记下,为了方便自己日后查看,也为了给大家一个提醒!

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: