如果我们想实现让CCSprite进行抛物线运动的话,那么我想童鞋们首先会想到利用Box2d或者其他物理引擎去为CCSprite创建物理世界中对应的刚体进行实现,但是反过来想,对于不熟悉Box2d或者其他物理引擎的童鞋,肯定不方便,那么Himi今天为大家介绍另外一种不实用物理引擎实现CCSprite抛物线方式;
之前在Android上我也有讲解过贝塞尔曲线的博文,但是Android中不同于cocos2d封装这个,在cocos2d中的Bezier是封装为了精灵动作,让精灵按照贝塞尔曲线的路线去运动;那么以上封装的代码中对于抛物线运动来说最重要的一点就是创建贝塞尔曲线的第二个点,这个点控制着精灵路径的所经过的最高点,这里务必要知道;
- // 抛物线 -Himi
- //mSprite:需要做抛物线的精灵
- //startPoint:起始位置
- //endPoint:中止位置
- //dirTime:起始位置到中止位置的所需时间
- - (void) moveWithParabola:(CCSprite*)mSprite startP:(CGPoint)startPoint endP:(CGPoint)endPoint dirTime:(float)time{
- float sx = startPoint.x;
- float sy = startPoint.y;
- float ex =endPoint.x+50;
- float ey =endPoint.y+150;
- int h = [mSprite contentSize].height*0.5;
- ccBezierConfig bezier; // 创建贝塞尔曲线
- bezier.controlPoint_1 = ccp(sx, sy); // 起始点
- bezier.controlPoint_2 = ccp(sx+(ex-sx)*0.5, sy+(ey-sy)*0.5+200); //控制点
- bezier.endPosition = ccp(endPoint.x-30, endPoint.y+h); // 结束位置
- CCBezierTo *actionMove = [CCBezierTo actionWithDuration:time bezier:bezier];
- [mSprite runAction:actionMove];
- }
之前在Android上我也有讲解过贝塞尔曲线的博文,但是Android中不同于cocos2d封装这个,在cocos2d中的Bezier是封装为了精灵动作,让精灵按照贝塞尔曲线的路线去运动;那么以上封装的代码中对于抛物线运动来说最重要的一点就是创建贝塞尔曲线的第二个点,这个点控制着精灵路径的所经过的最高点,这里务必要知道;
这种实现方式虽然没有物理系统对刚体施加力来的真实,但是!我想这段代码的实用性还是很大的,至少不需要使用box2d引擎相关知识,最重要的优点是不会存在上一章介绍的代码混编带来的编译错误~
- // 抛物线运动并同时旋转 -Himi
- //mSprite:需要做抛物线的精灵
- //startPoint:起始位置
- //endPoint:中止位置
- //startA:起始角度
- //endA:中止角度
- //dirTime:起始位置到中止位置的所需时间
- - (void) moveWithParabola:(CCSprite*)mSprite startP:(CGPoint)startPoint endP:(CGPoint)endPoint startA:(float)startAngle endA:(float)endAngle dirTime:(float)time{
- float sx = startPoint.x;
- float sy = startPoint.y;
- float ex =endPoint.x+50;
- float ey =endPoint.y+150;
- int h = [mSprite contentSize].height*0.5;
- //设置精灵的起始角度
- sprite.rotation=startAngle;
- ccBezierConfig bezier; // 创建贝塞尔曲线
- bezier.controlPoint_1 = ccp(sx, sy); // 起始点
- bezier.controlPoint_2 = ccp(sx+(ex-sx)*0.5, sy+(ey-sy)*0.5+200); //控制点
- bezier.endPosition = ccp(endPoint.x-30, endPoint.y+h); // 结束位置
- CCBezierTo *actionMove = [CCBezierTo actionWithDuration:time bezier:bezier];
- //创建精灵旋转的动作
- CCRotateTo *actionRotate =[CCRotateTo actionWithDuration:time angle:endAngle];
- //将两个动作封装成一个同时播放进行的动作
- CCAction * action = [CCSpawn actions:actionMove, actionRotate, nil];
- [mSprite runAction:action];
- }