第一个IOS游戏——伞公主开发总结

2024-02-18 21:18

本文主要是介绍第一个IOS游戏——伞公主开发总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

伞公主是我们项目组的第一个项目,耗时4个月,基本上是边学边做,学习到了很多东西,也遇到很多问题,现在做一下整个项目的总结。


伞公主整体的框架分为:怪物类、道具商城类、游戏开始类、主界面类等。


一、怪物类的属性包括:血数,是否隐身,难度。

二、游戏开始类有声音、道具商城、进入游戏、排行榜按钮。1. 声音控制采取_music变量来识别,并且在其他类中引入该全局变量externBOOL _music 。2. 点击排行榜时,读取程序中在NSUserDefaults保存的名字以及分数变量,游戏结束后,如果进入排行榜,则会在相应的地方给出label,可以添加自己的名字。添加名字时点击done(调用textFieldDone方法,在monsterComeUp类中)或者软键盘以外的地方(调用 [[CCTouchDispatchersharedDispatcher]addTargetedDelegate:selfpriority:0swallowsTouches:YES];以及  ccTouchBegan:方法)可以取消键盘的焦点状态。在程序中读取保存的数据的方法在monsterComeUp中的gettopscore方法中,    _topscore[0] =[saveDefaults integerForKey:@"key1"];另外需要注意的一点是判断是否为空的方法是,如果为空则为假,非空为真,而非是==@“”或者isEqualToString之类的方法。

三、主界面类。


init为初始化方法,初始化变量、载入马和公主精灵,初始化数组(_monsters= [[NSMutableArrayalloc]init];一定要注意,否则后期会报错,而且是很隐蔽的错误,一般很难想到是没有初始化数组这种低级错误),调用[selfinitScrollingBackgroundWithTileMap];载入地图,开启定时器,定时调用update方法([selfschedule:@selector(method:)interval:time];)。

添加马的方法和添加公主的方法类似,子龙山人的博客也讲的很详细。主要用到的是用spritesheet生成了动画,不过前提是需要处理下图片文件,用Zwoptex生成plist文件。下面把代码贴出来了,以供今后使用。

-(void)horseAdd

{

    

    // 1) 缓冲sprite帧和纹理

    [[CCSpriteFrameCachesharedSpriteFrameCache]addSpriteFramesWithFile:

     @"cao.plist"];

    

    // 2)创建一个精灵批处理结点

    CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode 

                                      batchNodeWithFile:@"cao.png"];

    [self addChild:spriteSheet z:11];

    

    // 3) 收集帧列表

    NSMutableArray *walkAnimFrames = [NSMutableArrayarray];

    for(int i =1; i <=10; ++i) 

    {

        [walkAnimFrames addObject:

         [[CCSpriteFrameCachesharedSpriteFrameCache]spriteFrameByName:

          [NSStringstringWithFormat:@"cao%d.png", i]]];

    }

    // 4) 创建动画对象

    

    CCAnimation *walkAnim = [CCAnimation 

                             animationWithFrames:walkAnimFrames delay:0.1f];

    // 5) 创建sprite并且让它run动画action

    

    self.horse = [CCSpritespriteWithSpriteFrameName:@"cao1.png"]; 

    _horse.position =ccp(width/2,height/5*2);

    self.horseWalkAction = [CCRepeatForeveractionWithAction:

                            [CCAnimateactionWithAnimation:walkAnimrestoreOriginalFrame:NO]];

    [_horserunAction:_horseWalkAction];

    [spriteSheet addChild:_horse];

    

}

update方法是隔很短时间就调用的方法,在本工程里主要用来处理除公主和怪物之外的碰撞监测(该监测是在updateCollision:(ccTime)dt中处理的),另外遍历_monsters数组(for(Monster *monsterin _monsters)),添加怪物头上显示的血量。处理碰撞监测的时候是用了取图片的四周坐标,组成一个长方形来监测碰撞(CGRect monsterRect =CGRectMake( , , , )),这种方法比较简单,但是对于那些实体为非长方形的图形就不再适用了,如半圆形的防护罩,这里采用的方法是计算怪物和马的距离,如果是防护罩的半径与怪物半径之和,则产生碰撞。如果怪物碰到马而且马的命数降至为0,则游戏结束,背景变暗,按钮失效,在原有的场景基础上加载排行榜。

cocos2d中,处理按下是自动调用的-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 方法,处理滑动是- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event方法,处理按下松开是调用-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event方法。另外,使精灵反转调用的是.flipX=YES/NO参数。

添加按钮(- (void) addButton)。这里调用的是ccMenuItem,如quanpMenuItem = [CCMenuItemImageitemFromNormalImage:@"quanp1-2.png"selectedImage:@"quanp1-3.png"disabledImage:@"quanp1-3.png"target:selfselector:@selector(alldel:)];

按下后执行alldel方法。值得一提的是CD效果,以quanpMenuCD为例,首先载入:    

quanpMenuCD = [CCProgressTimerprogressWithFile:@"hui.png"];

quanpMenuCD.position =quanpMenuItem.position

 [selfaddChild:quanpMenuCDz:45];

然后调用方法进行CD效果的运转:        

[quanpMenuCDrunAction:[CCSequenceactions: [CCProgressFromToactionWithDuration:5.0ffrom:100to:0],done,nil]];

全屏攻击。在这里说明的是粒子效果。

    //粒子效果

    CCParticleSystem* particleAlldel;

[selfremoveChildByTag:32cleanup:YES];

    particleAlldel = [CCParticleExplosionnode];

    particleAlldel.position =_princess.position;

    [selfaddChild:particleAlldelz:10tag:32];

调用定时执行的方法前先取消调用,再重启,防止多次调用:

     [self unschedule:@selector(alldelTimer:)];

     [self schedule:@selector(alldelTimer:) interval:0.1];

。另外,删除数组里面的元素时要制作一个副本再删除,否则用for循环遍历数组时边改边删会出错,方法如下:

    //获取怪物副本以删除怪物,否则会报错

    NSArray *copied_outmonsters = [_monsters copy];

    for (Monster* monsterin copied_outmonsters) 

    {

        //删除屏幕之外所有的怪物

        if (monster.sprite.position.x<=-monster.sprite.contentSize.width/2||monster.sprite.position.x>=width+monster.sprite.contentSize.width/2

            ||monster.sprite.position.y<=-monster.sprite.contentSize.height/2||monster.sprite.position.y>=height+monster.sprite.contentSize.height/2)

        {

            [self removeChild:monster.sprite cleanup:YES];

            [monster.sprite.parent removeChild:monster.sprite cleanup:YES];

            [_monsters removeObject:monster];

        }

        

    }

    [copied_outmonsters release];

有必要提出的是action,包括

[CCRotateBy actionWithDuration:3 angle:360.0f];//雪花旋转 

[CCRepeatForever actionWithAction:actionRotate];  

[CCMoveTo actionWithDuration:moveDuration position:goalPosition]; 

[CCCallFuncN actionWithTarget:self selector:@selector(propertyEnded:)];

[CCSequence actions:actionMove,stayAction,done,nil]];

关于游戏的流程方面,包括三种方法:replaceScene 、pushScene和popScene方法。下面是解释后两个方法的利弊的链接:http://book.51cto.com/art/201201/311840.htm。在replay方法中,就是用到了replaceScene方法,不过还有三行代码需要用到:

    [[CCDirector sharedDirector] replaceScene:[monsterComeUp scene]]; 

    [[CCDirector sharedDirector] stopAnimation];// call this to make sure you don't start a second display lin!

    [[CCDirector sharedDirector] resume];

    [[CCDirector sharedDirector] startAnimation];

最后,在dealloc中注意释放数组和节点以及动作变量,记得要调用[super dealloc];


总得说来,有这么几点经验以后的项目中需要注意,尤其是游戏的项目:1. 一定要提前处理好z轴的分配,多冗余些没什么坏处的。 2. 该封装起来的方法一定要封装起来,如果需要在该基础上进行进一步的处理,就要仔细考虑下是在调用该方法的后面继续添加代码,还是在已经封装好了的方法中添加。3. 是一个细节,也浪费了我和黎明漫长的时间来搞懂到底是哪出错了,就是在action里,调用无参数的selector是用CCCallFunc方法,而调用有参数的selector除了要在方法后加上:之后,调用的函数也有细微的变化,变为了CCCallFuncN。哎~ 4. 在前期就要把图片、声音素材资源在项目中分类好,名字要主流些,否则到最后很乱和很杂,不易分类不说,还有可能重复添加了资源。

这次项目没有处理的问题:1. 简单调用

[[CCDirectorsharedDirector]stopAnimation];

[[CCDirectorsharedDirector]pause];

[[SimpleAudioEnginesharedEngine]stopBackgroundMusic];

在原有的场景上进行暂停之后,由于是在pause状态,如何处理按下图片的更替。2.地图的问题,采用的titlemap,但是效果不太理想,占用的内存过大,而且代码量加大,应该还有更好的方法。

这个项目从2011年11月3号文档开始到了之后开始做,用了有将近4个月的时间,也学习到了很多,但是觉得这种模式不太对,前期做的学习远远不够,造成到了后期摸着石头过河,项目进展相当慢,而且遇到了问题往往需要解决很长的时间,也反反复复修改了很多代码,以后要尽可能多学些东西再正事着手做。


另外,附上:

加载地图总结

判断网络连接状态的总结

 如何实现iPhone应用下的IAP--在应用内购买

IAP(程序内购买): 完全攻略 有关发布程序的内容也在里面。

@end


这篇关于第一个IOS游戏——伞公主开发总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/722479

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的