papa_cocos2d_ActionManage

2024-01-29 11:58
文章标签 cocos2d papa actionmanage

本文主要是介绍papa_cocos2d_ActionManage,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个类里面介绍了CCActionManager(动作管理者)的一些接口,住要目的还是教会我们怎么去用这些方法。

注:高手看看就可以了,我作为新人,写这个也是为了记忆深刻

这个类中定义了一个枚举,是在@implementation外定义的,还有一些其他的方法。
这是开始cocos2d以来第一篇总结,所以我会写的详细一些。获得窗口大小 CGSize winSize = [[CCDirector sharedDirector]winSize]; 因为cocos2d跟我们之前的窗口坐标还是有区别的,所以一定要注意cocos2d横屏坐标系的原点在左下角。

image menu的创建方法

CCMenuItemImage *item1 = [CCMenuItemImage itemFromNormalImage:@"b1.png" selectedImage:@"b2.png" target:self selector:@selector(backCallback:)];

CCMenuItemImage *item2 = [CCMenuItemImage itemFromNormalImage:@"r1.png" selectedImage:@"r2.png" target:self selector:@selector(restartCallback:)];

CCMenuItemImage *item3 = [CCMenuItemImage itemFromNormalImage:@"f1.png" selectedImage:@"f2.png" target:self selector:@selector(nextCallback:)];


以上这些创建一个菜单,看代码应该很容易明白,需要2张图片,一张是正常状态下(未选中状态下),那一张是选中状态下的图片,指定一个目标去执行selector里面指定的方法。


这只是创建了三个菜单,之后还要把这些菜单统一用CCMenu这个类来管理,所以要把这些子菜单加入到CCMenu(如下)

CCMenu *menu = [CCMenu menuWithItems:item1, item2, item3, nil];


之后就可以指定menu的位置了(如下)

menu.position = CGPointZero; (可以设置menu的坐标为0,0)但是不要紧,具体位置还是由它里面的子菜单来决定

item1.position = ccp( s.width/2 - 100,30);

item2.position = ccp( s.width/2, 30);

item3.position = ccp( s.width/2 + 100,30);


ccp是一个宏

#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)

跟我们之前写一个CGPointMake是一样的


最后就是把这个菜单加入到我们的层上,现在就可以显示在屏幕上了

[self addChild: menu z:1];


在cocos2d中label的创建方法,其实这些东西,只要看看代码,也就明白了

CCLabel* label = [CCLabel labelWithString:[self title] fontName:@"Arial" fontSize:32];

[self addChild: label z:1];

[label setPosition: ccp(s.width/2, s.height-50)];

这就是创建一个label


创建一个场景:


CCScene *s = [CCScene node];


场景出来之后,我们就可以在场景上边添加层了,可以添加多个层(CCMultiplexLayer),也可以添加一个层


场景之间的切换[[CCDirector sharedDirector] replaceScene: s];

场景之间的切换会自动释放被切换的场景,还可以在切换的过程中加入一些动画,以后的总结中我会提到


在cocos2d中,有4个基本的概念,我建议还是先看看这些基本概念在进行游戏的研究会对你有一定的帮助的

4个概念:CCDirector(字面理解就是导演)你可以想象一下在一个大型的演唱会中,总导演只有一个,他负责全场的活动

CCScene(场景)这个可以理解为一个大型演唱会的舞台,它可以容纳各种道具。我们推荐要把层加到场景上,这样比较科学

CCLayer (层)这个可以理解为一个画布,在它上边可以加精灵,label,menu等等,层的显示,会把加在它上面的node也显示出来

CCSprite(精灵)可以把能动的,能变化的图片都理解为精灵


这些概念随着对cocos2d的深入研究,自己也会总结出一套复合自己的标准,不一定非要跟我或者跟其他人一样,只要自己能理解就好



基本动作和精灵


CCSprite *child = [CCSprite spriteWithFile:@"grossini.png"];

[child setPosition:ccp(200,200)];

[self addChild:child z:1];


上边的代码是在层上添加一个精灵,实际上cocos2d中,所有的图片数据都会保存在一个缓存里面,当你第二次读取这个图片的时候,系统会根据图片的名字直接放回,不需要在重复生成创建,这不需要太在乎,只要知道有这么回事就可以了

position这个属性是相对于精灵中心点的,z参数代表的是层次关系


//Sum of all action's duration is 1.5 second.

[child runAction:[CCMoveTo actionWithDuration:1.5f position:ccp(150,0)]];

[child runAction:[CCSequence actions:

  [CCDelayTime actionWithDuration:1.4f],

  [CCFadeOut actionWithDuration:1.1f],

  nil]

];

这部分有几个动作和方法,其中的CCRotateBy看名字就知道是旋转的意思,CCMoveTo是移动到x=150,y=0的位置,这里还有个CCMoveBy,它是相对自己当前的位置移动了多少,可能这个说的有点不明白,自己写一下感受一下就明白了。1.5f就是指定动作的时间position就是移动的目的地

CCDelayTime它指定了延时,在这里延时了1.4s,就是经过1.4s之后在执行某个动作。CCFadeOut意思很明确,谈出

这里还用到了CCSequence,它叫动作序列,就是加入到它里面的动作,会按照顺序进行,一次执行


//After 1.5 second, self will be removed.

[self runAction:[CCSequence actions:

 [CCDelayTime actionWithDuration:1.4f],

 [CCCallFunc actionWithTarget:self selector:@selector(removeThis)],

 nil]

];


这部分主要是有个回调方法CCCallFunc看代码就知道,它是想到延时1.4s之后执行一个removeThis这个动作,这里没有传参数,后面的总结中会有介绍


-(void) removeThis

{

[parent_ removeChild:self cleanup:YES];

}


这个就是相应的回调函数,在这里面把自己(self 就是层)给删除了,需要注意一下的是,parent_是CCNode的一个对象,我们要用父类来管理,进行删除

带参数的回调:

[grossini runAction: [CCSequence actions: 

 [CCMoveBy actionWithDuration:1 position:ccp(150,0)],

[CCCallFuncN actionWithTarget:self selector:@selector(bugMe:)],

 [CCMoveBy actionWithDuration:1 position:ccp(-150,0)], // 这个动作就是由于bugMe:里面的stopAllActions 所以不执行了

nil]

];


带参数的回调,注意一点,grossini是个精灵,那么CCCallFuncN这个方法会把grossini当成要传递的参数,所在下面的方法中的node就是grossini这个精灵了


- (void)bugMe:(CCNode *)node

{

[node stopAllActions]; //After this stop next action not working, if remove this stop everything is working

注释说的很明白,当精灵调用了stopAllActions之后所有的动作就不会在执行了,看上面的代码,在上面的代码中的第二个CCMoveBy就不会在执行了,因为在它之前我们执行了stopAllActions这个方法了

[node runAction:[CCScaleTo actionWithDuration:2 scale:2]];

}


要主要回调在游戏开发中经常会适用到,用用就知道是什么意思了


动作管理者:

-(void) onEnter

{

//

// This test MUST be done in 'onEnter' and not on 'init'

// otherwise the paused action will be resumed at 'onEnter' time

//

[super onEnter];


//

// Also, this test MUST be done, after [super onEnter]

//

CCSprite *grossini = [CCSprite spriteWithFile:@"grossini.png"];

[self addChild:grossini z:0 tag:kTagGrossini];

[grossini setPosition:ccp(200,200)];

CCAction *action = [CCMoveBy actionWithDuration:1 position:ccp(150,0)];

这行注意一下,上面呢我们创建了一个动作,然后这句话的意思是把这个动作加入到了动作管理者里面,并且设置为暂停状态

就是说如果这个时候你直接run了一个动作那它也不会执行,因为现在的paused是YES状态

[[CCActionManager sharedManager] addAction:action target:grossini paused:YES];

         这句就是过来3秒中执行unpause(取消暂停)

[self schedule:@selector(unpause:) interval:3];

}


-(void) unpause:(ccTime)dt

{       下面的_cmd代表当前执行的方法 unschedule是取消的意思

[self unschedule:_cmd];

CCNode *node = [self getChildByTag:kTagGrossini];

        这个就是恢复目标,这个目标就是上面加入动作管理者的时候的那个精灵,那么现在动作就可以执行了

[[CCActionManager sharedManager] resumeTarget:node];

}


顺便说一下,方法也可以用tag来进行标记,在某些情况下,直接根据者个标记来执行或者删除或者暂停某些方法

这一章的内容差不多了,一定要看源码,自己多联系,进步得才更快
http://gaohaijun.blog.163.com/blog/static/1766982712010111753046300/

这篇关于papa_cocos2d_ActionManage的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656826

相关文章

Cocos2d-x自适应Android屏幕分辨

ndroid下分辨率太多,不太可能为每种分辨率做一套资源,目前一般来说比较流行的是320*480, 800*400, 854*400。当然现在720P的也出来了,但至少目前不是主流机型^_^. 对于不支持的分辨率,我希望的是能够按照屏幕大小按比例缩放,即有了下面的代码。 1:ViewAutoScale 写了一个ViewAutoScale函数,如下:   #include "ViewAuto

cocos2d-x Android实现广告条竖立放置

 2:实现 原理:将屏幕设置为竖屏,然后CCDirector::setDeviceOrientation()设置为cocos2d-x为横屏。            在这种转屏模式下,控件是不会旋转的 缺点:所有Android原生控件仍然是竖立的 注意事项: ccTouchesBegan,ccTouchesMoved, ccTouchesEnded传入的坐标值仍然是屏幕坐标

Cocos2d-x 场景切换深入篇

接着上一次的场景切换1,要补充一些内容 如果Last对应的回调函数是这样写的 void MyScene::LastSceneCallback(CCObject* pSender)  {   //CCScene* scene =new MyScene();   //CCLayer* pLayer = new LayerPanda();   //scene->addChild(pLayer

cocos2d-x ScrollView(上)

scrollView 的调用问题困扰我很久,昨天才有时间继续研究这个,可惜最后还是没能完全解决它存在的问题。。。 看头文件: [cpp] view plain copy #ifndef __HELLOWORLD_SCENE_H__  #define __HELLOWORLD_SCENE_H__    #include "cocos2d.h"    #include "../..

cocos2d-x 重力感应

本文没你想象的那么,,复杂。其实就是通过重力感应控制个小球移动而已。 先看头文件: [cpp] view plain copy #ifndef __HELLOWORLD_SCENE_H__  #define __HELLOWORLD_SCENE_H__    #include "cocos2d.h"  USING_NS_CC;    class HelloWorld : public

Cocos2D-X开发神器CocoCreator使用介绍

你还在为搭建Cocos2d-x开发环境而头痛么,还在为平台移植问题而困扰么,我想大家都想更加快速得进行开发,今天才知道这个神器的,稍微使用了一下,觉得还是挺ok的一个开发工具,所以这里推荐给大家。   可以到下面地址下载:    http://cococreator.com/         更详细的介绍请参考CSDN认证专家小巫的博客文章:  ,手机游戏开发培训;      http:/

cocos2d-x 如何使用CCProgressTimer作为血条,实现跟随怪物进行移动,自动掉血,然后死亡。

Cocos2d-x中类CCProgressTimer实现游戏人物血条 一、CCProgressTimer的基本使用步骤: cocos2d-x的进度条函数CCProgressTimer,我们可以这样定义: 1. //s_pPathSister1为图片的路径 2. CCProgressTimer *left = CCProgressTimer::create(

cocos2d的暂停/恢复

cocos2d提供了比较重要的有3种暂停、恢复的机制 分别是CCDirector, CCActionManager, CCScheduler提供的 1 CCDirecotor: -(void) pause; -(void) resume; 导演类的暂停恢复是针对整个运行场景的,所以如果我们还想在暂停的画面上做其他事情,不推荐这种方法 2 CCActionManager -(voi

cocos2d-x基础知识(四) 简单菜单及坐标系

关于cocos2d坐标系的一点点心得   cocos2d-x 中关于convertToNodeSpace 的用法: cocos2d-x 中关于convertToNodeSpace 的用法: A->converToNodeSpace(CCPoint point )的意思是将point 转换成A的坐标系中的位置点。 我在做连连游戏中由于精灵在自定义的CC

cocos2d-x基础知识 坐标系 -- 很好的文章

无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥奔头了。所以玩cocos2d,一上来就先把各种与坐标有关的东西搞清楚。   基本的两个坐标系:屏幕坐标系和GL坐标系。 屏幕坐标系x轴朝右,y轴朝下。默认原点在左上角。 GL坐标系x轴朝右,y轴朝上。默认原点在左下角。          在调用任何需要设置位置的函数,或从函数获取位置信息前,