【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!

jopen 14年前發布 | 28K 次閱讀 IOS 游戲開發

原文地址:http://blog.csdn.net/xiaominghimi/article/details/6779873

如果我們想實現讓CCSprite進行拋物線運動的話,那么我想童鞋們首先會想到利用Box2d或者其他物理引擎去為CCSprite創建物理世界中對應的剛體進行實現,但是反過來想,對于不熟悉Box2d或者其他物理引擎的童鞋,肯定不方便,那么Himi今天為大家介紹另外一種不實用物理引擎實現 CCSprite拋物線方式;

這里我直接將封裝好的方法貼上來,注釋都在代碼中了:

//  拋物線    -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引擎相關知識,最重要的優點是不會存在上一章介紹的代碼混編帶來的編譯錯誤~

//----  OK,下面來介紹第二個知識點:

很多童鞋學習cocos2d,一般不經常更新的動畫,會使用cocos2d封裝的動作,例如旋轉、漸變、位移等等,那么一旦使用動作后,肯定就有需要兩個動作一起播放的需求,那么基本上童鞋們大腦中第一閃現的就是利用cocos2d的動作序列  CCSequence,但是效果不理想,原因很簡單,因為顧名思義,既然是動作序列,那就是按照動作的順序一個動作一個動作的進行播放,也就是說利用動作序列只能達到連續播放動作,無法同時播放動作的目的;

那么在這里給大家一個方法能讓兩個動作同時播放的方法:

 這里為了講解方便,我在剛才封裝的貝塞爾曲線上的方法上進行修改,添加一個旋轉的動作,讓貝塞爾曲線運動與旋轉動作同時播放,這里Himi使用一根“矛”的圖片作用示意圖來說明,因為矛與箭的運動方式最常用的動作肯定是一邊旋轉一邊拋物線位移,這樣才更加真實;

OK,看下封裝角度后的拋物線并同時旋轉方法如下:

//  拋物線運動并同時旋轉    -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];
}

附上運行效果圖:

  【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!

左側的矛是起始位置,后側的是拋物線與旋轉兩個動作同時進行運動中的矛~

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!