【iOS-Cocos2d遊戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!【2011年11月15日更新】

 李華明Himi 原創,轉載務必在明顯處註明:
轉載自 【黑米GameDev街區】 原文連接:  http://www.himigame.com/iphone-cocos2d/492.html


-------------【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代碼以下:

//
//  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

       OK,運行代碼便可,運行效果以下:

               

       能夠拖動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

搞定..






原文連接: http://blog.csdn.net/xiaominghimi/article/details/6897028
相關文章
相關標籤/搜索