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 ...
随机推荐
- bzoj2434阿狸的自动机
转载自 http://www.cnblogs.com/zj75211/p/6934976.html ●BZOJ 2434: [Noi2011]阿狸的打字机 ●赘述题目 (题意就不赘述了) ●解法: ...
- AD域中添加了一个策略导致的问题
AD域中添加了一个策略,导致浏览器报了一个错,点击下拉菜单选不了.查了资料说是添加信任站点就好,结果信任站点是置灰的,服务器有这个问题,本地是好的. 解决办法:本地服务器有个ie增强设置,关掉就好.
- Cloud TPU Demos(TensorFlow 云 TPU 样例代码)
Cloud TPU Demos 这是一个Python脚本的集合,适合在开源TensorFlow和 Cloud TPU 上运行. 如果您想对模型做出任何修改或改进,请提交一个 PR ! https:// ...
- PostgreSQL 查看单表大小
1. 在数据库中查单个表 select pg_size_pretty(pg_relation_size('table_name')); 2. 查出并按大小排序 SELECT table_schema ...
- 基于GCC的openMP学习与测试
(一).openMP简述 Open Multiprocessing (OpenMP) 框架是一种功能极为强大的规范,可以帮助您利用 C.C++ 和 Fortran 应用程序中的多个核心带来的好处,是基 ...
- jquery easyui datagrid数据自动换行 panel用法
nowrap:false 初始化panel $('#txtLeftPercent').panel({ title: '剩余权重:' + percent, height: 10, width: 180, ...
- JAX-RPC 与 JAX-WS 的比较
引言 Web 服务已经出现很久了.首先是 SOAP,但 SOAP 仅描述消息的情况,然后是 WSDL,WSDL 并不会告诉您如何使用 Java™ 编写 Web 服务.在这种情况下,JAX-RPC 1. ...
- 反射实现java深度克隆
一.克隆 有时想得到对象的一个复制品,该复制品的实体是原对象实体的克隆.复制品实体的变化不会引起原对象实体发生变化,这样的复制品称为原对象实体的克隆对象或简称克隆. 1.浅复制(浅克隆) 概念:被复制 ...
- ionic3-ng4学习见闻--(多环境方案)
搜了很久,很难找到一个详细入微,开箱即用的方案. 于是我 百折不挠的,搞出来一个,也不知道是不是最完美的方案,有什么可以优化的地方可以指出,谢谢. 首先, 1.项目目录下(与src平级),新增conf ...
- Python中的str与unicode处理方法
Python中的str与unicode处理方法 2015/03/25 · 基础知识 · 3 评论· Python 分享到:42 原文出处: liuaiqi627 的博客 python2.x中处理 ...