天天看點

本地通知

 李華明Himi 原創,轉載務必在明顯處注明:

轉載自【黑米GameDev街區】 原文連結: http://www.himigame.com/iphone-cocos2d/492.html

-------------【11月28日更新解決添加元件Cocos2d動畫停止播放的BUG】--------

【iOS-Cocos2d遊戲開發之七】在cocos2d中添加/删除系統元件,并解決View設定透明會影響View中的其他元件的問題【11月28日更新解決添加元件Cocos2d動畫停止播放的BUG】!

          首先申明下:希望大家轉載的時候不要忘記給原文連接配接,看到不少論壇轉載完全變成他們論壇自己原創了~ 請大家配合哈~謝謝~娃哈哈;

         本篇Himi為童鞋們介紹兩個常用的知識點:一個是在Cocos2d中添加UILocalNotification本地化通知,另外一個就是添加UIScrollViewiOS系統元件實作滾動字幕效果;

          對于UILocalNotification這個本地化通知功能實作比較簡單,用途很廣,最大的用途就是階段性的讓使用者回歸我們的應用中;那麼下面就直接上代碼:

          因為是添加到cocos2d引擎中,另一方面一般我們需要使用者進入我們應用後就開啟通知功能的;是以我們将代碼放在 AppDelegate.m 類中的applicationDidFinishLaunching中,代碼如下:

[cpp]  view plain copy

  1. - (void) applicationDidFinishLaunching:(UIApplication*)application  
  2. {  
  3.     ...  
  4.     application.applicationIconBadgeNumber = 0;//應用程式右上角的數字=0(消失)  
  5.     [[UIApplication sharedApplication] cancelAllLocalNotifications];//取消所有的通知  
  6.     //------通知;  
  7.     UILocalNotification *notification=[[UILocalNotification alloc] init];   
  8.     if (notification!=nil) {//判斷系統是否支援本地通知  
  9.         notification.fireDate=[NSDate dateWithTimeIntervalSinceNow:kCFCalendarUnitDay];//本次開啟立即執行的周期  
  10.         notification.repeatInterval=kCFCalendarUnitDay;//循環通知的周期  
  11.         notification.timeZone=[NSTimeZone defaultTimeZone];  
  12.         [email protected]"哇,我的女神,你怎了?";//彈出的提示資訊  
  13.         notification.applicationIconBadgeNumber=1; //應用程式的右上角小數字  
  14.         notification.soundName= UILocalNotificationDefaultSoundName;//本地化通知的聲音  
  15.         notification.alertAction = NSLocalizedString(@"營救女神!", nil);  //彈出的提示框按鈕  
  16.         [[UIApplication sharedApplication]   scheduleLocalNotification:notification];  
  17.     }   
  18.  ...  
  19. }  

           這裡Himi首先是将之前的所有通知都取消掉,防止開啟多個循環本地化通知,并且讓應用右上角的數字設定為0,這裡設定為0就相當與取消數字的顯示了;

           然後需要說明的是循環通知的周期,iOS提供如下一些周期:

[cpp]  view plain copy

  1. enum {  
  2.     kCFCalendarUnitEra = (1UL << 1),  
  3.     kCFCalendarUnitYear = (1UL << 2),  
  4.     kCFCalendarUnitMonth = (1UL << 3),  
  5.     kCFCalendarUnitDay = (1UL << 4),  
  6.     kCFCalendarUnitHour = (1UL << 5),  
  7.     kCFCalendarUnitMinute = (1UL << 6),  
  8.     kCFCalendarUnitSecond = (1UL << 7),  
  9.     kCFCalendarUnitWeek = (1UL << 8) ,  
  10.     kCFCalendarUnitWeekday = (1UL << 9),  
  11.     kCFCalendarUnitWeekdayOrdinal = (1UL << 10),  
  12. #if MAC_OS_X_VERSION_10_6 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED  
  13.     kCFCalendarUnitQuarter = (1UL << 11),  
  14. #endif  
  15. #if MAC_OS_X_VERSION_10_7 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED  
  16.     kCFCalendarUnitWeekOfMonth = (1UL << 12),  
  17.     kCFCalendarUnitWeekOfYear = (1UL << 13),  
  18.     kCFCalendarUnitYearForWeekOfYear = (1UL << 14),  
  19. #endif  
  20. };  

        下面是真機截圖:

本地通知
本地通知

          以上是在我真機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中如下代碼:

[cpp]  view plain copy

  1. @interface MyView : UIViewController<UIScrollViewDelegate>{  
  2.     IBOutlet UIScrollView *scrollView;  
  3. }  
  4. @property(nonatomic,retain)IBOutlet UIScrollView *scrollView;  
  5. @end  

  .h類中添加了一個UIScrollView并使用UIScrollViewDelegate協定,并IBOutlet出去,接着讓xib檔案中的UIScrollView元件連接配接此scrollView;

本地通知

          之後在MyView.m中添加如下代碼:

         1.添加一行如下代碼:

[cpp]  view plain copy

  1. @synthesize scrollView;  

         2.在- (void)viewDidLoad{}中添加如下代碼:

[cpp]  view plain copy

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     //滾動view   
  5.     scrollView.delegate = self;  
  6.     scrollView.scrollEnabled = YES;   
  7.     scrollView.contentSize = CGSizeMake(100, 249);//設定滾動的可視區域  
  8.     // Do any additional setup after loading the view from its nib.  
  9. }  

    整個MyView.m代碼如下:

[cpp]  view plain copy

  1. //  
  2. //  MyView.m  
  3. //  ScrollViewByHimi  
  4. //  
  5. //  Created by 華明 李 on 11-10-22.  
  6. //  Copyright (c) 2011年 __MyCompanyName__. All rights reserved.  
  7. //  
  8. #import "MyView.h"  
  9. @implementation MyView  
  10. @synthesize scrollView;  
  11. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
  12. {  
  13.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
  14.     if (self) {  
  15.         // Custom initialization  
  16.     }  
  17.     return self;  
  18. }  
  19. - (void)didReceiveMemoryWarning  
  20. {  
  21.     // Releases the view if it doesn't have a superview.  
  22.     [super didReceiveMemoryWarning];  
  23.     // Release any cached data, images, etc that aren't in use.  
  24. }  
  25. #pragma mark - View lifecycle  
  26. - (void)viewDidLoad  
  27. {  
  28.     [super viewDidLoad];  
  29.     //滾動view   
  30.     scrollView.delegate = self;  
  31.     scrollView.scrollEnabled = YES;   
  32.     scrollView.contentSize = CGSizeMake(100, 249);//設定滾動的可視區域  
  33.     // Do any additional setup after loading the view from its nib.  
  34. }  
  35. - (void)viewDidUnload  
  36. {  
  37.     [super viewDidUnload];  
  38.     // Release any retained subviews of the main view.  
  39.     // e.g. self.myOutlet = nil;  
  40. }  
  41. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  42. {  
  43.     // Return YES for supported orientations  
  44.     return (interfaceOrientation == UIInterfaceOrientationPortrait);  
  45. }  
  46. @end  

       OK,運作代碼即可,運作效果如下:

本地通知

       可以拖動ScrollView中的資料了,ScrollView預設顯示滾動條的,可以代碼設定隐藏也可以xib中對ScrollView屬性調整都可以;

             下面介紹如何讓ScrollView中的資料無限循環運動:

       首先在HelloWorldLayer.m種的init添加我們自定義view的下面設定一個選擇器:

[cpp]  view plain copy

  1. [self schedule:@selector(viewAddPointY) interval:0.03];//每0.03秒執行一次viewAddPointY方法  

      然後viewAddPointY方法是Himi自定義的函數,代碼如下:

[cpp]  view plain copy

  1. -(void)viewAddPointY{  
  2.     view.scrollView.contentOffset=ccpAdd(view.scrollView.contentOffset, ccp(0,0.5));//讓UIScrollView顯示内容每次慢慢向上移動0.5像素  
  3.     //view.scrollView.contentSize.height :得到UIScrollView的高度  
  4.     if(view.scrollView.contentOffset.y>=view.scrollView.contentSize.height){  
  5.         view.scrollView.contentOffset=ccp(0,-view.scrollView.frame.size.height);  
  6.     }  
  7. }  

    運作效果如下:

本地通知

      備注:我的Xcode是4.2用的模拟器是iOS5的模拟器,可能童鞋們按照我的這個教程運作後發現雖然UIScrollView中的資料滾動了但是沒有循環播放,這個是因為模拟器的問題,Himi真機測試無問題的~

      好了,最後我把 HelloWorldLayer.h 和HelloWorldLayer.m也完整放上來,省得有的童鞋不知道添加代碼的地方也友善童鞋們拷貝代碼;

HelloWorldLayer.h

[cpp]  view plain copy

  1. //  
  2. //  HelloWorldLayer.h  
  3. //  ScrollViewByHimi  
  4. //  
  5. //  Created by 華明 李 on 11-10-22.  
  6. //  Copyright __MyCompanyName__ 2011年. All rights reserved.  
  7. //  
  8. // When you import this file, you import all the cocos2d classes  
  9. #import "cocos2d.h"  
  10. #import "MyView.h"  
  11. // HelloWorldLayer  
  12. @interface HelloWorldLayer : CCLayer  
  13. {  
  14.     MyView *view;  
  15. }  
  16. // returns a CCScene that contains the HelloWorldLayer as the only child  
  17. +(CCScene *) scene;  
  18. @end  

HelloWorldLayer.m

[cpp]  view plain copy

  1. //  
  2. //  HelloWorldLayer.m  
  3. //  ScrollViewByHimi  
  4. //  
  5. //  Created by 華明 李 on 11-10-22.  
  6. //  Copyright __MyCompanyName__ 2011年. All rights reserved.  
  7. //  
  8. // Import the interfaces  
  9. #import "HelloWorldLayer.h"  
  10. #import "MyView.h"  
  11. // HelloWorldLayer implementation  
  12. @implementation HelloWorldLayer  
  13. +(CCScene *) scene  
  14. {   
  15.     CCScene *scene = [CCScene node];   
  16.     HelloWorldLayer *layer = [HelloWorldLayer node];   
  17.     [scene addChild: layer];   
  18.     return scene;  
  19. }  
  20. -(id) init  
  21. {   
  22.     if( (self=[super init])) {  
  23.         view= [[MyView alloc] initWithNibName:@"MyView" bundle:nil];    
  24.         [[[CCDirector sharedDirector] openGLView] addSubview:view.view];    
  25.         [self schedule:@selector(viewAddPointY) interval:0.03];//每0.03秒執行一次viewAddPointY方法  
  26.     }  
  27.     return self;  
  28. }  
  29. -(void)viewAddPointY{  
  30.     view.scrollView.contentOffset=ccpAdd(view.scrollView.contentOffset, ccp(0,0.5));//讓UIScrollView顯示内容每次慢慢向上移動0.5像素  
  31.     //view.scrollView.contentSize.height :得到UIScrollView的高度  
  32.     if(view.scrollView.contentOffset.y>=view.scrollView.contentSize.height){  
  33.         view.scrollView.contentOffset=ccp(0,-view.scrollView.frame.size.height);  
  34.     }  
  35. }  
  36. - (void) dealloc  
  37. {    
  38.     [super dealloc];  
  39. }  
  40. @end  

        OK,本篇結束;再次提醒下,希望大家轉載的時候不要忘記給原文連接配接,看到不少論壇轉載完全變成他們論壇自己原創了~ 請大家配合下哈~謝謝~

【2011年11月15日更新:】

 注意:有的童鞋使用系統的UIScrollView的時候出現如下問題:

       《因為嘗試了些coco2d寫的scrollview感覺效果都不太理想,是以打算用UIScrollView來實作一些功能的,可是遇到這樣一個棘手的問題,感覺整個cocos2d都停止了一樣,連顯示的FPS也停了,隻要scrollview一停止滑動,所有的動畫效果都立刻恢複了。。。請問有高人知道怎麼解決這個問題麼?感激不禁~》

解決方法如下:

[html]  view plain copy

  1. 0.99.5版本的..  
  2. 首先:在CCDirectorIOS.m 檔案中 第640行 找到以下注釋.  
  3. //  
  4. // If you want to attach the opengl view into UIScrollView  
  5. // uncomment this line to prevent 'freezing'. It doesn't work on  
  6. // with the Fast Director  
  7. //  
  8. // [[NSRunLoop currentRunLoop] addTimer:animationTimerforMode:NSRunLoopCommonModes];   <-去掉這行代碼注釋.  
  9. 第二.  
  10. 在 AppDelegate.m 檔案中找到.  
  11. if( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] )  <-注釋這一行  強制設定 CCDirector 為kCCDirectorTypeNSTimer類型.  
  12.     [CCDirector setDirectorType:kCCDirectorTypeNSTimer];<- 如果類型不是kCCDirectorTypeNSTimer,則設定類型為 kCCDirectorTypeNSTimer  
  13. 搞定..