本文主要是介绍papa_cocos2d_ActionManage,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这个类里面介绍了CCActionManager(动作管理者)的一些接口,住要目的还是教会我们怎么去用这些方法。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];
}
[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];
}
这篇关于papa_cocos2d_ActionManage的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!