[cocos2dx笔记007]一个自定义场景切换的实例

cocos2dx框架已经提供了很多场景切换的类,但是一些自定义的场景切换,只有自己实现了。下面是实现的类。这里设计的分辨率是750*500.请根据实际的要求调整。

头文件

#ifndef _TRANSITION_GAME_H_

#define _TRANSITION_GAME_H_

#include <cocos2d.h>

namespace cocos2d

{

class CCTransitionGame : public CCTransitionScene

{

public:

CCTransitionGame();

virtual ~CCTransitionGame();

void onEnter();

static CCTransitionGame * create(float t, CCScene *scene);

private:

void LRFinish(void);

void OnFirstActionFinish(void);

private:

int m_FinishCnt;

};

}

#endif

源文件

#include "TransitionGame.h"

#include "xlog.h"

#include <xstring.h>

namespace cocos2d

{

using namespace zdh;

CCTransitionGame * CCTransitionGame::create(float t, CCScene *scene)

{

CCTransitionGame * pScene = new CCTransitionGame();

if (pScene && pScene->initWithDuration(t, scene))

{

pScene->autorelease();

return pScene;

}

CC_SAFE_DELETE(pScene);

return NULL;

}

CCTransitionGame::CCTransitionGame()

{

m_FinishCnt = 0;

}

CCTransitionGame::~CCTransitionGame()

{

}

void CCTransitionGame::onEnter()

{

CCTransitionScene::onEnter();

CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();

CCPoint stLeftBegin, stLeftEnd, stRightBegin, stRightEnd;

//设置左边的起点和终点

stLeftBegin.setPoint(-436.0f, -60);

stLeftEnd.setPoint(visibleSize.width / 2.0f + stLeftBegin.x, -60.0f);

//设置右边的起点和终点

stRightBegin.setPoint(visibleSize.width, -60.0f);

stRightEnd.setPoint(visibleSize.width / 2.0f, -60.0f);

//加载动画序列

CCSpriteFrameCache* pCache = CCSpriteFrameCache::sharedSpriteFrameCache();

pCache->addSpriteFramesWithFile("middle_ani_1.plist");

pCache->addSpriteFramesWithFile("middle_ani_2.plist");

//生成画动图片列表和动画对象

CCArray* pAnimFrames = CCArray::createWithCapacity(69);

XAnsiString strAniName;

for (int i = 1; i < 70; i++)

{

strAniName.printf("light%04d.png", i);

pAnimFrames->addObject(pCache->spriteFrameByName(strAniName.c_str()));

}

CCAnimation* animation = CCAnimation::createWithSpriteFrames(pAnimFrames, this->m_fDuration * 2.0f/3.0f/69.0f );

CCNode * pNode = CCNode::create(); //这个有两个子节点,一个是左边交换图片,一个是中间的动画,用于一起做移动的Action

CCSprite* pLeft = CCSprite::createWithSpriteFrameName("swap_left.png");

pLeft->setAnchorPoint(CCPointZero);

pNode->addChild(pLeft);

CCSprite * pMiddle = CCSprite::create();  //显示动画

pMiddle->setAnchorPoint(CCPointZero);

pMiddle->setPosition(ccp(436.0f - 69.0f, 250.0f + 60.0f - 72.0f));

pMiddle->runAction(CCAnimate::create(animation));

pNode->addChild(pMiddle);

pNode->setAnchorPoint(ccp(0,0));

pNode->setPosition(stLeftBegin);

this->addChild(pNode,1);

//右边的交换图片

CCSprite* pRight = CCSprite::createWithSpriteFrameName("swap_right.png");

pRight->setPosition(stRightBegin);

pRight->setAnchorPoint(CCPointZero);

this->addChild(pRight, 0);

//定义动作

//左边的向右移动活动

CCMoveTo* pActionLeft = CCMoveTo::create(m_fDuration / 3, stLeftEnd);

//右边的向左移动活动

CCMoveTo * pActionRight = CCMoveTo::create(m_fDuration / 3, stRightEnd);

//原地不动

CCMoveTo* pActionLeft1 = CCMoveTo::create(m_fDuration / 3, stLeftEnd);

CCMoveTo * pActionRight1 = CCMoveTo::create(m_fDuration / 3, stRightEnd);

CCMoveTo* pActionLeft2 = CCMoveTo::create(m_fDuration / 3, stLeftBegin);

CCMoveTo * pActionRight2 = CCMoveTo::create(m_fDuration / 3, stRightBegin);

m_FinishCnt = 0;

pNode->runAction(CCSequence::create(pActionLeft, CCCallFunc::create(this, callfunc_selector(CCTransitionGame::OnFirstActionFinish)), pActionLeft1, pActionLeft2, CCCallFunc::create(this, callfunc_selector(CCTransitionGame::LRFinish)), NULL));

pRight->runAction(CCSequence::create(pActionRight, pActionRight1,pActionRight2, CCCallFunc::create(this, callfunc_selector(CCTransitionGame::LRFinish)), NULL));

}

void CCTransitionGame::LRFinish(void)

{

//所以的活动完成后,要执行场行的Finish

m_FinishCnt++;

if (m_FinishCnt >= 2)

{

CCTransitionScene::finish();

}

}

void CCTransitionGame::OnFirstActionFinish(void)

{

//打开门之前,关闭显示第一个场景,显示第二个场景

m_pInScene->setVisible(true);

m_pOutScene->setVisible(false);

}

}

用到的资源

/Files/zdhsoft/plist.zip 效果图:

[cocos2dx笔记007]一个自定义场景切换的实例

时间: 2024-10-01 14:29:00

[cocos2dx笔记007]一个自定义场景切换的实例的相关文章

cocos2dx 游戏开发中常用场景切换方式以及特性

runWithScene(CCScene* scene):启动游戏,并运行scene 场景.这个方法在主程序启动时第一次启动主场景时调用. replaceScene(CCScene* scene):直接使用传入的scene 替换当前场景来切换画面,当前场景将被释放.这是切换场景时 最常用的方法. pushScene(CCScene* scene):在不释放旧场景内存的情况下运行新场景,推进新场景相当于在当前可见的纸上再放一张纸,而之前的纸位置何持不变.适用情况: 1.推进一个经常被用到的场景,例

Cocos2d-X研究之3.0 场景切换特效汇总

Cocos2d-X研究之3.0 场景切换特效汇总 2014-08-05      0个评论    来源:游戏编程    收藏    我要投稿 cocos2d-x 3.0中场景切换特效比较多,而且游戏开发中也经常需要用到这些特效,来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 场景切换用到导演类Directory,大多数用的都是替换场景,当然也可以用出栈进栈的方式来进行场景的替换,这里以replaceScene来举例.3.0事件分发机制—触摸事件监听不明白的可以看下. 场景切换特效的应

[cocos2dx笔记014]一个用于cocos2dx的对象智能指针模板

现在C++智能指针有无数个实现了,多一个也无所谓.哈. 这个智能指针是专门为cocos2dx 2.2.x定制的.主要是为了方便使用,同时又要遵循现有的cocos2dx的内存管理.特实现这样一个智能指针.在使用的时候不需要考虑retain或release操作,也不需要new或delete操作! 下面是实现代码 //在很多时候,类的成员是CCObject的子对象,为了保证对其正常使用,又要遵循cocos2dx的内存管理,特实现了这样的一个智能指针,方便使用. #ifndef _X_COCOS_PTR

Cocos2d-x学习笔记(九)场景切换

这里只介绍两个简单的两个场景相互切换的方法. void pushScene(Scene *sn)和void popScene(Scene *sn)是一对.前者将当前场景放入到场景堆栈中,并切换到下一个场景:而后者则是回到堆栈顶的场景(一般是上一个场景).另外,这里的堆栈的原型是Vector<Scene*>.通常,他们都是通过事件回调来触发的. 下边的代码是将当前场景压入堆栈,并自动切换到下一个场景(其实,实质是在回到函数里创建了一个新场景^_^): MenuItemImage *setting

IOS自定义场景切换动画。

IOS中我们可以通过Storyborad以及segue来实现我们自己的场景切换动画,新建项目使用Single View Application模板并取名为MyCustomSegue. 使用storyboard托出另一UIViewController并分设置两个控制器的视图颜色,并设置跳转页面的segue为custom 设置如图 新建文件MyCustomChangeSegue并重新perform方法 1 @implementation MyCustomChangeSegue 2 3 -(void)

[cocos2dx笔记005]一个字符串管理配置类

在用vs开发cocos2dx过程中.要显示的中文,要求是UTF-8格式的才干正常显示出来.但VS通常是ANSI格式保存,这样,在代码中写入的中文字符串,执行后.显示的就是乱码. 为了正确显示中文.或支持多语言,我这里定义一个简单的字符串管理类,来满足上述要求. 这个类使用了我的开源码中的XAnsiString和XMap.TextIni这几个类.能够在我的开放代码找到下载. 以下是代码://字符串资源管理器 #ifndef _X_STRING_MANAGER_H_ #define _X_STRIN

[cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类

用CCLabelTTF显示的数字不好看.于是就想到用图片来代理.眼下网上的实现都是把每一个数字做一个CCSprite组合的方式. 可是我想.动态生成纹理的方式.没有就仅仅好自己手动写一个. 头文件 #ifndef _X_NUMBER_H_ #define _X_NUMBER_H_ #include <cocos2d.h> #include <xtype.h> namespace cocos2d { //基于图片显示的数字 /* 这个类不是用一个一个数字拼起来,而是渲染成一个独立的纹

python3学习笔记--003--写一个自定义的包

代码布局: [[email protected] packagetest]$ tree . ├── mypackage │   ├── human.py │   ├── __init__.py │   └── student.py └── test.py 1 directory, 4 files [[email protected] packagetest]$ mypackage/human.py #!/usr/bin/env python class person: def __init__(

Vue2.x源码学习笔记-从一个小例子查看vm实例生命周期

学习任何一门框架,都不可能一股脑儿的从入口代码从上到下,把代码看完, 这样其实是很枯燥的,我想也很少有人这么干,或者这么干着干着可能干不下去了. 因为肯定很无聊. 我们先从一个最最简单的小例子,来查看new Vue(options)实例,这个过程发生了什么. vm实例上的属性又如何添加上去的,又如何渲染到浏览器页面上的. 关于vue的数据依赖和虚拟dom都是重点,必然会在以后的帖子记录. 这篇帖子就根据下例子,看看实例化一个vm实例做了啥吧. 先把小例子贴出来: <div id="app&