了解CCMoveTo CCCallFuncN CCSequence用法
在《iPhone &iPad Cocos2D游戏开发实战》一书中在看第四章时候遇到陌生知识,然后在网上到相关知识点,再此记录;
由序列控制蜘蛛的移动方法代码
[cpp]view plaincopy
1.-(void) runSpiderMoveSequence:(CCSprite*)spider {
2.// 随着时间慢慢增加蜘蛛的移动速度
3.numSpidersMoved++;//定义的int型变量
4.if (numSpidersMoved % 8 == 0 && spiderMoveDuration > 2.0f) {
5.spiderMoveDuration -= 0.1f; }
6.// 用于控制蜘蛛移动的动作序列
7.CGPoint belowScreenPosition = CGPointMake(spider.position.x,
8.-[spider texture].contentSize.height);
9.CCMoveTo* move = [CCMoveTo actionWithDuration:spiderMoveDuration position:belowScreenPosition];
10.CCCallFuncN* call = [CCCallFuncN actionWithTarget:self selector:@selector(spiderBelowScreen:)];
11.CCSequence* sequence = [CCSequence actions:move, call, nil];
12.[spider runAction:sequence];
13.}
RunSpiderMoveSequence方法的作用是跟踪已被放下的蜘蛛数量。每次到第八个蜘蛛
时,spiderMoveDuration的值就会被减少,从而提高所有蜘蛛的移动速度。%这个符号叫作“余数运算子”(Modulus Operator),用于得到运用除法以后得到的余数。比如,如果numSpidersMoved可以用8除尽,那么“余数运算子”的计算结果就应该是0。
这里用到的动作序列只有一个CCMoveTo动作和一个CCCallFuncN动作。你可以改进蜘蛛的行为,比如
让它往下移动一点,等个几秒钟,然后一直移动到底部,就像真的邪恶的蜘蛛通常会做的那样。我将把具体的做法留给你去发挥。我选择CCCallFuncN的目的是给spiderBelowScreen方法传递蜘蛛精灵作为它的sender变量。这样的话,当某只蜘蛛到达屏幕底部时,我就可以直接引用那个蜘蛛,不需要再去到处了
1.CCMoveTo
表示移动到某一个点,还有一个与它类似的CCMoveBy表示移动相对于当前位置某个位置,相当于一个向量;
2.CCCallFuncN
CCCallFuncN
带有一个参数,这个参数本身是一个Action,相当于他的参数就是一个BUtton;与它类似的还有CCCallFunc
不带参数,执行回调函数方法,
CCCallFuncND
带两个参数,一个是Action动作,另一个是自定义的参数
CCCallFuncO 也是两个参数,和CCCallFuncN参数一样,
以下是几个类在CCActionInstant.m文件中的定义,通过他们的-(void)execute函数看出他们参数问题
[cpp]view plaincopy
1.//
2.// CallFunc
3.//
4.#pragma mark CCCallFunc
5.
6.@implementation CCCallFunc
7.
8.@synthesize targetCallback = targetCallback_;
9.
10.+(id) actionWithTarget: (id) t selector:(SEL) s
11.{
13.}
14.
15.-(id) initWithTarget: (id) t selector:(SEL) s
16.{
17.if( (self=[super init]) ) {
18. self.targetCallback = t;
19. selector_ = s;
20. }
22.}
23.
24.-(NSString*) description
25.{
27. [self class],
28. self,
29. (long)tag_,
30. NSStringFromSelector(selector_)
31. ];
32.}
33.
34.-(void) dealloc
35.{
36. [targetCallback_ release];
37. [super dealloc];
38.}
39.
40.-(id) copyWithZone: (NSZone*) zone
41.{
42. CCActionInstant *copy = [[[self class] allocWithZone: zone] initWithTarget:targetCallback_ sel
spider软件ector:selector_];
44.}
45.
46.-(void) update:(ccTime)time
47.{
48. [self execute];
49.}
50.
51.-(void) execute
52.{
53. [targetCallback_ performSelector:selector_];
54.}
55.@end
[cpp]view plaincopy
1.//
2.// CallFuncN
3.//
4.#pragma mark CCCallFuncN
5.
6.@implementation CCCallFuncN
7.
8.-(void) execute
9.{
10. [targetCallback_ performSelector:selector_ withObject:target_];
11.}
12.@end
2.// CallFuncND
3.//
4.#pragma mark CCCallFuncND
5.
6.@implementation CCCallFuncND
7.
8.@synthesize callbackMethod = callbackMethod_;
9.
10.+(id) actionWithTarget:(id)t selector:(SEL)s data:(void*)d
11.{
13.}
14.
15.-(id) initWithTarget:(id)t selector:(SEL)s data:(void*)d
16.{
17.if( (self=[super initWithTarget:t selector:s]) ) {
18. data_ = d;
19.
20.#if COCOS2D_DEBUG
21. NSMethodSignature * sig = [t methodSignatureForSelector:s]; // added
22. NSAssert(sig !=0 , @"Signature not found for selector - does it have the following form? -
(void)name:(id)sender data:(void*)data");
23.#endif
24. callbackMethod_ = (CC_CALLBACK_ND) [t methodForSelector:s];
25. }
27.}
28.
29.-(id) copyWithZone: (NSZone*) zone
30.{
31. CCActionInstant *copy = [[[self class] allocWithZone: zone] initWithTarget:targetCallback_ sel
ector:selector_ data:data_];
33.}
34.
35.-(void) dealloc
36.{
37.// nothing to dealloc really. Everything is dealloc on super (CCCallFuncN)
38. [super dealloc];
39.}
40.
41.-(void) execute
42.{
43. callbackMethod_(targetCallback_,selector_,target_, data_);
45.@end
1.@implementation CCCallFuncO
2.@synthesize object = object_;
3.
4.+(id) actionWithTarget: (id) t selector:(SEL) s object:(id)object
5.{
7.}
8.
9.-(id) initWithTarget:(id) t selector:(SEL) s object:(id)object
10.{
11.if( (self=[super initWithTarget:t selector:s] ) )
12. self.object = object;
13.
15.}
16.
17.- (void) dealloc
18.{
19. [object_ release];
20. [super dealloc];
21.}
22.
23.-(id) copyWithZone: (NSZone*) zone
24.{
25. CCActionInstant *copy = [[[self class] allocWithZone: zone] initWithTarget:targetCallback_ sel
ector:selector_ object:object_];
27.}
28.
29.
30.-(void) execute
31.{
32. [targetCallback_ performSelector:selector_ withObject:object_];
33.}
34.
35.@end
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论