首页 > 代码库 > 应用程序开发之模仿史上最牛游戏(一)
应用程序开发之模仿史上最牛游戏(一)
很多天没有更新博客了,一方面是回杭州了几天,另一方面是开始做项目练习了。感谢关注我的一些朋友~
这些天会陆续把自己做这个项目的过程更新出来,喜欢的朋友可以一起学习一下
声明:转载请注明http://www.cnblogs.com/letougaozao/p/3708887.html
- 游戏配置
- 第一个界面-主界面
- 游戏设置界面
- 音乐、音效
一、游戏该有的配置
-Status Bar Hide
注意:IOS7如何隐藏状态栏:plist加个view controller-base.... 设置成NO就可以了
-屏幕方向,只有一种
-增加一些资源
-增加一些图标等(创建真实的文件夹)
-去除默认反光效果
在Info.plist文件中,点+Icon already includes gloss effects Yes;
二、第一个界面
效果(细心观察,可以看出来是对图最上边和最下边分别进行了剪切来适配屏幕)
1??屏幕适配iPhone4和iPhone5(两种方法)
-第一种:准备两套图片
-第二种只准备iPhone5的,iPhone4上显示的时候会剪掉
我们这个项目采用第二种方法
2??当前控制器包含在导航控制器中
-创建文件夹
-给屏幕设置图片
3??显示主控制器的背景
-直接把图片显示到控制器的View上
-一种方法:(用设置背景颜色的方法,但是需要先把图片弄合适)
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"icon.png"]];
这种方法需要将图片本身和控制器的View完全相同,不然就会平铺上去
-自定义一个View
1.给UIView添加一个分类(给分类添加一个自己想要的方法)
分类的.h文件
@interface UIView (BgFull) //设置背景 - (void)setFullView:(NSString*)imageName; @end
2.设置图片的名称方法,设置完之后,重新画一次
- (void)setFullView:(NSString *)imageName { _imageName = imageName; //重画 [self setNeedsDisplay]; }
2.把图片画到View上方法,drawRect
-加载图片(先判断如果没有名称,直接返回)
-绘制图片[image drawInRect];
#pragma mark - 重画 - (void)drawRect:(CGRect)rect { UIImage *image = [UIImage imageNamed:_imageName]; if (!iPhone5) { //判断是iPhone4,剪图片 CGRect cutFrame = CGRectMake(0, 88, 640, 960); CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, cutFrame); image = [UIImage imageWithCGImage:imageRef]; } [image drawInRect:rect]; }
-给UIView增加一个分类category(这样就不需要强转了)
1.把方法在分类中声明
2.在FullBgView中实现
4??屏幕适配
-在画图片之前对图片进行裁剪((1136-960)/2)
1.先判断是iPhone几,如果是4就裁剪
2.定义宏
#define iPhone5 ([UIScreen mainScreen].bounds.size.height == 568)
5??监听按钮的点击
注意:整个界面当中,只是一张图片,并没有按钮,那么我们如何来监听我们点击呢?
如果我们得到他们的资源包可以发现,他们是把几个按钮的CGRect写如到一个plist文件当中的,我们只需取出来,然后监听点击是否在这个范围内即可。并且他们有两个,一个是iPhone5、一个是iPhone4的位置
-界面加载的时候就将所有的点取出放入字典,然后通过健来取他们的值(取出是字符串,转换成CGRect即可)
- (void)viewDidLoad { [super viewDidLoad]; [self.view setFullView:@"home_bg.jpg"]; NSString *path = [[NSBundle mainBundle]pathForResource:@"home" ofType:@"plist"]; NSDictionary *dict1 = [NSDictionary dictionaryWithContentsOfFile:path]; _btnFrames = dict1[iPhone5 ? @"iphone5" : @"iphone4"]; btn_get_frame = CGRectFromString(_btnFrames[@"btn_get_frame"]); btn_language_frame = CGRectFromString(_btnFrames[@"btn_language_frame"]); btn_more_frame = CGRectFromString(_btnFrames[@"btn_more_frame"]); btn_play_frame = CGRectFromString(_btnFrames[@"btn_play_frame"]); btn_rank_frame = CGRectFromString(_btnFrames[@"btn_rank_frame"]); btn_setting_frame = CGRectFromString(_btnFrames[@"btn_setting_frame"]); }
-重写touchesEnded方法
1.取出点击的点point
UITouch *touch = [touches anyObject];
CGPoint hitPoint = [touch locationInView:self.view];
2.看这个point在哪一个frame里面(因为只做了设置和Play,所有其他位置的监听就没有写)
if (CGRectContainsPoint(btn_setting_frame, hitPoint)) { [[SoundManager sharedSoundManager] playSound:kClickSound]; [self performSegueWithIdentifier:@"setting" sender:nil]; } else if (CGRectContainsPoint(btn_play_frame, hitPoint)) { [[SoundManager sharedSoundManager] playSound:kClickSound]; [self performSegueWithIdentifier:@"stages" sender:nil]; }
本节学习重点:
1.启动时,加载配置文件home.plist
2.判断是iPhone几,定义成宏:_btnFrames = dict1[iPhone5 ? @"iphone5" : @"iphone4"];
3.加载每一个按钮的Frame:btn_get_frame = CGRectFromString(_btnFrames[@"btn_get_frame"]);
三、设置界面
界面效果:
1??创建一个setting的类,和拖一个UIViewController
-修改类名
-连线,并且给线起一个名字
-设置背景(这里就体会到了我们之前封装View的好处了,直接通过setFullView方法就可以设置背景了)
2??点击设置跳转过去(去除动画,因为游戏界面跳转通常不需要动画)
-[self perform:@“setting” sender:nil];
-自定义NavigationController,重写PushView,将动画设置成No
3??添加三个按钮
-返回,pop直接返回
[self.navigationController popViewControllerAnimated:NO];
-设置声音(见四)
-设置音效(见四)
四、音乐、音效
1??添加音乐工具类(AVFoundation、audioToolbox框架)
添加音频类,重写init方法(因为在类加载的时候,我们就加载音频、音效)
#pragma mark -初始化方法 - (id)init { if (self = [super init]) { //加载音乐 [self loadMusic]; //加载音效 [self loadSound]; } return self; }
-加载背景音乐
1.获取URL
2.加载播放器
3.设置准备播放、无限循环
- (void)loadMusic { //3.1解档并且给静音设置状态 _musicMuted = [[NSUserDefaults standardUserDefaults] boolForKey:kMusicMuted]; NSURL *url = [[NSBundle mainBundle]URLForResource:@"bg_music.mp3" withExtension:nil]; _btMusicPlay = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil]; [_btMusicPlay prepareToPlay]; [_btMusicPlay setNumberOfLoops:-1]; }
4.开始播放(不在这里播放,提供一个方法给别人播放)
- (void)playMusic { //4.2如果静音状态,直接返回 if (_musicMuted) return; [_btMusicPlay play]; }
-加载音效(所有音效放进bundle里)
加载所有的音效,并且放入一个字典中,之后可以根据字典中的健来决定播放什么音效
- (void)loadSound { //3.2解档并且给静音设置状态 _soundMuted = [[NSUserDefaults standardUserDefaults] boolForKey:kSoundMuted]; _soundIDs = [NSMutableDictionary dictionary]; NSURL *bundleUrl = [[NSBundle mainBundle]URLForResource:@"sounds" withExtension:@"bundle"]; NSBundle *soundsBundle = [NSBundle bundleWithURL:bundleUrl]; //获得所有的URl NSArray *urlArray = [soundsBundle URLsForResourcesWithExtension:@"mp3" subdirectory:nil]; for (NSURL *url in urlArray) { SystemSoundID soundID; AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID); NSString *fileName = [url.path lastPathComponent]; [_soundIDs setObject:@(soundID) forKey:fileName]; } }
4.播放音频(不在这里播放,提供一个方法给别人播放)
- (void)playSound:(NSString*)soundName { //4.1如果静音状态,直接返回 if (_soundMuted) return; AudioServicesPlaySystemSound([_soundIDs[soundName]unsignedLongValue]); }
2??设置成单例模式(可以直接抽成一个宏)
-重写allocWithZone(类方法)
1.定义一个C语言的成员变量
2.多线程问题:GCD
-三大要素
1.有一个static类型的全局变量
2.重写allocWithZone,保证只会分配一次内存
3.提供公共方法来返回单例对象
-步骤
1.定义宏
#define singleton_interface(className) + (className*)shared##className; #define singeton_implementation(className) static className *_instance; + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); return _instance; } + (className*)shared##className { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance; }
2.在interface中声明
singleton_interface(SoundManager)
3.在implementation中实现
singeton_implementation(SoundManager)
3??保存音乐、音效的参数,下次运行直接加载
1.声音工具保存两个属性,来让别人更改音乐、音效状态 musicMuted、soundMuted
//1.1设置属性 @property (nonatomic, assign) BOOL musicMuted; //1.2设置属性 @property (nonatomic, assign) BOOL soundMuted;
2.在点击按钮的时候,怎么改变状态?(答案见3)
3.重写set方法,保存值、归档
#pragma mark - 重写两个BOOL属性的set方法 - (void)setMusicMuted:(BOOL)musicMuted { //2.1保存状态,切归档 _musicMuted = musicMuted; [[NSUserDefaults standardUserDefaults] setBool:_musicMuted forKey:kMusicMuted]; [[NSUserDefaults standardUserDefaults] synchronize]; if (_musicMuted) { [_btMusicPlay pause]; } else { [_btMusicPlay play]; } } - (void)setSoundMuted:(BOOL)soundMuted { //2.2保存状态,切归档 _soundMuted = soundMuted; [[NSUserDefaults standardUserDefaults] setBool:_soundMuted forKey:kSoundMuted]; [[NSUserDefaults standardUserDefaults] synchronize]; }
4.刚加载音频的时候,将归档取出,并且给静音取出的状态
_musicMuted = [[NSUserDefaults standardUserDefaults] boolForKey:kMusicMuted];
_soundMuted = [[NSUserDefaults standardUserDefaults] boolForKey:kSoundMuted];
5.根据状态,设置当中的文字,显示合适的值
- (IBAction)musicSwitch:(UIButton *)sender { //5.1这里判断音乐开关,切改变状态 SoundManager *sound = [SoundManager sharedSoundManager]; [sound playSound:kClickSound]; int music = sound.musicMuted; [sender setTitle:music ? @"音乐 [开]" : @"音乐 [关]" forState:UIControlStateNormal]; sound.musicMuted = !music; }
- (IBAction)soundSwitch:(UIButton *)sender { //5.2这里判断音乐开关,切改变状态 SoundManager *sound = [SoundManager sharedSoundManager]; int sounds = sound.soundMuted; [sender setTitle:sounds ? @"音效 [开]" : @"音效 [关]" forState:UIControlStateNormal]; sound.soundMuted = !sounds; [sound playSound:kClickSound]; }
6.在播放时,如果静音,直接返回
#pragma mark -播放音效 - (void)playSound:(NSString*)soundName { //4.1如果静音状态,直接返回 if (_soundMuted) return; AudioServicesPlaySystemSound([_soundIDs[soundName]unsignedLongValue]); } - (void)playMusic { //4.2如果静音状态,直接返回 if (_musicMuted) return; [_btMusicPlay play]; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。