




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
打磚塊游戲講師:劉凡技術(shù)博客:課程目標(biāo)用3~4個(gè)小時(shí)實(shí)現(xiàn)簡(jiǎn)單的打磚塊游戲適合人群有一些OC基礎(chǔ),能看懂OC語(yǔ)法即可!游戲規(guī)則屏幕上方有四排磚塊點(diǎn)擊屏幕開(kāi)始游戲游戲開(kāi)始時(shí),小球向上方運(yùn)行小球與磚塊撞擊可以撞碎磚塊并反彈小球與屏幕頂部、右側(cè)、左側(cè)碰撞會(huì)反彈小球與擋板碰撞會(huì)反彈左右移動(dòng)手指可以挪動(dòng)擋板小球從屏幕下方掉出游戲結(jié)束撞碎所有磚塊游戲勝利!開(kāi)發(fā)步驟新建項(xiàng)目搭建界面獲取界面對(duì)象并監(jiān)聽(tīng)屏幕事件代碼實(shí)現(xiàn)點(diǎn)擊屏幕讓小球動(dòng)起來(lái)屏幕碰撞檢測(cè)擋板碰撞檢測(cè)磚塊碰撞檢測(cè)拖動(dòng)擋板改變小球方向勝負(fù)判斷及重置游戲新建項(xiàng)目1——選擇項(xiàng)目模板新建項(xiàng)目2——設(shè)置項(xiàng)目屬性新建項(xiàng)目3——保存項(xiàng)目新建項(xiàng)目——運(yùn)行新建項(xiàng)目——設(shè)置設(shè)備方向并隱藏狀態(tài)欄新建項(xiàng)目——再次運(yùn)行下一步搭建游戲界面搭建游戲界面——MainStoryboard搭建游戲界面——MainStoryboard簡(jiǎn)介搭建游戲界面——隱藏狀態(tài)欄搭建游戲界面——準(zhǔn)備素材搭建游戲界面——導(dǎo)入素材搭建游戲界面——添加第一個(gè)紅色磚塊搭建游戲界面——復(fù)制五個(gè)紅色磚塊搭建游戲界面——同時(shí)復(fù)制5個(gè)并統(tǒng)一修改為黃色搭建游戲界面——完成所有磚塊搭建游戲界面——添加小球和擋板并設(shè)置背景搭建游戲界面——運(yùn)行看看效果下一步讓小球動(dòng)起來(lái)的準(zhǔn)備工作讓小球動(dòng)起來(lái)——增加點(diǎn)擊手勢(shì)打開(kāi)助理編輯器——建立界面與源代碼之間的連接建立小球的IBOutlet——讓代碼可以操縱界面元素建立手勢(shì)的IBAction——特定事件發(fā)生時(shí)執(zhí)行代碼編寫tapScreen方法,確認(rèn)點(diǎn)擊事件是否執(zhí)行#pragmamark-Actions//點(diǎn)擊屏幕,開(kāi)始游戲-(IBAction)tapScreen:(id)sender{
NSLog(@"點(diǎn)擊屏幕了");}準(zhǔn)備工作——運(yùn)行看看效果下一步讓小球動(dòng)起來(lái)提問(wèn):如何讓小球動(dòng)起來(lái)?游戲啟動(dòng)流程圖需要游戲是否開(kāi)始小球初始位置游戲時(shí)鐘小球的速度位移=時(shí)間*速度游戲是否開(kāi)始的處理既然游戲開(kāi)始是由點(diǎn)擊屏幕觸發(fā)的,那么游戲啟動(dòng)之后,禁用屏幕點(diǎn)擊,即可解決重復(fù)啟動(dòng)游戲在.h中增加如下IBAction連線//點(diǎn)擊手勢(shì)@property(strong,nonatomic)IBOutlet
UITapGestureRecognizer*tapGesture;要使用游戲時(shí)鐘需要添加QuartzCore框架QuartzCore框架添加完成編碼1——成員變量定義#import"ViewController.h"http://引入QuartzCore框架,以定義游戲時(shí)鐘#import<QuartzCore/QuartzCore.h>@interface
ViewController(){//游戲時(shí)鐘
CADisplayLink*_gameTimer;
//小球初始中心點(diǎn)位置
CGPoint_originBallCenter;
//小球速度
CGPoint_ballVelocity;}@end編碼2——成員變量初始化-(void)viewDidLoad{[super
viewDidLoad];_originBallCenter=_ballImageView.center;}編碼3——點(diǎn)擊屏幕,開(kāi)始游戲//點(diǎn)擊屏幕,開(kāi)始游戲-(IBAction)tapScreen:(id)sender{
//賦予小球初始位置,Y方向是向下增加的,小球要向上運(yùn)動(dòng)
_ballVelocity=CGPointMake(0.0,-5.0);
//定義游戲時(shí)鐘
_gameTimer=[CADisplayLink
displayLinkWithTarget:self
selector:@selector(step:)];
//將游戲時(shí)鐘添加到主運(yùn)行循環(huán)[_gameTimer
addToRunLoop:[NSRunLoop
mainRunLoop]forMode:NSDefaultRunLoopMode];
//標(biāo)記游戲開(kāi)始[_tapGesture
setEnabled:NO];}iOS的坐標(biāo)系坐標(biāo)原點(diǎn)(0,0)X
320Y
480編碼4——游戲時(shí)鐘處理方法//游戲時(shí)鐘處理方法-(void)step:(CADisplayLink*)sender{
//更新小球位置[_ballImageView
setCenter:CGPointMake(_ballImageView.center.x+_ballVelocity.x,
_ballImageView.center.y+_ballVelocity.y)];}讓小球動(dòng)起來(lái)——運(yùn)行看看效果下一步碰撞檢測(cè)問(wèn)題:小球飛出屏幕了!需要檢測(cè)的碰撞小球與屏幕的碰撞小球與磚塊的碰撞小球與擋板的碰撞小球與屏幕的碰撞實(shí)現(xiàn)1——屏幕頂部#pragmamark-碰撞檢測(cè)-(void)intersectWithScreen{
//與屏幕頂部碰撞
if(CGRectGetMinY(_ballImageView.frame)<=0){
_ballVelocity.y=ABS(_ballVelocity.y);}}#pragmamark-游戲時(shí)鐘處理方法//游戲時(shí)鐘處理方法-(void)step:(CADisplayLink*)sender{
//屏幕碰撞檢測(cè)[self
intersectWithScreen];
//更新小球位置[_ballImageView
setCenter:CGPointMake(_ballImageView.center.x+_ballVelocity.x,
_ballImageView.center.y+_ballVelocity.y)];}下一步其他對(duì)象碰撞檢測(cè)屏幕頂部碰撞檢測(cè)——運(yùn)行看看效果小球與其他對(duì)象碰撞準(zhǔn)備——建立磚塊IBOutlets小球與其他對(duì)象碰撞準(zhǔn)備——建立磚塊IBOutlets建立完IBOutlet連線的完整.h文件#import<UIKit/UIKit.h>@interfaceViewController:UIViewController//磚塊圖像視圖數(shù)組@property(strong,nonatomic)IBOutletCollection(UIImageView)NSArray*blockImageViews;//小球圖像視圖@property(weak,nonatomic)IBOutlet
UIImageView*ballImageView;//擋板圖像視圖@property(weak,nonatomic)IBOutlet
UIImageView*paddleImageView;//點(diǎn)擊手勢(shì)@property(strong,nonatomic)IBOutlet
UITapGestureRecognizer*tapGesture;//點(diǎn)擊屏幕,開(kāi)始游戲-(IBAction)tapScreen:(id)sender;@end小球與磚塊的碰撞實(shí)現(xiàn)1——碰撞后翻轉(zhuǎn)y方向速度//小球與磚塊的碰撞檢測(cè)-(void)intersectWithBlocks{
for(UIImageView*blockin
_blockImageViews){
//如果小球與磚塊相交
if(CGRectIntersectsRect(block.frame,_ballImageView.frame)){
//翻轉(zhuǎn)小球Y方向的速度
_ballVelocity.y*=-1;
break;}}}小球與磚塊的碰撞實(shí)現(xiàn)2——碰撞后隱藏//小球與磚塊的碰撞檢測(cè)-(void)intersectWithBlocks{
for(UIImageView*blockin
_blockImageViews){
//如果小球與磚塊相交
if(CGRectIntersectsRect(block.frame,_ballImageView.frame)&&![blockisHidden]){
//翻轉(zhuǎn)小球Y方向的速度
_ballVelocity.y*=-1;
//如果發(fā)生碰撞,隱藏磚塊
[blocksetHidden:YES];
break;}}}小球與擋板的碰撞實(shí)現(xiàn)//小球與擋板的碰撞實(shí)現(xiàn)-(void)intersectWithPaddle{
//與擋板的碰撞檢測(cè)
if(CGRectIntersectsRect(_paddleImageView.frame,_ballImageView.frame)){
_ballVelocity.y=-ABS(_ballVelocity.y);}}下一步拖動(dòng)擋板改變小球方向碰撞檢測(cè)——運(yùn)行看看效果拖動(dòng)擋板——增加拖動(dòng)手勢(shì)建立完IBAction連線的完整.h文件#import<UIKit/UIKit.h>@interfaceViewController:UIViewController//磚塊圖像視圖數(shù)組@property(strong,nonatomic)IBOutletCollection(UIImageView)NSArray*blockImageViews;//小球圖像視圖@property(weak,nonatomic)IBOutlet
UIImageView*ballImageView;//擋板圖像視圖@property(weak,nonatomic)IBOutlet
UIImageView*paddleImageView;//點(diǎn)擊手勢(shì)@property(strong,nonatomic)IBOutlet
UITapGestureRecognizer*tapGesture;//點(diǎn)擊屏幕,開(kāi)始游戲-(IBAction)tapScreen:(id)sender;//拖動(dòng)擋板-(IBAction)dragPaddle:(UIPanGestureRecognizer*)sender;@end拖動(dòng)擋板代碼實(shí)現(xiàn)//拖動(dòng)擋板-(IBAction)dragPaddle:(UIPanGestureRecognizer*)sender{
//如果是手指移動(dòng)
if(UIGestureRecognizerStateChanged==sender.state){
//獲取手指位置
CGPointlocation=[senderlocationInView:self.view];
//設(shè)置擋板位置[_paddleImageView
setCenter:CGPointMake(location.x,_paddleImageView.center.y)];}}屏幕碰撞檢測(cè)方法擴(kuò)展,增加底部掉出判斷//小球與屏幕的碰撞檢測(cè)-(void)intersectWithScreen{
//與屏幕頂部碰撞
if(CGRectGetMinY(_ballImageView.frame)<=0){
_ballVelocity.y=ABS(_ballVelocity.y);}
//從屏幕底部掉出
if(CGRectGetMinY(_ballImageView.frame)>self.view.frame.size.height){
NSLog(@"你輸了!%@",NSStringFromCGSize(self.view.frame.size));[_gameTimer
invalidate];
//TODO:恢復(fù)游戲狀態(tài)
}}修改小球的水平速度1——修改擋板拖動(dòng)方法增加成員變量記錄擋板水平移動(dòng)速度CGFloat_paddleVelocityX;拖動(dòng)擋板方法//拖動(dòng)擋板-(IBAction)dragPaddle:(UIPanGestureRecognizer*)sender{
//如果是手指移動(dòng)
if(UIGestureRecognizerStateChanged==sender.state){
//省略部分代碼……
NSLog(@"%f",[sendervelocityInView:self.view].x);
//記錄擋板水平移動(dòng)速度
_paddleVelocityX=[sendervelocityInView:self.view].x;
}else
if(UIGestureRecognizerStateEnded==sender.state){
//復(fù)位擋板水平移動(dòng)速度
_paddleVelocityX=0;}}修改小球的水平速度2——擋板碰撞時(shí)修改小球速度//小球與擋板的碰撞檢測(cè)-(void)intersectWithPaddle{
//與擋板的碰撞檢測(cè)
if(CGRectIntersectsRect(_paddleImageView.frame,_ballImageView.frame)){
_ballVelocity.y=-ABS(_ballVelocity.y);
//在此僅對(duì)水平速度做了簡(jiǎn)單的修正
_ballVelocity.x+=_paddleVelocityX/120.0;}}修改小球的水平速度3——屏幕碰撞檢測(cè)完善//與屏幕左側(cè)碰撞if(CGRectGetMinX(_ballImageView.frame)<=0){
_ballVelocity.x=ABS(_ballVelocity.x);}//與屏幕右側(cè)碰撞檢測(cè)if(CGRectGetMaxX(_ballImageView.frame)>self.view.bounds.size.width){
_ballVelocity.x=-ABS(_ballVelocity.x);}游戲難度有點(diǎn)高!解決辦法:加寬擋板拖動(dòng)擋板——運(yùn)行看看效果加寬擋板加寬擋板——運(yùn)行看看效果果然簡(jiǎn)單多了!下一步:勝負(fù)判斷及重置游戲游戲結(jié)束后需要做的事情提示用戶游戲勝負(fù)恢復(fù)UI狀態(tài)消息標(biāo)簽小球擋板磚塊記錄小球和擋板的初始中心點(diǎn)位置-(void)viewDidLoad{[super
viewDidLoad];
//小球初始中心點(diǎn)位置
_originBallCenter=_ballImageView.center;
//擋板初始中心點(diǎn)位置
_originPaddleCenter=_paddleImageView.center;}點(diǎn)擊開(kāi)始游戲時(shí),設(shè)置UI狀態(tài)//點(diǎn)擊屏幕,開(kāi)始游戲-(IBAction)tapScreen:(id)sender{
//消息標(biāo)簽[_messageLabel
setHidden:YES];
//小球[_ballImageView
setCenter:_originBallCenter];
//擋板[_paddleImageView
setCenter:_originPaddleCenter];
//磚塊
for(UIImageView*blockin
_blockImageV
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南測(cè)繪職業(yè)學(xué)院《社會(huì)體育運(yùn)動(dòng)技能與指導(dǎo)(瑜伽)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣西財(cái)經(jīng)學(xué)院《流域管理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 吉安職業(yè)技術(shù)學(xué)院《群落生態(tài)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 重慶城市科技學(xué)院《安全行為學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 新疆農(nóng)業(yè)大學(xué)《醫(yī)學(xué)影像診斷學(xué)1》2023-2024學(xué)年第二學(xué)期期末試卷
- 海南大學(xué)《中國(guó)古文名篇導(dǎo)讀》2023-2024學(xué)年第二學(xué)期期末試卷
- 安陽(yáng)幼兒師范高等專科學(xué)?!秾W(xué)位論文選題與設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 公章申請(qǐng)流程
- 抽排水施工方案
- 2025年鄉(xiāng)村醫(yī)生崗位理論知識(shí)考試模擬試題及答案(共100題)
- 2025年浙江寧波市奉化區(qū)農(nóng)商控股集團(tuán)有限公司招聘筆試參考題庫(kù)附帶答案詳解
- (一模)2025年汕頭市2025屆高三高考第一次模擬考試 語(yǔ)文試卷(含答案詳解)
- 上海浦東新區(qū)2024-2025高三上學(xué)期期末教學(xué)質(zhì)量檢測(cè)(一模)物理試卷(解析版)
- 2023年中小學(xué)心理健康教育課程標(biāo)準(zhǔn)
- 2025河南中煙工業(yè)限責(zé)任公司一線崗位招聘128人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年中國(guó)中壓變頻器行業(yè)深度調(diào)研與投資戰(zhàn)略規(guī)劃分析報(bào)告
- 2025年上半年遼寧省盤錦市大洼區(qū)招聘招商人員30人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年度旅游車租賃及景區(qū)門票代理服務(wù)協(xié)議
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招數(shù)學(xué)歷年參考題庫(kù)含答案解析
- 人教版音樂(lè)教材培訓(xùn)
- 2025安徽合肥市軌道交通集團(tuán)限公司社會(huì)招聘50人高頻重點(diǎn)提升(共500題)附帶答案詳解
評(píng)論
0/150
提交評(píng)論