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 ...
随机推荐
- ●BZOJ 2743 [HEOI2012]采花
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 题解: 树状数组,离线 求区间里面有多少种出现次数大于等于 2 的颜色. 类似某一个题 ...
- bzoj 3998: [TJOI2015]弦论
Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...
- Linux学习之CentOS(十五)----磁盘管理之 启动挂载(转)
启动挂载 /etc/fstab 及 /etc/mtab 刚刚上面说了许多,那么可不可以在启动的时候就将我要的文件系统都挂好呢?这样我就不需要每次进入 Linux 系统都还要在挂载一次呀!当然可以啰!那 ...
- BlockingQueue阻塞队列(解决多线程中数据安全问题 可用于抢票,秒杀)
案例:一个线程类中 private static BlockingQueue<Map<String, String>> dataQueue = new LinkedBlocki ...
- 详解Tomcat配置JVM参数步骤
这里向大家描述一下如何使用Tomcat配置JVM参数,Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK ...
- django.db.utils.ProgrammingError: 1146 的解决办法
在models中设置完数据库相关的东西后执行命令 python manage.py makemigrations 此处无错误 再次执行 python manage.py migrate 发生报错 错误 ...
- Linux系统格式化新磁盘并挂载分区
Linux系统格式化新磁盘并挂载分区 在虚拟机的设置界面中,我们可以选择添加硬盘 添加好硬盘后,我们输入命令fdisk -l 看到有一个未经分区的硬盘 Fdisk命令编辑这个硬盘 输入n创建分区,p选 ...
- jmeter分布式测试远程连接失败
jmeter分布式部署其实很简单.但今天测试的时候发现了一个坑,远程连接一直失败. 原因:服务器上部署了slave,而这台服务器上有多个网卡.举个例子:ip分别为:192.168.100.6,10.1 ...
- org.apache.maven.archiver.MavenArchiver.getManifest
eclipse导入新的maven项目时,pom.xml第一行报错: org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.mav ...
- 深入浅出低功耗蓝牙(BLE)协议栈
深入浅出低功耗蓝牙(BLE)协议栈 BLE协议栈为什么要分层?怎么理解蓝牙"连接"?如果蓝牙协议只有ATT没有GATT会发生什么? 协议栈框架 一般而言,我们把某个协议的实现代码称 ...