《Cocos2D-iPhone 游戏开发之路》第5节 高仿<Flappy Bird>教程(3)

由于这段时间工作比较忙,导致没有时间写教程,在这里先给大家道个歉。

在上一章中我们顺利的完成了我们的滚动背景。现在我们还差我们的主角,那只笨笨的小鸟!

为了让小鸟更好的模拟下坠效果,我们应该先为场景添加物理效果。修改GameScene的类扩展及init方法如下:

@interface GameScene ()
{
    int speed;


    CCSprite * _bird;
    CCAnimation * _birdFly;
    CCSprite * _getReady;
    CCSprite * _taptap;
    
    CCPhysicsNode * world;
}
@property (nonatomic, strong) NSMutableArray * parallaxRollSpriteBox;
@end

添加的变量将在下文中用到并做解释


- (id)init
{
    if ((self = [super init])) {
        self.userInteractionEnabled = YES;
        [self initPhysics];
        CCNodeColor * backGround = [CCNodeColor nodeWithColor:[CCColor colorWithCcColor3b:ccc3(60, 176, 205)]];
        [self addChild:backGround];
        [self initSpriteFrameCache];
        [self initBackGround];
        [self birdGetReady];
        speed = 10;
    }
    return self;
}

先调用initPhysic为场景节点添加物理仿真,现实方法如下:

- (void)initPhysics
{
    world = [CCPhysicsNode node];
    world.gravity = ccp(0, -2000);
    world.collisionDelegate = self;

    [self addChild:world z:1];

    world.debugDraw = YES;
}

让我们看看这个方法干了些什么,首先我们生成了一个集成于CCPhysicsNode的物理子节点world,这里可以理解为我们创建了一个物理世界。然后我们设置了这个世界的重力为x轴0,y轴为向下的2000。接着我们将这个世界的碰撞代理设置为了场景本身,然后将这个世界添加到了我们的场景中,最后我们开启了物理世界的诊断绘制,这样在你的程序运行中,所有的物理体都会被添加上特殊的标识让我们更加清楚你的物理世界是否运行正常。完成这一步之后,程序运行的每一帧都会模拟这个本场景下的所有物理体的运动。现在运行你的程序,你会发现一切都没有改变,虽然我们的场景中有许多精灵,但他们现在还不是物理体,所以他们现在不会受到物理世界的影响。


接下来我们把我们的小鸟添加到我们的场景中,现实birdGetReady方法,代码较长,让我们在代码中来看看做了些什么!

- (void)birdGetReady
{

    _bird = [CCSprite spriteWithImageNamed:@"bird2.png"]; //生成一个小鸟精灵
    _bird.position = ccp(Screen_Size.width/4, Screen_Size.height/2);//设置小鸟的位置

   //为小鸟生成一个圆形的物理实体,半径为小鸟长度一半,中心为小鸟的中心
    _bird.physicsBody = [CCPhysicsBody bodyWithCircleOfRadius:_bird.contentSize.height/2 andCenter:ccp(_bird.contentSize.width/2, _bird.contentSize.height/2)];

   //将小鸟的物理体设置为静态,这时候小鸟将不受到重力和碰撞的影响
    _bird.physicsBody.type = CCPhysicsBodyTypeStatic;

   //将小鸟添加到物理世界中
    [world addChild:_bird];
   

   //下面一小段使用spriteFrame生成了一个帧动画,模拟小鸟的飞行动作,一共3帧,间隔0.05秒。
    CCSpriteFrameCache * frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
    _birdFly = [CCAnimation animationWithSpriteFrames:@[[frameCache spriteFrameByName:@"bird3.png"],[frameCache spriteFrameByName:@"bird1.png"],[frameCache spriteFrameByName:@"bird2.png"]] delay:0.05];


  //创建一个飞行动画让其无限循环飞行动作,这样看起来我们的小鸟就在不停的飞行了!
    id flying = [CCActionRepeatForever actionWithAction:[CCActionAnimate actionWithAnimation:_birdFly]];
    [_bird runAction:flying];
   

  //创建一个上下移动的动画并让小鸟无限循环该动画!
    id waving = [CCActionRepeatForever actionWithAction:[CCActionSequence actions:[CCActionMoveBy actionWithDuration:0.5 position:ccp(0, +50)],[CCActionMoveBy actionWithDuration:0.5 position:ccp(0, -50)], nil]];
    [_bird runAction:waving];


  //在屏幕上添加getReady的标识。
    _getReady = [CCSprite spriteWithImageNamed:@"getReady.png"];
    _getReady.position = ccp(Screen_Size.width/2, Screen_Size.height * 0.7);
    [self addChild:_getReady];
   

  //在屏幕上添加点击提示表示。
    _taptap = [CCSprite spriteWithImageNamed:@"taptap.png"];
    _taptap.position = ccp(Screen_Size.width/2, Screen_Size.height * 0.5);
    [self addChild:_taptap];
}

建议初学者在上述方法的每一步都运行一下你的程序,这样你可以更好的了解每一步都做了些什么,但最后我们要得到的效果应该如下图:


我们的小鸟出现在了屏幕的中间靠左的位置,不断的上下移动并拍打着翅膀,仔细观察你会发现小鸟的身体中被一个浅红色的圆形笼罩,这个边是world的调试绘制,标识了小鸟的物理体。同学可能已经发现,图中的地为什么也是红色的,那是因为我已经为地添加上了物理体,现在你可以自己尝试为地面添加物理体,也可以用以下代码实现:

修改initBackGround方法中生成地面的语句:

    CCSprite * ground = [CCSprite spriteWithImageNamed:@"ground.png"];
    ground.anchorPoint = ccp(0, 0);
    ground.position = ccp(0, 0);
    ground.physicsBody = [CCPhysicsBody bodyWithRect:CGRectMake(0, 0, 768, 200) cornerRadius:0];
    ground.physicsBody.type = CCPhysicsBodyTypeStatic;
    [world addChild:ground];

在创建物理体的时候应该注意2点:1.任何时候都应该先生成物理体再对其进行设置,2.物理体应当添加至物理世界world中,而不应该像普通节点那样添加至父节点中。

完成了上述代码,现在运行你的程序,应该和上面看到的一样了!


不错,我们的游戏已经很像是那么回事儿了!现在我们要来自己控制小鸟!这里我先给大家一些提示,好让大家自己去试试如何加入互动,也给大家一些时间来消化本章节的内容。

首先监听场景的toucheBegan方法,当第一次触摸开始时,移除getready标识及点击标识。

接着设置小鸟的物理体为动态,并给小鸟一个向上的速度,这时小鸟将会参与到物理世界的模拟中,小鸟将会受到重力影响减速并最后落到地面上,玩家必须不断的点击屏幕来让小鸟不掉下来。

我会尽快将这部分的代码在下一节的文章中为大家详细解说!OK,今天就先到这里!我又得码代码了!




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值