应用程序开发之模仿史上最牛游戏(一)

很多天没有更新博客了,一方面是回杭州了几天,另一方面是开始做项目练习了。感谢关注我的一些朋友~

这些天会陆续把自己做这个项目的过程更新出来,喜欢的朋友可以一起学习一下

声明:转载请注明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];
}

应用程序开发之模仿史上最牛游戏(一)

时间: 2024-11-06 14:54:27

应用程序开发之模仿史上最牛游戏(一)的相关文章

应用程序开发之模仿史上最牛游戏(三)

声明:转载请注明http://www.cnblogs.com/letougaozao/p/3720679.html 关卡解锁 关卡状态的设计 一.解锁动画(点一下解锁) 解锁前后 监听touch end方法,使用涂层layer动画 -加入QuartzCore.framework框架 -动画包括哪些内容呢?(注意播放声音的代码) 1??整个关卡摇摆两下(旋转动画).并且变大(缩放动画) 2??搁层消失(直接移除) 1.封装一个动画组的方法 - (CAAnimationGroup *)animati

应用程序开发之模仿史上最牛游戏(二)

声明:转载请注明http://www.cnblogs.com/letougaozao/p/3708887.html 新建关卡控制器 自定义UIScrollView 增加UIPageView 每个关卡的View 整体效果展示 一.新建关卡控制器 1??拖线 -修改控制器class -修改控制器的View的class(方便设置背景) -装资源文件 -返回按钮 二.自定义UIScrollView 1??在初始化方法里面做一些事情 -添加四张背景图片 1.创建四个FullView 2.将这四个view加

应用程序开发之模仿史上最牛游戏(四)

一.需要一个新的控制器(ReadyViewController) -新建控制器,通过push方式到这个新控制器 -给控制器的view制定类(根据图片选择颜色) -给线起名字 1??给每一个Stage添加手势监听 //2.4为stageView添加手势监听 [stageView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(itemClick:)]]; 2??需要控

微信小程序开发-地图map组件上使用input组件

微信小程序开发-地图map组件上使用input组件 标签: 微信小程序 uni-app 原生组件层级关系 微信小程序在最高层级 在微信小程序中原生组件包括camera canvas input(仅在focus时表现为原生组件) live-player live-pusher map textarea video 在微信小程序开发中原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上. 后插入的原生组件可以覆盖之前的原生组件. 原生组件还无法在 pic

史上最牛逼的菜刀

6月17号,某牛在朋友圈发了消息: 史上最牛逼的中国菜刀即将发布,过市面上所有的 waf,而且把 webshell 玩到让你瞠目结舌的境界 当时有消息称 6 月底将会发布新版菜刀. 果不其然,在 6 月 20 日,原本已经关闭的 maicaidao.com 又开放了,而且下载量瞬间就到了 660 +. 话不多说,赶紧去下载一个体验一波到底有多牛逼. 文章发布时站点又关闭了,具体原因不得而知.(脉搏SP小编注:应该是被DDoS了) 脉搏小编看了一下whois变更,认为应该还是老兵作品.相关阅读<红

企业级openvpn生产标准史上最牛最全最实战课程

企业级openvpn生产标准史上最牛最全最实战课程 近100节,让你轻松精通openvpn及技术 http://edu.51cto.com/pack/view/id-277.html 企业级OpenVPN技术中级运维实战视频课程(上) 1 课前思想必看 2 VPN概述介绍与图解 3 VPN的作用介绍与图解 4 VPN的企业应用分类介绍与图解1 5 VPN的企业应用分类介绍与图解2 6 常见隧道协议介绍-PPTP 7 常见隧道协议介绍-L2TP 8 常见隧道协议介绍-IPSEC-SSLVPN 9

史上最牛逼的javascript俄罗斯方块,63行代码搞定啊

<!doctype html><html><head></head><body> <div id="box" style="width:252px;font:25px/25px 宋体;background:#000;color:#9f9;border:#999 20px ridge;text-shadow:2px 3px 1px #0f0;"></div> <script>

Menu史上最牛的侧滑效果

GAG-master史上最牛的侧滑效果,其中加载图片展示的时候也是慢慢翻转效果,侧滑Menu更是牛逼.  其中自定义BlurFoldingActionBarToggle 提供了onDrawerOpened()和onDrawerClosed()方法,  然后在这两个方法里面设置打开和关闭等各项操作. 运行效果: 查看完整源码地址:http://www.itlanbao.com/code/20150909/10000/100518.html package me.storm.ninegag; imp

HDOJ 1406 完数(打表,附讨论区出现的史上最牛逼打表,0ms)

 完数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22197    Accepted Submission(s): 8115 Problem Description 完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3:28=1+2+4+7+14. 本题的任务是判