#在蓝懿学习iOS的日子#Day10

#在蓝懿学习iOS的日子#Day10今天做了一个大的游戏,涵盖了这段时间学习的知识,页面的切换字符串,还有可变数组和遍历等知识点。

一、界面的背景
1、显示搭建HomeViewController添加背景,创建一个SelectedViewController,添加一个button点击进入下一个SelectedViewController;
2、在SelectedViewController搭建视图添加背景,创建一个英雄hero类,把不同的英雄连接进同一个button,设置tag用以区分hero类;创建一个游戏ViewController在点击button进入游戏页面,
3、在LevelOneViewController添加移动的背景视图,//第二张图片放在第一张的上面,y:-self.view.frame.size.height

-(void)initBG{

    //添加背景图片

    self.bgIV1 = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height)];

//第二张图片放在第一张的上面,y:-self.view.frame.size.height

    self.bgIV2 = [[UIImageView alloc]initWithFrame:CGRectMake(0, -self.view.frame.size.height,self.view.frame.size.width, self.view.frame.size.height)];

    self.bgIV1.image = [UIImage imageNamed:@"img_bg_level_1.jpg"];

    self.bgIV2.image = [UIImage imageNamed:@"img_bg_level_1.jpg"];

    //插入子控件到某个位置,把背景图片放最下边

    [self.view insertSubview:self.bgIV1 atIndex:0];

    [self.view insertSubview:self.bgIV2 atIndex:0];

    

    //给 背景的移动设置TImer

    [NSTimer scheduledTimerWithTimeInterval:1.0/60 target:self selector:@selector(moveBG) userInfo:nilrepeats:YES];
   }

-(void)moveBG{

    //设置图片往下移动y+1

    self.bgIV1.center = CGPointMake(self.bgIV1.center.x, self.bgIV1.center.y+1);

    self.bgIV2.center = CGPointMake(self.bgIV2.center.x, self.bgIV2.center.y+1);

    

    //两张图片的衔接

    if (self.bgIV1.center.y>=self.view.frame.size.height*1.5) {

        

        self.bgIV1.center = CGPointMake(self.bgIV1.center.x, -self.view.frame.size.height/2);

    }

    if (self.bgIV2.center.y>=self.view.frame.size.height*1.5) {

          self.bgIV2.center = CGPointMake(self.bgIV2.center.x, -self.view.frame.size.height/2);
    }
二、选择飞机、添加飞机
1、选择飞机:创建一个英雄hero类,把不同的英雄连接进同一个button,设置tag用以区分hero类;
 vc.heroID = sender.tag;
创建一个LevelOneViewController在点击button进入游戏页面,hero类在运用创建工厂方法创建Hero
(1)英雄hero类.h添加一个有参数的工厂方法
//声明方法
+(Hero*)heroWithID:(long)heroID andFrame:(CGRect)frame;
(2)英雄hero类.m使用有参数的工厂方法
+(Hero *)heroWithID:(long)heroID andFrame:(CGRect)frame{
    Hero *h = [[Hero alloc]initWithFrame:frame];
   //用字符串对象变量图片
    NSString *name = [NSString stringWithFormat:@"hero%ld.png",heroID];
    h.image = [UIImage imageNamed:name];
    return h;
}
(3)在LevelOneViewController.m使用有参数的工厂方法添加的对象
-(void)initHero{
    //添加hero
    self.hero = [Hero heroWithID:self.heroID andFrame:CGRectMake(150, 550, 80, 100)];
   
    [self.view addSubview:self.hero];
}
//手指触摸屏幕的时候会调用此方法 从此方法中得到触摸屏幕的坐标
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    //得到触摸的点
    UITouch *t = [touches anyObject];
    CGPoint p = [t locationInView:self.view];
   
    self.hero.center = p;
}
三、加子弹
(1)英雄hero类.h添加
//声明可变数组
@property (nonatomic, strong)NSMutableArray *bullets;
2)英雄hero类.m
 //调用开火的方法
    [h beginFire];
-(void)beginFire{
    //子弹可变数组初始化
    self.bullets = [NSMutableArray array];
    //给子弹的出现添加timer
    [NSTimer scheduledTimerWithTimeInterval:.2 target:self selector:@selector(addbulletAction) userInfo:nil repeats:YES];
    //开启timer 移动子弹
    [NSTimer scheduledTimerWithTimeInterval:1.0/60 target:self selector:@selector(moveBullet) userInfo:nil repeats:YES];
}
-(void)moveBullet{
   //遍历数组self.bullets
    for (UIImageView *b in self.bullets) {
        b.center = CGPointMake(b.center.x, b.center.y-5);
        //当子弹飞出界面
        if (b.center.y<0) {
            [b removeFromSuperview];
            [self.bullets removeObject:b];
            break;
        }
       
    }
   
}
-(void)addbulletAction{
    //添加子弹图片
    UIImageView *bulletIV = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 15, 20)];
    bulletIV.image = [UIImage imageNamed:@"myb_2.png"];
    //移动子弹
    bulletIV.center = CGPointMake(self.center.x, self.center.y-20);
     //将子弹图片添加进视图
    [self.superview addSubview:bulletIV];
    [self.bullets addObject:bulletIV];
   
}
四、添加敌机(Enemy):创建Enemy的父类,并且创建四个子类,再创建一个敌机的大Boss继承父类 ,Enemy作为B类反向传值给A类的LevelOneViewController
(1)敌机(Enemy)类.h添加相关的变量,
//速度
@property (nonatomic)float speed;
//图片
@property (nonatomic, copy)NSString *name;
//timer
@property (nonatomic, strong)NSTimer *timer;
//在B类.h中声明一个A类型的属性delegate为weak
@property (nonatomic, weak)LevelOneViewController *delegate;
(2)敌机(Enemy)类.m添加timer控制敌机的出现和移动,并到子类里给相关的变量赋值
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
       self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0/60 target:self selector:@selector(moveAction) userInfo:nil repeats:YES];

    }
    return self;
}
-(void)moveAction{
   
    self.center = CGPointMake(self.center.x, self.center.y+self.speed);
    //离开页面的时候
    if (self.center.y>667) {
       
        [self.timer invalidate];
        [self removeFromSuperview];
        //在B类中通过self.delegate去调用A类中的方法
        [self.delegate removeEnemy:self];
       
    }
   
}

-(void)dead{
   
    self.image = [UIImage imageNamed:@"dead_1.png"];
 
   
    //让控件的透明度为0 并且以动画的形式展现
   
    [UIView animateWithDuration:.5 animations:^{
        self.alpha = 0;
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
    }];
   
}
 
(3)在LevelOneViewController.m添加Enemy和Boss的对象
-(void)addEnemy{
   
    int type = arc4random()%4;
   
    Enemy *e = nil;
    switch (type) {
        case 0:
            e = [[EnemyA alloc]initWithFrame:CGRectMake(arc4random()%(int)(self.view.bounds.size.width-100), -80, 60, 80)];
            break;
        case 1:
            e = [[EnemyB alloc]initWithFrame:CGRectMake(arc4random()%(int)(self.view.bounds.size.width-100), -80, 60, 80)];
           
            break;
        case 2:
            e = [[EnemyC alloc]initWithFrame:CGRectMake(arc4random()%(int)(self.view.bounds.size.width-100), -80, 60, 80)];
            break;
        case 3:
            e = [[EnemyD alloc]initWithFrame:CGRectMake(arc4random()%(int)(self.view.bounds.size.width-100), -80, 60, 80)];
            break;
    }
    //在A类.m中创建B类的时候给B类的delegate赋值为self
    e.delegate = self;
    [self.view addSubview:e];
    [self.enemys addObject:e];
   
}
//在A类.h中声明一个要调用的方法的使用
-(void)removeEnemy:(Enemy *)enemy{
   
    [self.enemys removeObject:enemy];
   
}
//添加Boss
    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(addBoss) userInfo:nil repeats:NO];
-(void)addBoss{
//boss对象
    Boss *boss = [[Boss alloc]initWithFrame:CGRectMake(100, -200, 200, 200)];
    [self.view addSubview:boss];
  
    [self.enemys addObject:boss];
五、子弹和敌机碰撞
 
六、Boss和得分
 
七、游戏结束和飞机碰撞 
posted @ 2015-11-02 21:24  一笑抿江湖  阅读(100)  评论(0编辑  收藏  举报