AJ学IOS(15)UI之曾经大热的打砖块小游戏
AJ分享,必须精品
先看效果图
代码
// ViewController.m
// 打砖块
//
// Created by liufan on 13-8-17.
// Copyright (c) 2013年 itcast. All rights reserved.
//
@interface ViewController : UIViewController
// 砖块图像数组
@property (strong, nonatomic) IBOutletCollection(UIImageView) NSArray *blockImages;
// 小球图像视图
@property (weak, nonatomic) IBOutlet UIImageView *ballImageView;
// 挡板图像视图
@property (weak, nonatomic) IBOutlet UIImageView *paddleImageView;
// 消息标签
@property (weak, nonatomic) IBOutlet UILabel *messageLabel;
// 点击屏幕手势识别
@property (strong, nonatomic) IBOutlet UITapGestureRecognizer *tapGesure;
// 点按屏幕,开始游戏
- (IBAction)tapScreen:(id)sender;
// 拖拽挡板
- (IBAction)dragPaddle:(UIPanGestureRecognizer *)sender;
@end
#import <QuartzCore/QuartzCore.h>
@interface ViewController ()
{
// 小球的初始位置
CGPoint _originBallCenter;
// 挡板的初始位置
CGPoint _originPaddleCenter;
// 游戏时钟
CADisplayLink *_gameTimer;
// 小球的速度
CGPoint _ballVelocity;
// 挡板的水平速度
CGFloat _paddleVelocityX;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 记录小球初始中心点位置
_originBallCenter = _ballImageView.center;
// 记录挡板初始中心点位置
_originPaddleCenter = _paddleImageView.center;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - 碰撞检测方法
// 与屏幕的碰撞检测
- (void)intersectWithScreen
{
// 与屏幕上方的碰撞检测
if (CGRectGetMinY(_ballImageView.frame) <=0) {
_ballVelocity.y = ABS(_ballVelocity.y);
}
// 与屏幕左侧的碰撞检测
if (CGRectGetMinX(_ballImageView.frame) <= 0) {
_ballVelocity.x = ABS(_ballVelocity.x);
}
// 与屏幕右侧的碰撞检测
if (CGRectGetMaxX(_ballImageView.frame) >= self.view.bounds.size.width) {
_ballVelocity.x = -ABS(_ballVelocity.x);
}
// 从屏幕下方掉出,游戏结束
if (CGRectGetMinY(_ballImageView.frame) >= self.view.bounds.size.height) {
NSLog(@"你输了!");
// 关闭时钟
[_gameTimer invalidate];
// 提示用户输了
[_messageLabel setHidden:NO];
[_messageLabel setText:@"你输啦~~~"];
// 启用点击屏幕手势识别
[_tapGesure setEnabled:YES];
}
}
// 与砖块的碰撞检测
- (void)intersectWithBlocks
{
for (UIImageView *block in _blockImages) {
// 循环检测砖块是否与小球碰撞,如果发生碰撞,翻转小球的速度
if (CGRectIntersectsRect(block.frame, _ballImageView.frame) && ![block isHidden]) {
// 把砖块隐藏起来
[block setHidden:YES];
// 翻转小球Y方向速度
_ballVelocity.y *= -1;
}
}
// 所有的砖块都被隐藏了,说明游戏胜利
BOOL win = YES;
for (UIImageView *block in _blockImages) {
if (![block isHidden]) {
win = NO;
break;
}
}
// 游戏胜利的处理
if (win) {
// 关闭时钟
[_gameTimer invalidate];
// 提示用户输了
[_messageLabel setHidden:NO];
[_messageLabel setText:@"欧耶~~~"];
// 启用点击屏幕手势识别
[_tapGesure setEnabled:YES];
}
}
// 与挡板的碰撞检测
- (void)intersectWithPaddle
{
if (CGRectIntersectsRect(_paddleImageView.frame, _ballImageView.frame)) {
// 小球Y方向速度翻转
_ballVelocity.y = -ABS(_ballVelocity.y);
// 增加小球水平方向的速度,简单修正一下小球的水平速度
_ballVelocity.x += _paddleVelocityX / 120.0;
}
}
// 屏幕刷新时执行的方法
- (void)step
{
NSLog(@"屏幕刷新了");
[self intersectWithScreen];
[self intersectWithBlocks];
[self intersectWithPaddle];
// 更新小球位置
[_ballImageView setCenter:CGPointMake(_ballImageView.center.x + _ballVelocity.x,
_ballImageView.center.y + _ballVelocity.y)];
}
// 点击屏幕,开始游戏
- (IBAction)tapScreen:(id)sender
{
NSLog(@"点击屏幕了!");
// 禁用点击屏幕手势识别
[_tapGesure setEnabled:NO];
// 消息标签隐藏
[_messageLabel setHidden:YES];
// 小球
[_ballImageView setCenter:_originBallCenter];
// 挡板
[_paddleImageView setCenter:_originPaddleCenter];
// 砖块,把隐藏的砖块恢复
for (UIImageView *block in _blockImages) {
[block setHidden:NO];
}
// 给小球设置初始速度
_ballVelocity = CGPointMake(0.0, -5.0);
// 定义游戏时钟
_gameTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)];
// 把游戏时钟添加到主运行循环中
[_gameTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
// 拖拽挡板
- (IBAction)dragPaddle:(UIPanGestureRecognizer *)sender
{
// 拖拽手指时,改变挡板的位置
// 需要判断手指是否在拖动
if (UIGestureRecognizerStateChanged == sender.state) {
// 取出手指移动到的位置
CGPoint location = [sender locationInView:self.view];
// 将挡板的水平位置设置为手指的位置
[_paddleImageView setCenter:CGPointMake(location.x, _paddleImageView.center.y)];
// 记录挡板的水平移动速度
_paddleVelocityX = [sender velocityInView:self.view].x;
NSLog(@"%f", _paddleVelocityX);
} else if (UIGestureRecognizerStateEnded == sender.state) {
// 恢复手指移动速度
_paddleVelocityX = 0;
}
}
@end
游戏规则
1-》屏幕上⽅方有四排砖块
2-》点击屏幕开始游戏
3-》游戏开始时,⼩小球向上⽅方运⾏行
4-》⼩小球与砖块撞击可以撞碎砖块并反弹
5-》⼩小球与屏幕顶部、右侧、左侧碰撞会反弹
6-》⼩小球与挡板碰撞会反弹
7-》左右移动⼿手指可以挪动挡板
8-》⼩小球从屏幕下⽅方掉出游戏结束
开发步骤
1-》新建项⽬目
2-》搭建界⾯面
获取界⾯面对象并监听屏幕事件(storyboard设置界面,脱线)
3-》代码实现
点击屏幕让⼩小球动起来 (游戏时钟,刷新位置)
砖块碰撞检测 (碰撞后隐藏)
拖动挡板改变⼩小球⽅方向 (得到拖拽手势速度,改变小球速度)
胜负判断及重置游戏 (小球的位置中y的最小值有没有大于屏幕y最大值)
AJ学IOS(15)UI之曾经大热的打砖块小游戏的更多相关文章
- AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引
AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...
- AJ学IOS(28)UI之Quartz2D简单介绍
AJ分享,必须精品 iOS开发UI篇—Quartz2D简单介绍 什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : ...
- AJ学IOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController
AJ分享,必须精品 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封 ...
- 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接 ...
- AJ学IOS(23)UI之控制器管理
AJ分享,必须精品 控制器以及view的多种创建方式 控制器view的加载 通过storyboard创建 1:先加载storyboard⽂件(Test是storyboard的⽂文件名) UIStory ...
- AJ学IOS(08)UI之热门_喜马拉雅UI实现-UIScrollView的使用
AJ分享,必须精品 先看效果 storyBoard用到的控件 代码实现 */ // // NYViewController.m // 05 - 喜马拉雅 // // Created by apple ...
- AJ学IOS(01) UI之Hello World与加法计算器
不多说,AJ分享,必须精品 这两个一个是HelloWorld(左边) 另一个是 加法计算器(右边)的截图. 先运行第一个 程序看看效果 1.打开Xcode(没有哦mac系统的没有xcode的帮你们默哀 ...
- AJ学IOS(42)UI之核心动画CAAnimationGroup以及其他
AJ分享,必须精品 效果: 代码: 很简单,不多说,就是把一堆动画放一起,看代码. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent * ...
- AJ学IOS(25)UI之触摸事件
AJ分享,必须精品 iOS中的事件 在用户使用app过程中,会产生各种各样的事件;iOS中的事件可以分为3大类型: 响应者对象–UIResponder 在iOS中不是任何对象都能处理事件,只有继承了U ...
随机推荐
- Mol. Cell. Proteomics | 糖蛋白基因组学:一种常见的基因多态性影响人血清胎球蛋白/α-2-HS-糖蛋白的糖基化形式
大家好,本次分享的是发表在Molecular & Cellular Proteomics上的一篇关于糖蛋白基因组学的文章,题目是Glycoproteogenomics: A Frequent ...
- hdu1035 机器人走格子,格子指明方向,问几步走出格子或者是否有形成圈
只要根据格子的方向选择下一步搜索的方向即可,退出条件是出界或者进入环中,进入环中的条件也很好确定,就是一个点走了两次,由于路径是固定的,这就会陷入无限循环. #include<iostream& ...
- JDBC(三)----JDBC控制事务
## JDBC控制事务 1.事务:一个包含多个步骤的业务操作.如果这个业务员操作被事务管理,则这多个步骤要么同时成功,要么同时失败. 2.操作: 1.开启事务 2.提交事务 3.回滚事务 3.使用C ...
- JS 冒泡排序详解
冒泡排序原理:比较相邻两个数的大小,如果第一个数大于第二个数,那么交换位置,从第一位数开始,对后面每一对相邻的数据进行同样的比较和交换,直到最后没有任何一位需要进行比较大小和交换: 思路演算: arr ...
- Java基础语法(5)-特殊流程控制语句
title: Java基础语法(5)-特殊流程控制语句 blog: CSDN data: Java学习路线及视频 1.嵌套循环结构 将一个循环放在另一个循环体内,就形成了嵌套循环.其中,for ,wh ...
- Magenta Demos Magenta 实战代码
Magenta 实战代码 这个仓库包含了很多 Magenta 模型的实现.看 Magenta 库以及模型,看我们的主仓库:https://github.com/tensorflow/magenta A ...
- 近期 github 机器学习热门项目top5
磐创智能-专注机器学习深度学习的教程网站 http://panchuang.net/ 磐创AI-智能客服,聊天机器人,推荐系统 http://panchuangai.com/ [导读]:Github是 ...
- Azure Web: 数据库的创建与数据监控
介绍主题:Azure 大家都知道Azure云现在由于中国国策不一样,会有中国版Azure云和国际版Azure. 但是我们今天基于这个国际版的讲,因为我这个博客会比较international一点.(- ...
- BUAA_2020_OO_第一单元总结
三次作业,三次成长 第一次作业--幂函数求导总结 作业思路和心得 第一次作业的要求只有x的指数这样的幂函数加减组成表达式,对表达式进行求导,而且没有格式错误的检查,所以难度感觉还不是很高.不过由于我寒 ...
- SublimeのJedi (自动补全)
关于 Sublime 3 - Jedi Package 的设置和使用方法 我是一枚小白,安装后 Sublime 后,想在码字时,达到如下效果: 打字时,自动提示相关内容 按Tab键,相关内容自动填充 ...