天天看點

【Cocos2d遊戲開發之十六】添加本地通知(UILocalNotification)以及添加系統元件滾動視圖(UIScrollView)!

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

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

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

          因為是添加到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就相當與取消數字的顯示了;

           然後需要說明的是循環通知的周期,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),   

};   

下面是真機截圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201110/222733550.png"></a>

<a target="_blank" href="http://blog.51cto.com/attachment/201110/222929857.png"></a>

以上是在我真機iOS5系統上的測試效果,主界面中的展示效果以及通知欄内的通知效果,在iOS5之前都會出現類似彈出一個框,框中有你設定的按鈕名稱和提示文字~

         OK,這個知識點就不多說了,比較easy;下面介紹如何在cocos2d中添加UIScrollView;

        對于UIScrollView視圖,比較常用,Android也有此視圖,那麼它用途比較廣,最常用也是最容易想到的就是利用此功能實作遊戲中公司介紹、字幕滾動效果,那麼Himi就簡單的實作在cocos2d中利用UIScrollView添加一個無線循環滾動的小例子加以講解;

         首先我們建立一個cocos2d項目,然後添加顯示一個自定義的MyView(UIViewController)的視圖,并且在MyView.xib中添加了一些label和ScrollView元件中;

          如下圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201110/223019436.png"></a>

然後修改MyView.h,和MyView.m類,在MyView.h中如下代碼:

@interface MyView : UIViewController&lt;UIScrollViewDelegate&gt;{   

    IBOutlet UIScrollView *scrollView;   

@property(nonatomic,retain)IBOutlet UIScrollView *scrollView;   

@end  

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

<a target="_blank" href="http://blog.51cto.com/attachment/201110/223106383.png"></a>

  之後在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代碼如下:

//   

//  MyView.m   

//  ScrollViewByHimi   

//  Created by 華明 李 on 11-10-22.   

//  Copyright (c) 2011年 __MyCompanyName__. All rights reserved.   

#import "MyView.h"   

@implementation MyView   

- (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)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);   

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

<a target="_blank" href="http://blog.51cto.com/attachment/201110/223214335.png"></a>

可以拖動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&gt;=view.scrollView.contentSize.height){   

        view.scrollView.contentOffset=ccp(0,-view.scrollView.frame.size.height);   

運作效果如下:

<a target="_blank" href="http://blog.51cto.com/attachment/201110/223327399.png"></a>

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

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

HelloWorldLayer.h

//  HelloWorldLayer.h   

//  Copyright __MyCompanyName__ 2011年. All rights reserved.   

// When you import this file, you import all the cocos2d classes   

#import "cocos2d.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   

// Import the interfaces   

#import "HelloWorldLayer.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方法   

- (void) dealloc   

{     

    [super dealloc];   

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

本文轉自 xiaominghimi 51CTO部落格,原文連結:http://blog.51cto.com/xiaominghimi/695313,如需轉載請自行聯系原作者

繼續閱讀