您的位置:首页 > 移动开发 > Cocos引擎

cocos2d里的各种动作(转载)

2011-04-29 16:29 423 查看
通常调用某个动作的方法:

1
//创建动作
2
id
actionTo=[CCMoveToactionWithDuration:2position:ccp(s.width-40,s.height-40)];
3
4
//使用动作。(说明:tamara是一个CCSprite。)
5
[tamararunAction:actionTo];
瞬时动作

顾名思义。瞬时动作就是不需要时间,马上就完成的动作。瞬时动作的共同基类是InstantAction。

放置–Place

效果类似于node.Position=ccp(x,y)。之所以作为一个动作来实现是为了可以与其他动作形成一个连续动作。

示例:

1
-(
void
)OnPlaceMenue:(
id
)sender{
2
CGSizes=[[CCDirectorsharedDirector]winSize];
3
CGPointp=ccp(CCRANDOM_0_1()*s.width,CCRANDOM_0_1()*s.height);
4
[spriterunAction:[CCPlaceactionWithPosition:p]];
5
}
隐藏–Hide

效果类似于[nodesetVisible:NO].

示例:




1
-(
void
)OnHideMenue:(
id
)sender{
2
[spriterunAction:[CCHideaction]];
3
}
显示–Show

效果类似于[nodesetVisible:YES].

示例:




1
-(
void
)OnShowMenue:(
id
)sender{
2
[spriterunAction:[CCShowaction]];
3
}
可见切换–ToggleVisibility

代码如下:




1
-(
void
)OnToggleMenue:(
id
)sender{
2
[spriterunAction:[CCToggleVisibilityaction]];
3
}
[b]延时动作[/b]

延时动作就是动作的完成需要一定时间。因此,actionWithDuration是延时动作执行时的第一个参数,延时动作的共同基类是CCIntervalAction。

函数的命名规则:

***To:意味着运动到指定的位置。

***By:意味着运动到按照指定癿x、y增量的位置。(x、y可以是负值)

移动到–CCMoveTo

[b]移动–CCMoveBy[/b]

跳跃到–CCJumpTo

设置终点位置和跳跃癿高度和次数。

跳跃–CCJumpBy

设置终点位置和跳跃癿高度和次数。

贝塞尔–CCBezierBy

支持3次贝塞尔曲线:P0-起点,P1-起点切线方向,P2-终点切线方向,P3-终点。



首先设置定Bezier参数,然后执行。

放大到–CCScaleTo

设置放大倍数,是浮点型。

放大–CCScaleBy

旋转到–CCRotateTo

旋转–CCRotateBy

闪烁–CCBlink

设定闪烁次数

色调变化到–CCTintTo

色调变换–CCTintBy

变暗到–CCFadeTo

由无变亮–CCFadeIn

由亮变无–CCFadeOut

[b]组合动作[/b]

按照一定的次序将上述基本动作组合起来,形成连贯的一套组合动作。组合动作包括以下几类:

序列–CCSequence

主要作用就是线序排列若干个动作,然后按先后次序逐个执行。




01
-(
void
)OnSequence:(
id
)sender{
02
CGSizes=[[CCDirectorsharedDirector]winSize];
03
CGPointp=ccp(s.width/2,50);
04
//创建5个动作
05
id
ac0=[spriterunAction:[CCPlaceactionWithPosition:p]];
06
id
ac1=[CCMoveToactionWithDuration:2position:ccp(s.width-50,s.height-50)];
07
id
ac2=[CCJumpToactionWithDuration:2position:ccp(150,50)height:30jumps:5];
08
id
ac3=[CCBlinkactionWithDuration:2blinks:3];
09
id
ac4=[CCTintByactionWithDuration:0.5red:0green:255blue:255];
10
//将5个动作组合为一个序列,注意不要忘了用nil结尾。
11
[spriterunAction:[CCSequenceactions:ac0,ac1,ac2,ac3,ac4,ac0,
nil
]];
12
}
同步–SpawnSpawn

作用就是同时并列执行若干个动作,但要求动作都必须是可以同时执行的。比如:移动式翻转、变色、变大小等。

需要特别注意的是,同步执行最后的完成时间由基本动作中用时最大者决定。




01
-(
void
)OnSpawn:(
id
)sender{
02
CGSizes=[[CCDirectorsharedDirector]winSize];
03
CGPointp=ccp(s.width/2,50);
04
sprite.rotation=0;
05
[spritesetPosition:p];
06
//创建4个需要并行的动作,确保动作用时可组合。2–2-(1+1)
07
id
ac1=[CCMoveToactionWithDuration:2position:ccp(s.width-50,s.height-50)];
08
id
ac2=[CCRotateToactionWithDuration:2angle:180];
09
id
ac3=[CCScaleToactionWithDuration:1scale:4];
10
id
ac4=[CCScaleByactionWithDuration:1scale:0.5];
11
id
seq=[CCSequenceactions:ac3,ac4,
nil
];
12
//同步动作和组合动作以形成一个连续的新动作。
13
[spriterunAction:[CCSpawnactions:ac1,ac2,seq,
nil
]];
14
重复有限次数–Repeate

重复有限的次数的动作示例代码如下:

viewsourceprint?

01
-(
void
)OnRepeat:(
id
)sender{
02
CGSizes=[[CCDirectorsharedDirector]winSize];
03
CGPointp=ccp(s.width/2,50);
04
sprite.rotation=0;
05
[spritesetPosition:p];
06
//创建动作序列
07
id
ac1=[CCMoveToactionWithDuration:2position:ccp(s.width-50,s.height-50)];
08
id
ac2=[CCJumpByactionWithDuration:2position:ccp(-400,-200)height:30jumps:5];
09
id
ac3=[CCJumpByactionWithDuration:2position:ccp(s.width/2,0)height:20jumps:3];
10
id
seq=[CCSequenceactions:ac1,ac2,ac3,
nil
];
11
//重复运行上述劢作序列3次。
12
[spriterunAction:[CCRepeatactionWithAction:seqtimes:3]];
13
}
反动作–Reverse

反动作就是反向(逆向)执行某个动作,支持针对动作序列的反动作序列。反动作不是一个专门的类,而是CCFiniteAction引入的一个接口。不是所有的类都支持反动作,XxxxTo类通常不支持反动作,XxxxBy类通常支持。示例如下:

viewsourceprint?

01
-(
void
)OnReverse:(
id
)sender{
02
CGSizes=[[CCDirectorsharedDirector]winSize];
03
CGPointp=ccp(s.width/2,50);
04
sprite.rotation=0;
05
[spritesetPosition:p];
06
id
ac1=[CCMoveByactionWithDuration:2position:ccp(190,220)];
07
//创建某个劢作癿反劢作。
08
id
ac2=[ac1reverse];
09
[spriterunAction:[CCRepeatactionWithAction:[CCSequenceactions:ac1,ac2,
nil
]times:2]];
10
}
动画–Animation

动画就是让精灵自身的连续执行一段影像,形成模拟运动的效果:行走时动精灵状态、打斗时的状态等。

viewsourceprint?

01
-(
void
)OnAnimation:(
id
)sender{
02
CCAnimation*animation=[AtlasAnimationanimationWithName:@
"flight"
delay:0.2f];
03
//每帧的内容定义。
04
for
(
int
i=0;i<3;i++){
05
int
x=i%3;
06
[animationaddFrameWithRect:CGRectMake(x*32,0,31,30)];
07
}
08
//执行劢画效果
09
id
action=[CCAnimateactionWithAnimation:animation];
10
[spriterunAction:[CCRepeatactionWithAction:actiontimes:10]];
11
}
无限重复–RepeatForever

RepeatForever是从Action类直接派生的,因此无法参于序列和同步;自身也无法反向执行。该类的作用就是无限期执行某个动作或动作序列,直到被停止。

viewsourceprint?

01
-(
void
)OnRepeatForever:(
id
)sender{
02
CGSizes=[[DirectorsharedDirector]winSize];
03
CGPointp=ccp(100,50);
04
//飞行喷火模拟劢画
05
CCAnimation*animation=[CCAnimationanimationWithName:@
"flight"
delay:0.1f];
06
for
(
int
i=0;i<3;i++)
07
{
08
int
x=i%3;
09
[animationaddFrameWithRect:CGRectMake(x*32,0,31,30)];
10
}
11
id
action=[CCAnimateactionWithAnimation:animation];
12
//将该动画作为精灵的本征动画,一直运行。
13
[spriterunAction:[RepeatForeveractionWithAction:action]];
14
//在创建第二个连续无限期动作序列。叠加二者形成完整效果。
15
ccBezierConfigbezier;
16
sprite.rotation=0;
17
[spritesetPosition:p];
18
bezier.startPosition=ccp(0,0);
19
bezier.controlPoint_1=ccp(0,s.height/2);
20
bezier.controlPoint_2=ccp(300,-s.height/2);
21
bezier.endPosition=ccp(300,100);
22
id
ac10=[CCBezierByactionWithDuration:3bezier:bezier];
23
id
ac11=[CCTintByactionWithDuration:0.5red:0green:255blue:255];
24
id
ac1=[CCSpawnactions:ac10,[RepeatactionWithAction:ac11times:4],
nil
];
25
id
ac2=[CCSpawnactions:[ac10reverse],[CCRepeatactionWithAction:ac11times:4],
nil
];
26
//第二个无限期连续运劢。
27
[spriterunAction:[CCRepeatForeveractionWithAction:[CCSequenceactions:ac1,ac2,
nil
]]];
28
}
[b]速度变化[/b]

基本动作和组合动作实现了针对精灵的各种运动、动画效果的改变,但这样的改变的速度是不变的,通过CCEaseAction为基类的类系和CCSpeed类我们可以很方便的修改精灵执行动作的速度:由快至慢还是由慢至快

EaseIn由慢至快。

EaseOut由快至慢

EaseInOut由慢至快再由快至慢。

EaseSineIn由慢至快

EaseSineOut由快至慢

EaseSineInOut由慢至快再由快至慢。

EaseExponentialIn由慢至极快。

EaseExponentialOut由极快至慢。

EaseExponentialInOut由慢至极快再由极快至慢。

Speed人工设定速度,还可通过SetSpeed不断调整。

[b]扩展动作[/b]

我们已经掌握了执行各种各样的动作,也可以按照不同的快慢修改动作执行的时间,Cocos2D-iPhone还提供了针对现有动作的扩展,以实现各种灵活的效果。

延时动作–Delay

在动作序列中增加一个时间间歇:

viewsourceprint?

1
-(
void
)OnDelay:(
id
)sender{
2
id
ac1=[CCMoveByactionWithDuration:2position:ccp(200,200)];
3
id
ac2=[ac1reverse];
4
//实现一个等待间歇
5
[spriterunAction:[Sequenceactions:ac1,[DelayTimeactionWithDuration:1],ac2,
nil
]];
6
}
函数调用函数

在动作序列中间或者结束调用某个函数,执行任何需要执行的任务:动作、状态修改等。代码如下:

viewsourceprint?

1
-(
void
)OnCallFunc:(
id
)sender{
2
id
ac1=[CCMoveByactionWithDuration:2position:ccp(200,200)];
3
id
ac2=[ac1reverse];
4
id
acf=[CCCallFuncactionWithTarget:
self
selector:
@selector
(CallBack1)];
5
[spriterunAction:[CCSequenceactions:ac1,acf,ac2,
nil
]];
6
}
对应的函数为:(再做一个动作,这就实现了动作、动作序列的任意扩展和连接)

viewsourceprint?

1
-(
void
)CallBack1{
2
[spriterunAction:[CCTintByactionWithDuration:0.5red:255green:0blue:255]];
3
}
带对象参数调用自定义函数时,传递当前对象。

viewsourceprint?

1
-(
void
)OnCallFuncN:(
id
)sender{
2
id
ac1=[CCMoveByactionWithDuration:2position:ccp(200,200)];
3
id
ac2=[ac1reverse];
4
id
acf=[CallFuncNactionWithTarget:
self
selector:
@selector
(CallBack2:)];
5
[spriterunAction:[CCSequenceactions:ac1,acf,ac2,
nil
]];
6
}
对应的自定义函数:(这里,我们直接使用了该对象)

viewsourceprint?

1
-(
void
)CallBack2:(
id
)sender{
2
[senderrunAction:[CCTintByactionWithDuration:1red:255green:0blue:255]];
3
}
带对象、数据参数调用自定义函数时,传递当前对象和一个常量(也可以是指针)。

viewsourceprint?

1
-(
void
)OnCallFuncND:(
id
)sender{
2
id
ac1=[CCMoveByactionWithDuration:2position:ccp(200,200)];
3
id
ac2=[ac1reverse];
4
id
acf=[CCCallFuncNDactionWithTarget:
self
selector:
@selector
(CallBack3:data:)data:(
void
*)2];
5
[spriterunAction:[CCSequenceactions:ac1,acf,ac2,
nil
]];
6
}
对应的自定义函数,我们使用了传递的对象和数据:

viewsourceprint?

1
-(
void
)CallBack3:(
id
)senderdata:(
void
*)data{
2
[senderrunAction:[CCTintByactionWithDuration:(
NSInteger
)datared:255green:0blue:255]];}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: