Cocos2D两个方法的重构一例
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
在RPG游戏项目的GameSpace类中原来有一个方法:
-(instancetype)initWithGameScene:(GameScene *)gameScene mapName:(NSString*)mapName;
功能主要为用指定的地图初始化游戏空间布局,后来由于使用方便的原因,增加了一个类似的方法:
-(instancetype)initWithGameScene:(GameScene *)gameScene mapName:(NSString *)mapName
spawnAtTilePos:(CGPoint)tilePoint;
该方法比原来的方法仅仅多了一个参数,用来初始化player出现在地图场景中的瓦块位置.
这样就出现了功能类似的2个方法,这势必造成代码的重复,会对将来的代码修改带来非常坏的影响,所以今天我们就想办法对其重构.
首先我们将第一个方法前面的几行代码提炼出去,形成一个新的方法:
-(void)instancePreInit:(GameScene*)gameScene mapName:(NSString*)mapName{
_viewSize = [CCDirector sharedDirector].viewSize;
_gameScene = gameScene;
_tiledMap = [CCTiledMap tiledMapWithFile:mapName];
_tiledMap.anchorPoint = ccp(0, 0);
[self addChild:_tiledMap];
_mh = [[MapHelper alloc]initWithGameScene:gameScene andTiledMap:_tiledMap];
CCTiledMapLayer *barrierLayer = [_tiledMap layerNamed:@"BarrierLayer"];
barrierLayer.visible = NO;
_objGroup = [_tiledMap objectGroupNamed:@"Objects"];
_gd = [GameData sharedInstance];
_bgLayer = [_tiledMap layerNamed:@"BGLayer"];
NSAssert(_bgLayer, @"ERR:地图中没有_bgLayer层!!!");
}
然后在2个方法中分别用该方法替换原有的代码:
-(instancetype)initWithGameScene:(GameScene *)gameScene mapName:(NSString *)mapName
spawnAtTilePos:(CGPoint)tilePoint{
self = [super init];
if (self) {
//原功能代码
[self instancePreInit:gameScene mapName:mapName];
//其他代码
另一个方法也类似,现在我们来处理后面的代码.
现在创建后续初始化方法,把以上两个方法的后半段代码抽取到其中:
-(void)instanceSufInit:(CGPoint)spawnPos{
GameData *gd = [GameData sharedInstance];
NSString *className = gd.players[0][@"playerName"];
_panda = [GameCharacter gcWithName:className wihtGameScene:_gameScene];
_panda.position = spawnPos;
self.contentSize = [CCDirector sharedDirector].viewSize;
[_bgLayer addChild:_panda z:50];
[self setPlayerFaceTo];
if (gd.players.count > 1) {
GameCharacter *followGC = nil;
GameCharacter *targetGC = _panda;
NSInteger maxFollowCount = MIN(2, gd.players.count-1);
for (int i = 1; i <= maxFollowCount; i++) {
className = gd.players[i][@"playerName"];
followGC = [GameCharacter gcWithName:className wihtGameScene:_gameScene];
[_bgLayer addChild:followGC];
[followGC follow:targetGC];
targetGC = followGC;
}
}
self.userInteractionEnabled = YES;
_walkableTiles = [NSMutableArray array];
[self initWalkableTiles];
_npcArray = [NSMutableArray array];
_interactThingAry = [NSMutableArray array];
_followAry = [NSMutableArray array];
}
但是在第一个方法中,对瓦块坐标要做一些修正以居中在瓦块显示,但在第二个方法中不需要修正,所以先要将这点重构之然后再调用后缀方法:
CGPoint spawnPos = [self getPlayerSpawnPos];
spawnPos = [_mh centerObjectsPos:spawnPos];
[self instanceSufInit:spawnPos];
第二个方法重构后的代码如下:
CGPoint spawnPos = [_mh positionForTilePos:tilePoint];
[self instanceSufInit:spawnPos];
现在2个方法共享同样的前缀和后缀方法,也消除了冗余代码,我们就这样完成了本次重构.
Cocos2D两个方法的重构一例的更多相关文章
- 获取网页URL地址及参数等的两种方法(js和C#)
转:获取网页URL地址及参数等的两种方法(js和C#) 一 js 先看一个示例 用javascript获取url网址信息 <script type="text/javascript&q ...
- ant中调用外部ant任务的两种方法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- [转]Delphi调用cmd的两种方法
delphi调用cmd的两种方法vars:string;begins:='cmd.exe /c '+edit1.Text+' >c:\1.txt';winexec(pchar(s),sw_hid ...
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
- CSS实现背景图尺寸不随浏览器大小而变化的两种方法
一些网站的首页背景图尺寸不随浏览器缩放而变化,本例使用CSS 实现背景图尺寸不随浏览器缩放而变化,方法一. 把图片作为background,方法二使用img标签.喜欢的朋友可以看看 一些网站的首页 ...
- RAC时间同步的两种方法
集群时间同步服务在集群中的两个 Oracle RAC 节点上执行以下集群时间同步服务配置.Oracle Clusterware 11g 第 2 版及更高版本要求在部署了 Oracle RAC 的集群的 ...
- SERVLET中的doGet与doPost两个方法之间的区别
get和post是http协议的两种方法,另外还有head, delete等 这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串.post的参数是通过另外的 ...
- lua中 table 元表中元方法的重构实现
转载请标明出处http://www.cnblogs.com/zblade/ lua作为游戏的热更新首选的脚本,其优势不再过多的赘述.今天,我主要写一下如何重写lua中的元方法,通过自己的重写来实现对l ...
- 计算理论:NFA转DFA的两种方法
本文将以两种方法实现NFA转DFA,并利用C语言实现. 方法二已利用HNU OJ系统验证,方法一迷之WA,但思路应该是对的,自试方案,测试均通过. (主要是思路,AC均浮云,大概又有什么奇怪的Case ...
随机推荐
- [bzoj4849][Neerc2016]Mole Tunnels
来自FallDream的博客,未经允许,请勿转载,谢谢 貌似是省队集训女队讲的题... 今天在bzoj找一道题无果,但是翻到了这道就顺便写了下. 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意 ...
- 习题9-6 uva 10723
题意: 给你两个字符串,求一个最短的串,使得输入的两个串均是他的子序列(不一定连续) 思路: 可以看出ans = 两个串的长度和 - 两个串的最长公共子序列,在最后的构造处GG. 在构造时想了很久, ...
- 在 telnet 中利用HTTP协议传递GET、POST参数
HTTP协议不仅可以用在浏览器中,还可以用在任何支持它的地方,平时用浏览器访问网站时HTTP协议内容是隐藏起来看不到的,用 telnet 就能揭开它的神秘面纱.telnet 开启方法参考文章末尾——t ...
- 数据结构之B树、B+树(二)---代码实现
B-Tree | Set 1 (construct) Following is an example B-Tree of minimum degree 3. Note that in practica ...
- C语言第二次作业 ,
一:修改错题 1输出带框文字:在屏幕上输出以下3行信息. 将源代码输入编译器 运行程序发现错误 错误信息1: 错误原因:将stido.h拼写错误 改正方法:将stido.h改为stdio.h 错误信息 ...
- substr和substring的区别
substr和substring两个都是截取字符串的. 两者有相同点,如果只是写一个参数,两者的作用都是一样的:就是截取字符串当前下标以后直到字符串最后的字符串片段. 例如:`var a=”abcde ...
- java.lang.UnsatisfiedLinkError: D:\Tomcat\apache-tomcat-7.0.67\bin\tcnative-1.dll:
Can't load IA 32-bit .dll on a AMD 64-bit platform 错误原因 由错误提示可知,tcnative-1.dll是一个32位文件,但是运行在64位系统上 解 ...
- 将jdbc连接明文密码加密方案
最近没有及时写文章,把最近处理的几个问题集中了一下写出来.这篇文章是关于如何处理spring项目中引入数据库连接等 使用的用户名和密码的明文进行加密.防止被他人窃取利用. 我们选择的加密方式为DES加 ...
- Day 2 Python数值计算
一.数值数据类型 在Python中,数值数据类型有以下两种: 整数 整数用"int"数据类型表示.int类型的数据可以是正数也可以是负数,Python可以处理任意大小的整数. 浮点 ...
- truncated、delete和drop的异同点
相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据. 不同点: 1.truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结 ...