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

来源:互联网 发布:战斗行动预测数据库 编辑:程序博客网 时间:2024/05/01 23:29

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

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);







原创粉丝点击