貓貓學IOS(十五)UI之曾經大熱的打磚塊小遊戲,ios打磚塊
貓貓分享,必須精品
素材代碼地址:http://blog.csdn.net/u013357243/article/details/44814523
原文地址: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