Cocos2d基础及基本函数


1.基本概念:

Scene对象其实是所有层的容器,与Layer一起组织各节点的图像显示。除了Scene外所有节点只有一个父节点,可以有无数个子节点。但注意这里的父子关系并不是面象对象中的继承关系,仅仅是addChild的方式建立起来的父子。

 

CCDirector类存储了cocos2d中大量的全局配置信息,而且管理所有的cocos2d场景,它可以访问正在运行的场景,运行替换场景等等。共有四种导演类型,其中默认的是kCCDirectorTypeDisplayLink

 

Tips: 在为对象建分组和层时一般通用的CCNode类而不是CCLayer类,因为CCLayer会接收键盘等的输入,增加不必要的开销。

 

2.节点处理:

CCNode* childNode = [CCNode node];

 

[myNode addChild:childNode z:0 tag:123];

 

CCNode* retrievedNode = [myNode getChildByTag:123];

 

[myNode removeChildByTag:123 cleanUp:YES];

(cleanUp的意思是将节点从父节点中删除)

 

[myNode removeChild: retrievedNode];

 

[myNode removeAllChildrenWithCleanUp:YES];

 

[myNode removeFromParentAndCleanUp:YES];

 

3.动作的处理方式

1)动作声明

通过以下声明可以让节点闪烁

CCAction* action = [CCBlink actionWithDuartion:10blinks:20];

action.tag = 234;

[myNode runAction:action];

 

如果之后想取得动作,可以通过标记来获得:

CCAction* retrievedAction = [myNode getActionByTag: 234];

 

[myNode stopActionByTag:234];

 

[myNode stopAction: action];

 

[myNode stopAllActions];

 

2)消息调度

节点可以对消息进行调度,其实就是每段时间调用一次方法,如碰撞检测。要使特定的方法每帧调用一次,可以如下:

-(void) scheduleUpdateMethod

{

[self scheduleUpdate];

}

 

-(void) update: (ccTime)delta

{

//This method iscalled every frame;

}

 

参数delta表示方法自上次被调用到现在所经历过的时间。如果想以0.1秒的频率调用该方法可以如下:

-(void) scheduleUpdateMethod

{

[selfschedule:@selector (updateTenTimesPerSecond: ) interval:0.1f];

}

 

-(void) updateTenTimesPerSecond: (ccTime)delta

{

//This method iscalled according to its interval, ten times per second

}

 

Tips: 如果想用每帧更新,还是用scheduleUpdate好,反过来,如果在后面有可能要取消这个办法,还是用上面的方法,因为scheduleUpdate做不到。

 

3) @selector方法

在这里selector方法相当于是告诉编译器去找一个名为updateTenTimesPerSecond的方法,并用“:”来告诉这个函数只有一个参数,如果这个函数有多个参数时,就要用多个,千万别忘了:号,如:

-(void) example:(ccTime)delta sender:(id)senderflag:(bool)aBool

 

那么对应的selector语句应该是:

@selector(example:sender:flag:)

 

如果要取消用选择器调度的方法,可以用

[self unscheduleAllSelectors];

[self unscheduled:@selector(updateTenTimesPerSecond)];

但要注意,用这些方法不会使scheduleUpdate的调度更新方法停止。

 

这里注意,如果想以不同的时间来调度一个方法,可以用_cmd来简化工作,_cmd在所有的Ob-C中都可用,是当前方法的选择器。

-(void) scheduleUpdates

{

[selfschedule:@selector(irregularUpdate:) interval:1];

}

 

-(void) irregularUpdate: (ccTime)delta

{

[self unscheduled:_cmd];

float nextUpdate= CCRANDOM_0_1() * 10;

[selfschedule:_cmd interval:nextUpdate];

}

 

在更新中还有更新方法的优先级,可以用[selfscheduleUpdateWithPriority:1]来进行更新,数字越小更新等级越高。

 

3. CCScene类

CCDirector要求有派生自CCScene的类来进行runWithScene,replaceScene, pushScene等操作来修发当前场景,可以把CCScene封到一个派生自CCSceneTransition的类中,以便能够进行切换。

 

因为大多数时候场景对象本身不包含具体的游戏代码,而且基本不会从它派生类,所以一般都在CCLayer对象的“+(id)scene”方法中创建它们,如下:

+(id) scene

{

CCScene *scene =[CCScene node];

CCLayer *layer =[HelloWorld node];

[sceneaddChild:layer];

 

return scene;

}

 

然后可以在applicationDidFinishLaunching中结尾创建场景:

[[CCDirector sharedDirector] runWithScene: [HelloWorldscene]];

 

而在替换场景时,还可以使用过渡效果:

CCScene* scene = [HelloWorld scene];

CCSceneTransition* tran = [CCTransitionShrinkGrowtransitionWithDuration:2 scene: scene];

[[CCDirector sharedDirector] replaceScene: tran];

 

Tips:不能用self作为参数传给replaceScene以达到刷新场景的目的,会卡死的。

 

4. CCTransitionScene类

场景过渡就是任何从CCTransitionScene继承的类,如下例:

CCTransitionFade *tran = [CCTransitionFadetransitionWithDuration:1 scene:[HelloWorld scene] withColor:ccWHITE];

[[CCDirector sharedDirector] replaceScene: tran];

 

Tips: pushScene有过渡效果,但是popScene没有

  • 1
  • 2
  • 下一页

相关内容