FlyBird

来源:互联网 发布:手机淘宝怎么找星店 编辑:程序博客网 时间:2024/05/22 04:54

网上看到了人家写的FlyBird 但是注释很少 ,这里仅仅把人家的代码拿过来做了一个简单注释

原网站链接 有兴趣的可以去看一下源代码

http://code4app.com/ios/%E7%AC%A8%E5%B0%8F%E9%B8%9F/538eb12f933bf0a96d8b4b66

#import "BirdFlyViewController.h"//3.0初速度需要60秒减少至0const float MaxTime = 50;//加速度,方向向下const float VG = 0.05;//初速度const float MaxV = 2.5;//初始化总路程const float AllLength = 692;typedef enum {    GameNoStart,    GamePlaying,    GameOver    } GameState;@interface BirdFlyViewController (){    NSTimer *birdTimer;    //开始游戏开关    BOOL isStart;    //游戏状态    GameState gameState;        //总场景    UIView *playLayer;        //小鸟    UIImageView *birdImgView;    //小鸟的壳    UIView *birdClotherView;        //跳跃时间    float maxJumpTime;        //滚动的背景    UIView *bgView1;    UIView *bgView2;        //管道    //第一个View的第一根管道    UIView *pileImgView11;    //第一个View的第二根管道    UIView *pileImgView12;    //第二个View的第一根管道    UIView *pileImgView21;    //第二个View的第二根管道    UIView *pileImgView22;        //得分    UILabel *scoreLabel;    NSInteger score;}@end@implementation BirdFlyViewController- (void)dealloc{    [birdTimer invalidate];    playLayer = nil;    pileImgView11 = nil;    pileImgView12 = nil;    pileImgView21 = nil;    pileImgView22 = nil;}- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];    if (self) {        // Custom initialization    }    return self;}- (void)viewDidLoad{    [super viewDidLoad];        [self initBirdAndOther];        birdTimer = [NSTimer scheduledTimerWithTimeInterval:0.04                                                 target:self                                               selector:@selector(upda)                                               userInfo:nil                                                repeats:YES];}- (void)didReceiveMemoryWarning{    [super didReceiveMemoryWarning];}#pragma mark - #pragma mark - 横竖屏幕//只支持portait,不能旋转:-(BOOL)shouldAutorotate{    return NO;}-(NSUInteger)supportedInterfaceOrientations{    return UIInterfaceOrientationMaskPortrait;}#pragma mark -#pragma mark - 频率刷新- (void) upda{    //判断    if (isStart == YES && gameState == GamePlaying)    {        [self updateBird];        [self updateBg];        [self setPiles];        [self checkBirdRect];    }}#pragma mark -#pragma mark - 初始化- (void) initBirdAndOther{    //初始化总场景    playLayer = [[UIView alloc] initWithFrame:self.view.bounds];    [self.view addSubview:playLayer];    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(screenTap)];    [self.view addGestureRecognizer:tapGesture];        //初始化障碍物    bgView1 = [[UIView alloc] initWithFrame:self.view.bounds];    bgView2 = [[UIView alloc] initWithFrame:CGRectMake(320, 0, self.view.bounds.size.width, self.view.bounds.size.height)];    [playLayer addSubview:bgView1];    [playLayer addSubview:bgView2];        //中间的管道    pileImgView11 = [self addPilesAtX:0];    [bgView1 addSubview:pileImgView11];    bgView1.backgroundColor = [UIColor redColor];    pileImgView11.hidden = YES;    pileImgView21 = [self addPilesAtX:0];    [bgView2 addSubview:pileImgView21];        bgView2.backgroundColor = [UIColor blackColor];        pileImgView12 = [self addPilesAtX:160];    [bgView1 addSubview:pileImgView12];    pileImgView12.hidden = YES;    pileImgView22 = [self addPilesAtX:160];    [bgView2 addSubview:pileImgView22];        //底部草    UIImageView *buttomImg1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, [[UIScreen mainScreen] bounds].size.height - 53, 320, 53)];    buttomImg1.image = [UIImage imageNamed:@"ground"];    [bgView1 addSubview:buttomImg1];    UIImageView *buttomImg2 = [[UIImageView alloc] initWithFrame:CGRectMake(0, [[UIScreen mainScreen] bounds].size.height - 53, 320, 53)];    buttomImg2.image = [UIImage imageNamed:@"ground"];    [bgView2 addSubview:buttomImg2];        //小鸟的衣服    birdClotherView = [[UIView alloc] initWithFrame:CGRectMake(60, [[UIScreen mainScreen] bounds].size.height/2 + 80, 40, 30)];    [playLayer addSubview:birdClotherView];        //初始化小鸟    birdImgView = [[UIImageView alloc] init];    birdImgView.frame = CGRectMake(0, 0, 40, 28);    birdImgView.image = [UIImage imageNamed:@"bird"];    birdImgView.backgroundColor = [UIColor redColor];    [birdClotherView addSubview:birdImgView];        //得分    scoreLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 40, 300, 30)];    scoreLabel.textAlignment = NSTextAlignmentRight;    [playLayer addSubview:scoreLabel];    scoreLabel.text = @"score: 0";}#pragma mark -#pragma mark - 点击屏幕开始和跳跃- (void) screenTap{    //没点击一次    maxJumpTime = MaxTime;        if (isStart == NO)    {        isStart = YES;        gameState = GamePlaying;                for (UIView *tmpView in self.view.subviews)        {            [tmpView removeFromSuperview];        }                [self initBirdAndOther];    }        //仰角30度旋转    CGAffineTransform transform = CGAffineTransformIdentity;    birdImgView.transform = CGAffineTransformRotate(transform,  -30 * M_PI / 180 );}#pragma mark - 设置管道- (void) setPiles{    NSInteger tmpY = rand()%120;        if (bgView1.frame.origin.x == -53)    {        //设置第一个管道        CGRect rect = pileImgView11.frame;        rect.origin.y = tmpY - 120;        pileImgView11.frame = rect;        if (pileImgView11.hidden == YES)        {            pileImgView11.hidden = NO;        }    }    if (bgView1.frame.origin.x == -213)    {        //设置第二个管道        CGRect rect = pileImgView12.frame;        rect.origin.y = tmpY - 120;        pileImgView12.frame = rect;        if (pileImgView12.hidden == YES)        {            pileImgView12.hidden = NO;        }    }    if (bgView2.frame.origin.x == -53)    {        //设置第三个管道        CGRect rect = pileImgView21.frame;        rect.origin.y = tmpY - 120;        pileImgView21.frame = rect;    }    if (bgView2.frame.origin.x == -213)    {        //设置第四个管道        CGRect rect = pileImgView22.frame;        rect.origin.y = tmpY - 120;        pileImgView22.frame = rect;    }}#pragma mark -#pragma mark - 碰撞检测- (void) checkBirdRect{    //碰撞检测    float birdRightX = birdClotherView.frame.origin.x + 34;    float birdButtomY = birdClotherView.frame.origin.y + 24;    float birdUpY = birdClotherView.frame.origin.y;        //计算障碍物    //下面的柱子和上面的柱子检测    if ((birdRightX - 0 == bgView1.frame.origin.x && birdUpY >= 319 + (pileImgView11.frame.origin.y + 120)))    {        if (pileImgView11.hidden == NO)        {            [self gameOver];        }    }    else  if(birdRightX - 0 == bgView1.frame.origin.x && birdButtomY <= 199 + (pileImgView11.frame.origin.y + 120))    {        if (pileImgView11.hidden == NO)        {            [self gameOver];        }    }        if ((birdRightX - 160 == bgView1.frame.origin.x && birdUpY >= 319 + (pileImgView12.frame.origin.y + 120)))    {        if (pileImgView12.hidden == NO)        {            [self gameOver];        }    }    else  if(birdRightX - 160 == bgView1.frame.origin.x && birdButtomY <= 199 + (pileImgView12.frame.origin.y + 120))    {        if (pileImgView12.hidden == NO)        {            [self gameOver];        }    }        if ((birdRightX - 0 == bgView2.frame.origin.x && birdUpY >= 319 + (pileImgView21.frame.origin.y + 120)))    {        [self gameOver];    }    else  if(birdRightX - 0 == bgView2.frame.origin.x && birdButtomY <= 199 + (pileImgView21.frame.origin.y + 120))    {        [self gameOver];    }        if ((birdRightX - 160 == bgView2.frame.origin.x && birdUpY >= 319 + (pileImgView22.frame.origin.y + 120)))    {        [self gameOver];    }    else  if(birdRightX - 160 == bgView2.frame.origin.x && birdButtomY <= 199 + (pileImgView22.frame.origin.y + 120))    {        [self gameOver];    }        //上下柱子横截面检测    if (birdRightX - 0 > bgView1.frame.origin.x && bgView1.frame.origin.x >= birdRightX - 0 - 52 - 34 && (birdUpY <= 199 + (pileImgView11.frame.origin.y + 120) || birdButtomY >= 319 + (pileImgView11.frame.origin.y + 120)))    {        if (pileImgView11.hidden == NO)        {            [self gameOver];        }    }        if (birdRightX - 160 > bgView1.frame.origin.x && bgView1.frame.origin.x >= birdRightX - 160 - 52 - 34 && (birdUpY <= 199 + (pileImgView12.frame.origin.y + 120) || birdButtomY >= 319 + (pileImgView12.frame.origin.y + 120)))    {        if (pileImgView12.hidden == NO)        {            [self gameOver];        }    }        if (birdRightX - 0 > bgView2.frame.origin.x && bgView2.frame.origin.x >= birdRightX - 0 - 52 - 34 && (birdUpY <= 199 + (pileImgView21.frame.origin.y + 120) || birdButtomY >= 319 + (pileImgView21.frame.origin.y + 120)))    {        if (pileImgView12.hidden == NO)        {            [self gameOver];        }    }        if (birdRightX - 160 > bgView2.frame.origin.x && bgView2.frame.origin.x >= birdRightX - 160 - 52 - 34 && (birdUpY <= 199 + (pileImgView22.frame.origin.y + 120) || birdButtomY >= 319 + (pileImgView22.frame.origin.y + 120)))    {        [self gameOver];    }        //判断地平线    if (birdButtomY >= [[UIScreen mainScreen] bounds].size.height - 53)    {        [self gameOver];    }}#pragma mark -#pragma mark - 碰撞处理- (void) gameOver{    isStart = NO;    gameState = GameOver;    score = 0;}#pragma mark -#pragma mark - 更新小鸟的坐标位置- (void) updateBird{        maxJumpTime --;    CGRect rect = birdClotherView.frame;    //正在上升    if (maxJumpTime >= 0)    {        rect.origin.y = rect.origin.y - (MaxV - (MaxTime - maxJumpTime)*VG);    }    else    {        //下降        //俯角30度旋转        CGAffineTransform transform = CGAffineTransformIdentity;        birdImgView.transform = CGAffineTransformRotate(transform,  30 * M_PI / 180 );        rect.origin.y = rect.origin.y - (maxJumpTime*VG);    }    birdClotherView.frame = rect;}- (void) updateBg{    CGRect rect1 = bgView1.frame;    CGRect rect2 = bgView2.frame;        if (rect1.origin.x <= -320)    {        rect1.origin.x = 320;    }        if (rect2.origin.x <= -320)    {        rect2.origin.x = 320;    }        rect1.origin.x = rect1.origin.x - 1;    rect2.origin.x = rect2.origin.x - 1;        bgView1.frame = rect1;    bgView2.frame = rect2;        if (rect1.origin.x == 0 || rect1.origin.x == -160 || rect2.origin.x == 0 || rect2.origin.x == -160)    {        if (pileImgView11.hidden == YES || pileImgView12.hidden == YES)        {            return;        }                score += 1;        scoreLabel.text = [NSString stringWithFormat:@"score: %d",score];    }}#pragma mark -#pragma mark - 产生障碍物 一次添加上下两根障碍物- (UIView *) addPilesAtX:(float) originX{    /**     *  pileView的大小是固定的     *  应为frame的关系所以每次显示在屏幕上的给人的感觉是自动算出来的大小     */    NSInteger tmpY = rand()%120;    //0位置和160的未知 山下间隔120px    UIView *pileView = [[UIView alloc] initWithFrame:CGRectMake(originX, tmpY - 120, 52, 758)];        UIImageView *pileImg1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 52, 319)];    pileImg1.image = [UIImage imageNamed:@"up_bar"];    [pileView addSubview:pileImg1];    UIImageView *pileImg2 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 439, 52, 319)];    pileImg2.image = [UIImage imageNamed:@"down_bar"];    [pileView addSubview:pileImg2];        return pileView;    }@end


0 0
原创粉丝点击