Cocos2dx 核心概念
1.场景
场景: 相当于舞台剧中的一幕。场景相当于容器,存放需要渲染的层
场景切换: 由A场景切换到B场景,游戏中非常常见。
场景的由来: 从内存的角度,当我们把游戏中的图片资源加载到游戏菜单界面中, 图片资源会放到内存中。切换游戏进行界面的时候, 经常会销毁游戏菜单界面中的资源,
再重新加载游戏进行时的图片资源,可以减少内存的使用。怎么方便的销毁图片资源? 这时候引入场景, 当销毁场景的时候,游戏资源也会销毁。
Cocos2dx 中 的场景时利用栈的形式, 减少内存的使用,最好将栈中存放一个场景.
场景切换的两种方式: (1) replaceScene() (2) pushScene() popScene()
(1) replaceScene() -----> 会将原来的场景销毁,创建新的场景
(2) pushScene()-----> 将场景压入栈中,显示栈顶的场景;不用场景利用popScene()
我们最好使用replaceScene(),这种方式会销毁原来的场景,重新创建新的场景,这种方式虽然耗时间,但是不会占用太多的内存。
pushScene和popScene()这种方式, 切换场景的时候速度快,但是占用很多的内存。
代码
Scene * bg_scene::createScene()
{
auto pscene = Scene::create();
auto layer = bg_layer::create();
pscene->addChild(layer);
return pscene;
}
2.层
CCLayer是处理玩家触摸事件的CCNode子类。层知道怎样渲染自己,也可能是半透明的,这样游戏玩家就可以看到当前层下面的其他层。CCLayers在你定义游戏的外观和行为方面非常有用,所以,你应该要花很多编程时间编写CCLayer子类,来完成做你需要实现的。
【cocos2d-x官方文档】导演,场景,层,以及精灵的介绍
一般在CCLayer中定义触摸事件的处理者。CCLayer通过实现触摸事件的方法(ccTouchBegan, ccTouchMoved, ccTouchEnded, or ccTouchCancelled) 可以回应玩家的互动。这些触摸事件会传播到场景中的所有层,从前向后,直到某个层截获并处理这些触摸事件。
而复杂的应用程序会要求你定义定制CCLayer子类,cocos2d提供了一些预先定义的层。一些例子包括CCMenu(简单的菜单层),CCColorLayer(填充色层),CCLayerMultiplex(可以复用他的子节点,可以每次激活其中一个子节点,同时禁用其他的)。
层可以包含任何CCNode作为子节点,包括CCSprites(精灵), CCLabels(标签),甚至其他的CCLayer对象。因为层是CCNode子类,层可以通过手动或者使用CCActions进行切换。
代码
bool bg_layer::init()
{
if (!Layer::init())//加载不超过 ,返回
{
return false;
}
Size visableSize = Director::getInstance()->getVisibleSize();
return true;
}
3.精灵
Cocos2d中的精灵和其他游戏引擎中的精灵相似。它是可以运动,旋转,缩放,执行动画,并接受其他转换。
CCSprite是精灵的实现类,可以拥有其他的精灵作为子节点。当父节点的精灵改变,子节点也随之改变。
因为精灵是CCNode的子类,可以手动或者使用CCActions改变精灵。
代码
auto bg_sp = Sprite::create("background.png");
this->addChild(bg_sp);
4.导演
导演: 游戏框架的执行者。负责场景切换,初始化游戏(游戏开始),游戏销毁(游戏结束)
Cocos2dx中的导演类是Director。
其中导演类常用的功能:
1. 获得导演类对象: auto director = Director::getInstance();
2. 打开或者关闭FBS: Director::getInstance()->setDisplayStates(true);
3. 设置刷新频率: Director::getInstance()->setAnimationInterval(1.0/60);
4. 运行某一个场景: Director::runWithScene(Scene);
5. 退出游戏: Director::getInstance()->end();
6. 暂停游戏: Director::getInstance()->pause(); -------> 当暂停游戏时, 仍然会绘制画面,但是会停止所有的动作,效果和定时器,并且帧率会下降到4FPS,节省电和内存资源。
7. 返回游戏: Director::getInstance()->resume();
8. 获得屏幕大小: Director::getInstance()->getVisibleSize();