-------------【11月28日更新解決添加組件Cocos2d動畫中止播放的BUG】--------css
【iOS-Cocos2d遊戲開發之七】在cocos2d中添加/刪除系統組件,並解決View設置透明會影響View中的其餘組件的問題【11月28日更新解決添加組件Cocos2d動畫中止播放的BUG】!
html
首先申明下:但願你們轉載的時候不要忘記給原文鏈接,看到很多論壇轉載徹底變成他們論壇本身原創了~ 請你們配合哈~謝謝~娃哈哈;
node
本篇Himi爲童鞋們介紹兩個經常使用的知識點:一個是在Cocos2d中添加UILocalNotification本地化通知,另一個就是添加UIScrollViewiOS系統組件實現滾動字幕效果;app
對於UILocalNotification這個本地化通知功能實現比較簡單,用途很廣,最大的用途就是階段性的讓用戶迴歸咱們的應用中;那麼下面就直接上代碼:iphone
由於是添加到cocos2d引擎中,另外一方面通常咱們須要用戶進入咱們應用後就開啓通知功能的;因此咱們將代碼放在 AppDelegate.m 類中的applicationDidFinishLaunching中,代碼以下:函數
- (void) applicationDidFinishLaunching:(UIApplication*)application { ... application.applicationIconBadgeNumber = 0;//應用程序右上角的數字=0(消失) [[UIApplication sharedApplication] cancelAllLocalNotifications];//取消全部的通知 //------通知; UILocalNotification *notification=[[UILocalNotification alloc] init]; if (notification!=nil) {//判斷系統是否支持本地通知 notification.fireDate=[NSDate dateWithTimeIntervalSinceNow:kCFCalendarUnitDay];//本次開啓當即執行的週期 notification.repeatInterval=kCFCalendarUnitDay;//循環通知的週期 notification.timeZone=[NSTimeZone defaultTimeZone]; notification.alertBody=@"哇,個人女神,你怎了?";//彈出的提示信息 notification.applicationIconBadgeNumber=1; //應用程序的右上角小數字 notification.soundName= UILocalNotificationDefaultSoundName;//本地化通知的聲音 notification.alertAction = NSLocalizedString(@"營救女神!", nil); //彈出的提示框按鈕 [[UIApplication sharedApplication] scheduleLocalNotification:notification]; } ... }
這裏Himi首先是將以前的全部通知都取消掉,防止開啓多個循環本地化通知,而且讓應用右上角的數字設置爲0,這裏設置爲0就至關與取消數字的顯示了;oop
而後須要說明的是循環通知的週期,iOS提供以下一些週期:學習
enum { kCFCalendarUnitEra = (1UL << 1), kCFCalendarUnitYear = (1UL << 2), kCFCalendarUnitMonth = (1UL << 3), kCFCalendarUnitDay = (1UL << 4), kCFCalendarUnitHour = (1UL << 5), kCFCalendarUnitMinute = (1UL << 6), kCFCalendarUnitSecond = (1UL << 7), kCFCalendarUnitWeek = (1UL << 8) /* CF_DEPRECATED(10_4, 10_7, 2_0, 5_0) */, kCFCalendarUnitWeekday = (1UL << 9), kCFCalendarUnitWeekdayOrdinal = (1UL << 10), #if MAC_OS_X_VERSION_10_6 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED kCFCalendarUnitQuarter = (1UL << 11), #endif #if MAC_OS_X_VERSION_10_7 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED kCFCalendarUnitWeekOfMonth = (1UL << 12), kCFCalendarUnitWeekOfYear = (1UL << 13), kCFCalendarUnitYearForWeekOfYear = (1UL << 14), #endif };下面是真機截圖:
以上是在我真機iOS5系統上的測試效果,主界面中的展現效果以及通知欄內的通知效果,在iOS5以前都會出現相似彈出一個框,框中有你設置的按鈕名稱和提示文字~測試
OK,這個知識點就很少說了,比較easy;下面介紹如何在cocos2d中添加UIScrollView;動畫
對於UIScrollView視圖,比較經常使用,Android也有此視圖,那麼它用途比較廣,最經常使用也是最容易想到的就是利用此功能實現遊戲中公司介紹、字幕滾動效果,那麼Himi就簡單的實如今cocos2d中利用UIScrollView添加一個無線循環滾動的小例子加以講解;
注意:對於還不知道如何在cocos2d中添加系統組建的童鞋請移步到《【Cocos2d遊戲開發之七】在cocos2d中添加/刪除系統組件,並解決View設置透明會影響View中的其餘組件的問題!》此貼學習先,下面開始添加:
首先咱們新建一個cocos2d項目,而後添加顯示一個自定義的MyView(UIViewController)的視圖,而且在MyView.xib中添加了一些label和ScrollView組件中;
以下圖:
而後修改MyView.h,和MyView.m類,在MyView.h中以下代碼:
@interface MyView : UIViewController<UIScrollViewDelegate>{ IBOutlet UIScrollView *scrollView; } @property(nonatomic,retain)IBOutlet UIScrollView *scrollView; @end
.h類中添加了一個UIScrollView並使用UIScrollViewDelegate協議,並IBOutlet出去,接着讓xib文件中的UIScrollView組件鏈接此scrollView;
以後在MyView.m中添加以下代碼:
1.添加一行以下代碼:
@synthesize scrollView;2.在- (void)viewDidLoad{}中添加以下代碼:
- (void)viewDidLoad { [super viewDidLoad]; //滾動view scrollView.delegate = self; scrollView.scrollEnabled = YES; scrollView.contentSize = CGSizeMake(100, 249);//設置滾動的可視區域 // Do any additional setup after loading the view from its nib. }
// // MyView.m // ScrollViewByHimi // // Created by 華明 李 on 11-10-22. // Copyright (c) 2011年 __MyCompanyName__. All rights reserved. // #import "MyView.h" @implementation MyView @synthesize scrollView; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; //滾動view scrollView.delegate = self; scrollView.scrollEnabled = YES; scrollView.contentSize = CGSizeMake(100, 249);//設置滾動的可視區域 // Do any additional setup after loading the view from its nib. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } @end
能夠拖動ScrollView中的數據了,ScrollView默認顯示滾動條的,能夠代碼設置隱藏也能夠xib中對ScrollView屬性調整均可以;
下面介紹如何讓ScrollView中的數據無限循環運動:
首先在HelloWorldLayer.m種的init添加咱們自定義view的下面設置一個選擇器:
[self schedule:@selector(viewAddPointY) interval:0.03];//每0.03秒執行一次viewAddPointY方法而後viewAddPointY方法是Himi自定義的函數,代碼以下:
-(void)viewAddPointY{ view.scrollView.contentOffset=ccpAdd(view.scrollView.contentOffset, ccp(0,0.5));//讓UIScrollView顯示內容每次慢慢向上移動0.5像素 //view.scrollView.contentSize.height :獲得UIScrollView的高度 if(view.scrollView.contentOffset.y>=view.scrollView.contentSize.height){ view.scrollView.contentOffset=ccp(0,-view.scrollView.frame.size.height); } }
備註:個人Xcode是4.2用的模擬器是iOS5的模擬器,可能童鞋們按照個人這個教程運行後發現雖然UIScrollView中的數據滾動了可是沒有循環播放,這個是由於模擬器的問題,Himi真機測試無問題的~
好了,最後我把 HelloWorldLayer.h 和HelloWorldLayer.m也完整放上來,免得有的童鞋不知道添加代碼的地方也方便童鞋們拷貝代碼;
HelloWorldLayer.h
// // HelloWorldLayer.h // ScrollViewByHimi // // Created by 華明 李 on 11-10-22. // Copyright __MyCompanyName__ 2011年. All rights reserved. // // When you import this file, you import all the cocos2d classes #import "cocos2d.h" #import "MyView.h" // HelloWorldLayer @interface HelloWorldLayer : CCLayer { MyView *view; } // returns a CCScene that contains the HelloWorldLayer as the only child +(CCScene *) scene; @end
HelloWorldLayer.m
// // HelloWorldLayer.m // ScrollViewByHimi // // Created by 華明 李 on 11-10-22. // Copyright __MyCompanyName__ 2011年. All rights reserved. // // Import the interfaces #import "HelloWorldLayer.h" #import "MyView.h" // HelloWorldLayer implementation @implementation HelloWorldLayer +(CCScene *) scene { CCScene *scene = [CCScene node]; HelloWorldLayer *layer = [HelloWorldLayer node]; [scene addChild: layer]; return scene; } -(id) init { if( (self=[super init])) { view= [[MyView alloc] initWithNibName:@"MyView" bundle:nil]; [[[CCDirector sharedDirector] openGLView] addSubview:view.view]; [self schedule:@selector(viewAddPointY) interval:0.03];//每0.03秒執行一次viewAddPointY方法 } return self; } -(void)viewAddPointY{ view.scrollView.contentOffset=ccpAdd(view.scrollView.contentOffset, ccp(0,0.5));//讓UIScrollView顯示內容每次慢慢向上移動0.5像素 //view.scrollView.contentSize.height :獲得UIScrollView的高度 if(view.scrollView.contentOffset.y>=view.scrollView.contentSize.height){ view.scrollView.contentOffset=ccp(0,-view.scrollView.frame.size.height); } } - (void) dealloc { [super dealloc]; } @end
OK,本篇結束;再次提醒下,但願你們轉載的時候不要忘記給原文鏈接,看到很多論壇轉載徹底變成他們論壇本身原創了~ 請你們配合下哈~謝謝~
【2011年11月15日更新:】
注意:有的童鞋使用系統的UIScrollView的時候出現以下問題:
《由於嘗試了些coco2d寫的scrollview感受效果都不太理想,因此打算用UIScrollView來實現一些功能的,但是遇到這樣一個棘手的問題,感受整個cocos2d都中止了同樣,連顯示的FPS也停了,只要scrollview一中止滑動,全部的動畫效果都馬上恢復了。。。請問有高人知道怎麼解決這個問題麼?感激不由~》
解決方法以下:
0.99.5版本的.. 首先:在CCDirectorIOS.m 文件中 第640行 找到如下注釋. // // If you want to attach the opengl view into UIScrollView // uncomment this line to prevent 'freezing'. It doesn't work on // with the Fast Director // // [[NSRunLoop currentRunLoop] addTimer:animationTimerforMode:NSRunLoopCommonModes]; <-去掉這行代碼註釋. 第二. 在 AppDelegate.m 文件中找到. if( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] ) <-註釋這一行 強制設置 CCDirector 爲kCCDirectorTypeNSTimer類型. [CCDirector setDirectorType:kCCDirectorTypeNSTimer];<- 若是類型不是kCCDirectorTypeNSTimer,則設置類型爲 kCCDirectorTypeNSTimer 搞定..