【IOS-COCOS2D游戏开发之十六】添加本地通知(UILOCALNOTIFICATION)以及添加系统组件滚动视图(UISCROLLVIEW)!

本站文章均为 李华明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中,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

- (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提供如下一些周期:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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中添加系统组建的童鞋请移步到《【iOS-Cocos2d游戏开发之七】在cocos2d中添加/删除系统组件,并解决View设置透明会影响View中的其他组件的问题!【11月28日更新解决添加组件Cocos2d动画停止播放的BUG】》此贴学习先,下面开始添加:

首先我们新建一个cocos2d项目,然后添加显示一个自定义的MyView(UIViewController)的视图,并且在MyView.xib中添加了一些label和ScrollView组件中;

如下图:

然后修改MyView.h,和MyView.m类,在MyView.h中如下代码:

1

2

3

4

5

@interface MyView : UIViewController<UIScrollViewDelegate>{

    IBOutlet UIScrollView *scrollView;

}

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

@end

.h类中添加了一个UIScrollView并使用UIScrollViewDelegate协议,并IBOutlet出去,接着让xib文件中的UIScrollView组件连接此scrollView;

之后在MyView.m中添加如下代码:

1.添加一行如下代码:

1

@synthesize scrollView;

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

1

2

3

4

5

6

7

8

9

- (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代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

//

//  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的下面设置一个选择器:

1

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

然后viewAddPointY方法是Himi自定义的函数,代码如下:

1

2

3

4

5

6

7

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

//

//  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一停止滑动,所有的动画效果都立刻恢复了。。。》

解决方法如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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  

 

搞定..

时间: 2024-10-26 18:55:16

【IOS-COCOS2D游戏开发之十六】添加本地通知(UILOCALNOTIFICATION)以及添加系统组件滚动视图(UISCROLLVIEW)!的相关文章

【ANDROID游戏开发二十六】追加简述SURFACEVIEW 与 GLSURFACEVIEW效率!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/388.html 今天在这里大概说下现在为什么游戏引擎都趋向与openGL进行的,这里大概说下: 当今基本所有的国外游戏都是质量很好,不管是从视觉上还是操作还是流畅度上,那么今天我们关注的是其流畅度: 首先有经验的游戏开发者,尤其是一直做2D游戏开发的童鞋门,从J2me到Android,很多做Android的都是从J

【IOS-COCOS2D-X 游戏开发之十六】配置你的COCOS2DX项目编译后的ANDROID自动使用(-HD)高清图&设置ANDROID自适应屏幕、缩放比例方法!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/799.html 本篇主要介绍Cocos2dx项目开发过程中或者说项目务必遇到的一些知识点(ps.貌似Himi博客写的都是务必的 :tx:  Himi认为写别人没写的才更容易吸引人不是-) OK,不多说废话,第一个介绍的是修改项目配置让你的Android项目支持自适应屏幕:其实关于Android项目自适应屏幕这个问题

【IOS-COCOS2D-X 游戏开发之十二】自定义COCOS2DX摇杆(增强JOYSTICK),增加摇杆跟随用户触点作为摇杆坐标,让摇杆不再死板!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/721.html 对于虚拟摇杆在游戏开发中必不可少,Android方面的是由Himi自己实现封装的,大家可以移步到这里查看详细实现机制: [Android游戏开发二十四]360°平滑游戏摇杆(触屏方向导航)  那么在Cocos2d引擎已提供此摇杆类(Joystick),所以Himi也就懒得重写了,但是Cocos

Windows 8风格应用开发入门 十六 SettingContract原理及构建

Setting Contract概述 1) Setting Contract在当前的应用中提供了快速.上下文相关的沉浸式的设置访问体验: 2) Setting Contract始终是可用的: 3) 设置包括始终可用的系统设置.让用户可以控制应用对系统设备和功能的访问的系统代理设置.以及当前应用程序指定的设置: 我们可以从屏幕右边缘轻扫划出超级按钮,选择"设置"显示设置窗口.设置窗口中既包括应用设置又包括系统设置. 开发入门 十六 SettingContract原理及构建-十六届四中全会

【IOS-COCOS2D-X 游戏开发之十五】COCOS2DX中响应ANDROID的BACK(返回)与MENU(小房子)事件&&COCOS2DX自动释放粒子内存函数!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/792.html 本篇介绍两个常用知识,一个是粒子的自动释放机制函数,因为不少童鞋说cocos2dx为什么没有? 其实是没找到,这里特意拿出来说下!另外一个是如何响应Android的Menu菜单和Back返回事件的方法: 首先对于Cocos2dx中对于粒子自动释放的函数Himi这里给出,不少童鞋都在群里或者论坛

推送通知-ios 应用进入后台后每小时查数据库并添加本地通知(UILocalNotification)

问题描述 ios 应用进入后台后每小时查数据库并添加本地通知(UILocalNotification) 项目现在需要实现一个应用进入后台后,每小时发出提醒通知的功能.要求如下: 1.每天8点-23点每小时发出一次本地提醒通知 2.提醒的内容是查询本地数据库得到的一个数值,会根据时间的推移而改变 LZ之前用NSTimer计时,每小时去查询数据库并添加UILocalNotification,但是在真机上就算获得了音乐播放器类应用的权限后,在后台运行一段时间,应用依旧会被挂起,导致NSTimer失效.

Win10系统如何添加本地账户?Win10添加本地账户的方法

Win10系统如何添加本地账户?在win10系统中,许多用户都会注册并使用微软账户来登录操作系统,但是有些时候运行一些程序需要使用本地账户才可以,该怎么添加呢?下面小编给大家分享下win10添加本地账户的操作方法! 步骤: 1.点击开始菜单,点击左侧的"齿轮"图标打开windows 设置: 2.在windows设置 界面点击"账户": 3.点击"其他用户"-"将其他人添加到这台电脑": 4.点击左下角的"我没有这个人

【IOS-COCOS2D游戏开发之十】添加粒子系统特效并解决粒子特效与LAYER之间的坐标问题;

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/472.html 一直以来Himi特别想在游戏中使用粒子系统,但是之前做J2me与Android中发现使用粒子做的效果都会造成游戏运行内存的一个负担,所以一直很遗憾,那么在iOS游戏开发中,可以说必须要使用粒子啦,还是苹果硬件给力:看过我一开始刚写cocos2d博文的时候我就说过因为cocos2d的粒子编辑器很给

【IOS-COCOS2D游戏开发之十五】详解CCPROGRESSTIMER 进度条并修改COCOS2D源码实现“理想”游戏进度条!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/491.html 游戏开发中难免用到进度条,例如做一些游戏技能的CD时间等都会使用到:那么cocos2d当然也封装了进度条,但是不太理想,如果童鞋们用过就应该知道,那么今天介绍两个知识点,第一:介绍cocos2d中的进度条CCProgressTimer如何使用:第二点:修改cocos2d封装的CCProgressT