2014年4月12日 星期六

[Cocos2d]簡單的射擊遊戲 for cocos2d v3

本篇的圖片,程式主要來源來自:
http://www.raywenderlich.com/zh-hans/18163/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8cocos2d%E5%88%B6%E4%BD%9C%E4%B8%80%E6%AC%BE%E7%AE%80%E5%8D%95%E7%9A%84iphone%E6%B8%B8%E6%88%8F-1

well,也許會覺得很奇怪,這個人家不是寫好了嘛,照著做一次有什麼好寫的。(更何況他還有中文頁面。)

我一開始練習的時候也是這麼想。
然後傻呼呼的去抓了最新的cocos2d的版本(v3),想說,新版是能差多少(挖鼻孔)

然後一開始.....就碰壁了,
這兩天利用零碎的時間研究了一下,靠腰,cocos2d v2->v3你也變太多了吧,這根本就是欺負人!  XD
首先光是取得視窗大小的部分就不一樣,
原本
CGSize winSize = [[CCDirector sharedDirector] winSize];

在v3 裡面,已經沒看到winSize 這個屬性,所以只能改用viewSize或者viewSizeInPixels(在Mac 底下這兩個是一樣的,Definition裡面有講。)
螢幕快照 2014 04 13 上午12 14 46

CGSize winSize = [[CCDirector sharedDirector] viewSize];

然後會比較困擾的部份應該是原本的 action的部份
原本的寫法:
id actionMove =  [ CCMoveTo actionWithDuration : actualDuration position : ccp ( - target.contentSize.width / 2 , actualY ) ] ; id actionMoveDone =  [ CCCallFuncN actionWithTarget : self selector : @selector ( spriteMoveFinished : ) ] ; [ target runAction : [ CCSequence actions : actionMove, actionMoveDone, nil ] ] ;

在v3 裡面,CCMoveTo/CCCallFuncN/CCSequence已死,有事燒紙。
分別改成CCActionMoveTo/CCActionCallBlock(從程式碼也可以很明顯看得出來寫法改用^{Block}的方式取代原本的@selector,私心以為這是讓一些簡單的動作更為直觀吧?)/ 
CCActionSequence
// Create the actions 
CCActionMoveTo * actionMove =  [[CCActionMoveTo alloc]initWithDuration:actualDuration position:ccp(-target.contentSize.width/2, actualY)];   
CCActionCallBlock * actionCallBack = [[CCActionCallBlock alloc] initWithBlock:^{       
[ self removeChild : target cleanup : YES ] ;       
[_targets removeObject:target];   
}];  

CCActionSequence *action = [CCActionSequence actions:actionMove,actionCallBack, nil];  
[target runAction:action];

然後原本touch的event的部份
也從
-  ( void ) ccTouchesEnded : ( NSSet  * ) touches withEvent : ( UIEvent * ) event {}
換成
 -(void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event{} 
 (不過這部份我只能猜是原生的touch event就夠用了,所以就不再另外繼承這樣。)
 
然後播音樂的部份,
 現在v3 好像也沒
#import "SimpleAudioEngine.h"
這個檔案,
查了一下發現現在是用
[[OALSimpleAudio sharedInstance] playBg:@"bgm.mp3" loop:YES];  //背景音樂
[[OALSimpleAudio sharedInstance] playEffect:@"se.mp3”];  //音效
這個來代替。

不過目前測試這個方式好像沒辦法順利播放.caf的檔案,望大德解惑。 XD

附上Github 原始碼:
https://github.com/coolthor/PracticeProject/tree/master/helloworld 

沒有留言 :

張貼留言