这篇教程是基于我昨天发布的第一部分(上)教程的,在开始阅读这篇教程之前,请先阅读前一篇教程。
在这篇教程中,我们将会完善对地图的制作。在上一篇教程中,我们已经完成了对地图的制作:
在这篇教程中,我们将会给地图中的方块添加动画,就像原版魔塔游戏中的那样。
这篇教程的篇幅不长,其中涉及的内容并不是很多。
从这里开始
我们这里使用的是帧交换动画,也就是让地图方块中的图像不断的交换使得看上去好象方块上的怪物或者物品好象在运动,就像这样:
如果你有看过子龙山人的AnimBear教程,应该能够理解这种动画的实现方式。
在之前加入的blockInformation.plist中,已经用NSString的形式记录了方块应该使用的动画:
我们将会使用这个ID,从另一个plist文件中获取动画中的图像,所以,请把资源包的AnimationInfomation.plist、player.plist和player.png加入到工程中(因为这个plist中已经记录了玩家的动画信息,所以必须先加入玩家的图片(尽管目前还没有用到),否则程序会错误),里面已经把动画的ID和所使用的图片对应起来了:
在使用这个动画之前,我们必须把帧列表收集过来并创建一个动画对象,然后把这些动画对象集合到一个NSMutableDictionary中,方便调用。在GameLayer.m中加入如下的代码:
//声明中加入 //用于储存加载好的动画 NSMutableDictionary *animations; //dealloc中加入 [animations release]; //加入此方法 -(void)loadAnimation{ animations=[[NSMutableDictionary alloc]init]; NSMutableArray *animsArray=[[self readPlistWithPlistName:@"AnimationInformation"]objectForKey:@"AnimationInformation"]; for(NSDictionary *animDictionary in animsArray){ NSString *animName=[animDictionary objectForKey:@"AnimationID"]; NSArray *animImages=[animDictionary objectForKey:@"AnimationFrames"]; float delay=[[animDictionary objectForKey:@"Delay"]floatValue]; NSMutableArray *animFrames = [NSMutableArray array]; for(NSString *animImage in animImages) { [animFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:animImage]]; } CCAnimation *animation=[CCAnimation animationWithSpriteFrames:animFrames delay:(delay==0)?0.5:delay]; [[CCAnimationCache sharedAnimationCache] addAnimation:animation name:animName]; [animations setObject:animation forKey:animName]; } } //init中调用
//加载玩家图片(因为动画信息中已经包含了玩家的动画,如果不对玩家图片进行加载,会发生图片为nil的错误)
[[CCSpriteFrameCachesharedSpriteFrameCache]addSpriteFramesWithFile:@"player.plist"];
//加载动画 [self loadAnimation];
下面对 这些代码进行解释:前面说过了,我们需要将加载好的动画存放在一个Dictionary里面,这个Dictionary就是animations。
在loadAnimation方法中,我们首先对animations进行初始化,然后读取到AnimationsInfomation.plist中带有的所有动画信息,并放到一个数组里面,然后通过数组中的这些信息创建一个CCRepeatForever(永远循环)动画,并指定动画的延时时间(动画中的默认延时为0.5秒,如果没有指定延时时间就会选择0.5秒的延时)。并且将创建好的CCAnimation和动画名称对应起来放入到animations这个Dictionary里面。
最后,修改-(void)reloadMapBlockWithX:(int)bX Y:(int)bY Floor:(int)floor方法:
-(void)reloadMapBlockWithX:(int)bX Y:(int)bY Floor:(int)floor{ CCSprite *spriteToReload=[[mapSprites objectAtIndex:bY]objectAtIndex:bX]; //停掉之前已经在进行的动画 [spriteToReload stopAllActions]; // int thisBlock=[self blockAtFloor:floor X:bX Y:bY]; NSDictionary *currentBlockInformation=[blocksInformation objectAtIndex:thisBlock]; NSString *fileName=[currentBlockInformation valueForKey:@"UsingImage"]; CCSpriteFrame* myFrame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:fileName]; [spriteToReload setDisplayFrame:myFrame]; //如果有对应的动画,那么就让精灵套用这个动画 if(![[currentBlockInformation objectForKey:@"AnimationID"]isEqualToString:@""]){ [spriteToReload runAction:[CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:[animations objectForKey:[currentBlockInformation objectForKey:@"AnimationID"]]]]]; } // }
修改完成以后,尝试运行,便可以看到怪物都动起来了:
何去何从
这一期的教程就到此结束了。总结一下,我们已经创建好了一个魔塔游戏的地图并且让里面的怪物动起来了,这里的难度应该不算太高,大家也应该都可以理解。接下来的第二部分上将会给大家将RPG游戏中对打的算法(会相对有点枯燥)。然后第二部分下会在游戏中加入玩家,并且让玩家可以开门、拾取东西、与怪物对打等等。
估计下一篇教程需要等到下个星期才能够和大家见面,烦人的住校弄的我只能在周末抽空写代码发教程……5555
如果有需要到目前为止的源代码的,可以从这里下载到。
下次见。