很多天没有更新博客了,一方面是回杭州了几天,另一方面是开始做项目练习了。感谢关注我的一些朋友~
这些天会陆续把自己做这个项目的过程更新出来,喜欢的朋友可以一起学习一下
声明:转载请注明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];
}
应用程序开发之模仿史上最牛游戏(一)