由于这段时间工作比较忙,导致没有时间写教程,在这里先给大家道个歉。
在上一章中我们顺利的完成了我们的滚动背景。现在我们还差我们的主角,那只笨笨的小鸟!
为了让小鸟更好的模拟下坠效果,我们应该先为场景添加物理效果。修改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,今天就先到这里!我又得码代码了!