捕鱼达人项目开发过程文档一、游戏资源文件image 图片:包括火炮,鱼,子弹,渔网,金币,数字,背景图片以及其它UI 图片 CCFish 类:实现鱼的曲线路线的移动与各种鱼捕捉概率的设置UINumber 类与UIRollNumber 类二、游戏基本结构确定及搭建 图1.1 依次在项目中创建如有图类完成项目结构,在总体上把握项目实现内容三、详细设计与各功能模块的实现程序编写流程1. 系统菜单场景:1) 添加初始化方法2) 添加菜单3) 添加菜单选项方法2. 游戏场景1) 添加初始化方法2) 添加纹理图集载入方法3) 添加UI 设计方法4) 添加触摸事件处理方法5) 添加自动补充鱼更新方法6) 添加碰撞检测方法3. 设置页面4. 帮助场景游戏重要模块详细实现1. 纹理图集的使用与加载要点:精灵处于界面中的层次关系,如下为纹理图集加载代码[[CCSpriteFrameCache sharedSpriteFrameCache ] addSpriteFramesWithFile :@"fish.plist"];fishSheet = [CCSpriteBatchNode batchNodeWithFile :@"fish.png"];[self addChild :fishSheet z :100];2. UI 设计的细节实现要点:各个UI 部件(精灵)的层次,位置调整以及武器的更换动作设置,下面为UI 实现代码-(void ) initUI {SysMenu(scene)GameMain(scene) Setting (layer)Help (scene)CGSize winSize = [[CCDirector sharedDirector] winSize];CCSprite * background = [CCSprite spriteWithFile:@"bj00.jpg"];background.position = ccp(winSize.width * 0.5, winSize.height * 0.5);[self addChild:background z:0];//添加能量槽CCSprite *engryBox =[CCSprite spriteWithFile:@"ui_2p_004.png"];engryBox.anchorPoint = ccp(0.5, 0.5);engryBox.position = ccp(winSize.width/2,10);[self addChild:engryBox z:10];//添加能量箭头energyPointer = [CCSprite spriteWithFile:@"ui_2p_005.png"];energyPointer.anchorPoint = ccp(0.5,0.5);energyPointer.position = ccp(winSize.width/2,10);energyPointer.rotation = minEnergyRotation;[self addChild:energyPointer z:12];//添加顶部框体CCSprite *bgExp =[CCSprite spriteWithFile:@"ui_box_01.png"];bgExp.position = ccp(winSize.width/2, winSize.height);bgExp.anchorPoint = ccp(0.5f,1.0f);[self addChild:bgExp z:101];//添加底框CCSprite *bgNum =[CCSprite spriteWithFile:@"ui_box_02.png"];bgNum.position = ccp(bgNum.contentSize.width/2, 0);bgNum.anchorPoint = ccp(0.5f,0);[self addChild:bgNum z:101];//添加武器cannnon = [CCCannon spriteWithSpriteFrameName: [NSStringstringWithFormat:@"actor_cannon1_%i1.png",1]];cannnon.cannonLevel = 1;cannonLevel = 1;cannnon.anchorPoint = ccp(0.5f,0.5f);cannnon.position = ccp(winSize.width/2,30);cannnon.scale = cannon_scale;cannnon.cannonType = nomal;[cannonSheet addChild:cannnon];//添加“+”,“-”按钮(待改)[CCMenuItemFont setFontSize:32];[CCMenuItemFont setFontName:@"Arial"];CCMenuItem * addItem = [CCMenuItemFont itemFromString: @"+"target:self elector:@selector(addCannonLeave)];//addItem.scale = 1.5;CCMenu * addMenu = [CCMenu menuWithItems:addItem,nil];addMenu.position = ccp(winSize.width*0.5+30, 10);[addMenu alignItemsVertically];[self addChild:addMenu z:102 ];CCMenuItem * reduceItem = [CCMenuItemFont itemFromString: @"-"target:selfselector:@selector(reduceCannonLeave)];CCMenu * reduceMenu = [CCMenu menuWithItems:reduceItem,nil];reduceMenu.position = ccp(winSize.width*0.5-30, 10);[reduceMenu alignItemsVertically];[self addChild:reduceMenu z:102];//初始化金币数gold = [[UIRollNumber alloc]init];[gold setNumber:originGold];[gold setPosition:ccp(168, 10)];[self addChild:gold z:102];}-(void)addCannonLeave{CGSize winSize = [[CCDirector sharedDirector] winSize];cannonLevel++;If(cannonLevel == 8)cannonLevel = 1;//remove cannonCCScaleTo * narrow = [CCScaleT o actionWithDuration:0.1f scale:0.1];CCCallFuncO * removeCannon = [CCCallFuncO actionWithTarget:self selector:@selector(removeCannon:) object:cannnon];CCSequence *bowDismissSequence = [CCSequence actions:narrow,removeCannon,nil];[cannnon runAction:bowDismissSequence];//add a new cannoncannnon = [CCCannon spriteWithSpriteFrameName:[NSStringstringWithFormat:@"actor_cannon1_%i1.png",cannonLevel]];cannnon.cannonLevel = cannonLevel;cannnon.position = ccp(winSize.width*0.5,30);cannnon.scale = 0.1f;CCDelayTime * delayTime = [CCDelayTime actionWithDuration:0.1f];CCScaleTo * appear = [CCScaleT o actionWithDuration:0.1f scale:cannon_scale];CCSequence * bowAppearSequence = [CCSequence actions:delayTime,appear,nil];[cannnon runAction:bowAppearSequence];[cannonSheet addChild:cannnon z:100];}//删除武器用于武器改变-(void)removeCannon:(id)sender{//CCLOG(@"removeBow");CCCannon * sp = sender;[cannonSheet removeChild:sp cleanup:YES];}3.触摸事件模块要点:子弹、大炮的跟随转向,子弹射出速度设置,越界判定(移动出画面)-(void) setAngle:(CGPoint)point sprite:(CCSprite *)sp{//CCLOG(@"setAngle");//设置“旋转角度”int offX = point.x - cannnon.position.x;int offY = point.y - cannnon.position.y;if (offY <= 0) {return;}float ratio = (float)offY /(float)offX; //直角三角形float angle = atanf(ratio)/M_PI*180; //三角形正切值获得角度if (angle < 0) {cannnon.rotation = -(90+angle);//设置武器旋转角度sp.rotation = cannnon.rotation;} else if (angle > 0) {cannnon.rotation = 90 - angle;sp.rotation = cannnon.rotation;}}#pragma touch menthed- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{for (UITouch *touch in touches){CGPoint pos = [touch locationInView:touch.view];pos = [[CCDirector sharedDirector] convertToGL:pos];if (pos.y <= cannnon.position.y) {return;}if (cannnon.cannonType == laser) { //如果当前为超级武器,} else {[cannnon setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache]spriteFrameByName:[NSStringstringWithFormat:@"actor_cannon1_%i2.png",cannnon.cannonLevel]]];}[self setAngle:pos sprite:nil];}}- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{for (UITouch *touch in touches) {CGPoint pos = [touch locationInView:touch.view];pos = [[CCDirector sharedDirector] convertToGL:pos];[self setAngle:pos sprite:nil];}}- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{for (UITouch *touch in touches){CGSize winSize = [[CCDirector sharedDirector] winSize];CGPoint pos = [touch locationInView:touch.view];pos = [[CCDirector sharedDirector] convertToGL:pos];int offX = pos.x - cannnon.position.x;int offY = pos.y - cannnon.position.y;if (offY <= 0) {return;}if(cannnon.cannonType == laser){//用超级能量捕捉动物(待改)cannnon.cannonType = nomal; //发射完毕还原武器}else{//***************(待改)*******************[gold setNumber:([gold getNumber]-cannnon.cannonType)];//每次损耗CCBullet *bullet = [CCBullet spriteWithSpriteFrameName:[NSStringstringWithFormat:@"bullet0%i.png",cannnon.cannonLevel]]; //添加子弹bullet.position = cannnon.position;bullet.isHit = NO;[self setAngle:pos sprite:bullet];// Determine where we wish to shoot the projectile toint realY = winSize.height + bullet.contentSize.height*0.5;float ratio = (float) offX / (float) offY;int realX = (realY - cannnon.position.y)* ratio + cannnon.position.x;CGPoint realDest = ccp(realX, realY);// 子弹会于一个恒定的速率按照射击方向前进int offRealX = realX - cannnon.position.x;int offRealY = realY - cannnon.position.y;float length = sqrtf((offRealX*offRealX)+(offRealY*offRealY));//一旦我们有了距离,我们只是除以速度,以获得所需的时间。