猫学习IOS(十五)UI以前的热的打砖块游戏

猫分享。必须精品

材料代号地址:http://blog.csdn.net/u013357243/article/details/44814523

原文地址:

viewmode=contents">http://blog.csdn.net/u013357243?viewmode=contents

素材代码里面有我写的所有代码,凝视齐全。方便学习

先看效果图


代码

//ps:新建iOS交流学习群:304570962
能够加猫猫QQ:1764541256 或则微信znycat
让我们一起努力学习吧。
原文:http://blog.csdn.net/u013357243?

viewmode=contents
//  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最大值)



ps:新建iOS交流学习群:304570962

能够加猫猫QQ:1764541256 或则微信znycat

让我们一起努力学习吧。

原文:http://blog.csdn.net/u013357243?viewmode=contents

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-08 11:03:32

猫学习IOS(十五)UI以前的热的打砖块游戏的相关文章

javascript基础学习(十五)

javascript之cookie 学习要点: cookie介绍 创建与获取cookie cookie的编码 cookie的生存期 cookie的路径 cookie的domain cookie的secure 一.cookie介绍 cookie实际上就是一些信息,这些信息以文件的形式存储在客户端计算机上.在javascript中,cookie主要用来保存状态,或用于识别身份. 二.创建与获取cookie 创建cookie的语法代码如下所示:document.cookie="name=value&q

hbase 学习(十五)缓存机制以及可以利用SSD作为存储的BucketCache

下面介绍Hbase的缓存机制: a.HBase在读取时,会以Block为单位进行cache,用来提升读的性能 b.Block可以分类为DataBlock(默认大小64K,存储KV).BloomBlock(默认大小128K,存储BloomFilter数据).IndexBlock(默认大小128K,索引数据,用来加快Rowkey所在DataBlock的定位) c.对于一次随机读,Block的访问顺序为BloomBlock.IndexBlock.DataBlock,如果Region下面的StoreFi

JavaScript学习总结(十五)——Function类

在JavaScript中,函数其实是对象,每个函数都是Function类的实例,既然函数对象,那么就具有自己的属性和方法,因此,函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 一.函数的声明 方式一:常规方式 1 function sum1(num1,num2){ 2 return num1+num2 3 } 方式二:函数表达式 1 var sum2=function(num1,num2){ 2 return num1+num2; 3 }; 方式三:动态创建函数(这种方式用得不多)

Swift 学习笔记十五:扩展

扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).扩展和 Objective-C 中的分类(categories)类似.(不过与Objective-C不同的是,Swift 的扩展没有名字.) Swift 中的扩展可以: 1.添加计算型属性和计算静态属性 2.定义实例方法和类型方法 3.提供新的构造器 4.定义下标 5.定义和使用新的嵌套类型 6.使一个已有类型符合某个协议 一.扩展属性,构造器,方法 class Human{ var name:String? va

laravel3学习笔记(十五)

原作者博客:ieqi.net ==================================================================================================== 异常与日志 在应用中,我们总会遇到各种问题.各种异常,这时,记录异常发生时的状态就很重要,所以异常与日志是有着天然的关系的. 关于异常与日志的配置在文件 application/config/error.php 中. 文件中有四个配置项: 'ignore' => ar

C++语言学习(十五)——C++抽象类与接口

C++语言学习(十五)--C++抽象类与接口 一.抽象类与接口 1.抽象类简介 面向对象的抽象类用于表示现实世界的抽象概念,是一种只能定义类型,不能产生对象的类(不能实例化),只能被继承并被重写相关函数,直接特征是相关函数没有完整实现.C++语言没有抽象类的概念,通过纯虚函数实现抽象类.纯虚函数是指定义原型的成员函数,C++中类如果存在纯虚函数就成为了抽象类.抽象类只能用作父类被继承,子类必须实现父类纯虚函数的具体功能,如果子类没实现纯虚函数,子类也为抽象类.抽象类不可以定义对象,但是可以定义指

学习进度十五

  第十五周 学习时间 12 代码行 800 博客篇 2 所学内容 关于单词链以及android的数据库 原文地址:https://www.cnblogs.com/NCLONG/p/10988948.html

猫学习IOS(三)UI纯代码UI——图片浏览器

猫分享.必须精品 看看效果 主要实现相似看新闻的一个界面,不用拖拽,纯代码手工写. 首先分析app能够非常easy知道他这里有两个UILabel一个UIImageView还有两个UIButton 定义UIView中的东西 @property (nonatomic, strong) UILabel *noLabel;//数字标签 @property (nonatomic, strong) UIImageView *iconImage;//图片控件 @property (nonatomic, str

西门子PLC学习笔记十五-(数据块及数据访问方式)

一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的. 数据块分共享数据块.背景数据块.用户自定义数据块,下面分别介绍. 1.共享数据块(全局数据块) 其用于存储全局数据,所有逻辑块(OB.FC.FB)都可以访问共享数据块中的数据. 2.背景数据块(私有存储区) 其用做功能块(FB)的"存储器".FB的参数和静态变量安排在它的背景数据块中.