Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(四)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)
现在打开MainScene.m文件,首先设置实例变量:
@implementation MainScene{
CGSize _viewSize;
CatSprite *_cat;
CCTiledMap *_tileMap;
CCTiledMapLayer *_bgLayer;
CCTiledMapLayer *_objectLayer;
//在cocos2Dv3中没有CCSpriteBatchNode类,而CCNode已经做了优化,所以用CCNode代替.
CCNode *_batchNode;
}
然后将帮助方法添加进去,里面有不少要修改的地方,大家可以对比原代码和我转换后方法中的区别:
-(BOOL)isValidTileCoord:(CGPoint)tileCoord {
if (tileCoord.x < 0 || tileCoord.y < 0 ||
tileCoord.x >= _tileMap.mapSize.width ||
tileCoord.y >= _tileMap.mapSize.height) {
return FALSE;
} else {
return TRUE;
}
}
-(BOOL)isProp:(NSString*)prop atTileCoord:(CGPoint)tileCoord
forLayer:(CCTiledMapLayer *)layer {
if (![self isValidTileCoord:tileCoord]) return NO;
int gid = [layer tileGIDAt:tileCoord];
NSDictionary * properties = [_tileMap propertiesForGID:gid];
if (properties == nil) return NO;
return [properties objectForKey:prop] != nil;
}
-(BOOL)isWallAtTileCoord:(CGPoint)tileCoord {
return [self isProp:@"Wall" atTileCoord:tileCoord forLayer:_bgLayer];
}
-(BOOL)isBoneAtTileCoord:(CGPoint)tileCoord {
return [self isProp:@"Bone" atTileCoord:tileCoord forLayer:_objectLayer];
}
-(BOOL)isDogAtTileCoord:(CGPoint)tileCoord {
return [self isProp:@"Dog" atTileCoord:tileCoord forLayer:_objectLayer];
}
-(BOOL)isExitAtTileCoord:(CGPoint)tileCoord {
return [self isProp:@"Exit" atTileCoord:tileCoord forLayer:_objectLayer];
}
-(void)removeObjectAtTileCoord:(CGPoint)tileCoord {
[_objectLayer removeTileAt:tileCoord];
}
- (CGPoint)tileCoordForPosition:(CGPoint)position {
int x = position.x / _tileMap.tileSize.width;
int y = ((_tileMap.mapSize.height * _tileMap.tileSize.height) - position.y) / _tileMap.tileSize.height;
return ccp(x, y);
}
-(void)setViewpointCenter:(CGPoint) position {
int x = MAX(position.x, _viewSize.width / 2);
int y = MAX(position.y, _viewSize.height / 2);
x = MIN(x, (_tileMap.mapSize.width * _tileMap.tileSize.width)
- _viewSize.width / 2);
y = MIN(y, (_tileMap.mapSize.height * _tileMap.tileSize.height)
- _viewSize.height/2);
CGPoint actualPosition = ccp(x, y);
CGPoint centerOfView = ccp(_viewSize.width/2, _viewSize.height/2);
CGPoint viewPoint = ccpSub(centerOfView, actualPosition);
_tileMap.position = viewPoint;
}
- (CGPoint)positionForTileCoord:(CGPoint)tileCoord {
int x = (tileCoord.x * _tileMap.tileSize.width) + _tileMap.tileSize.width/2;
int y = (_tileMap.mapSize.height * _tileMap.tileSize.height) - (tileCoord.y * _tileMap.tileSize.height) - _tileMap.tileSize.height/2;
return ccp(x, y);
}
-(void)update:(CCTime)delta{
[self setViewpointCenter:_cat.position];
}
接下来是比较重要的touchBegan和初始化方法.这里我将原来在init中的代码基本上都放到了didLoadFromCCB方法中,道理是一样的:
-(void)touchBegan:(CCTouch *)touch withEvent:(CCTouchEvent *)event{
CGPoint location = [[CCDirector sharedDirector] convertTouchToGL:touch];
location = [_tileMap convertToNodeSpace:location];
[_cat moveToward:location];
}
-(void)didLoadFromCCB{
_viewSize = [CCDirector sharedDirector].viewSize;
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"CatMaze.plist"];
_tileMap = [CCTiledMap tiledMapWithFile:@"CatMaze.tmx"];
[self addChild:_tileMap];
CGPoint spawnTileCoord = ccp(24,0);
CGPoint spawnPos = [self positionForTileCoord:spawnTileCoord];
[self setViewpointCenter:spawnPos];
_bgLayer = [_tileMap layerNamed:@"Background"];
_objectLayer = [_tileMap layerNamed:@"Objects"];
_batchNode = [CCNode node];
[_tileMap addChild:_batchNode];
_cat = [[CatSprite alloc] initWithMainScene:self];
_cat.position = spawnPos;
[_batchNode addChild:_cat];
self.userInteractionEnabled = YES;
}
注意Cocos2D v3.4中的触碰开启只需要简单的一句:
self.userInteractionEnabled = YES;
原来的那么多都可以省略了.现在编译运行游戏,效果如下图所示:
可以看到现在cat可以移动到屏幕最左边附近了,所以我们没有白费劲.现在的cat可以穿墙入室,所以我们需要让它与地图障碍物发生碰撞,这也是下一篇的内容 ;)
Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(四)的更多相关文章
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 首先说一下为什么要转换,这是为了后面的A*寻路算法做准备.由于在 ...
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(二)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 首先在CatMazeV3中新建CatSprite类,继承于Spr ...
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(八)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 回到Xcode中,新建一个EndLayer类,继承于CCNode ...
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(六)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在Xcode中打开MainScene.h文件,在接口中添加2个方 ...
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(五)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 为了暂时不影响原来的cat移动方法,我们在CatSprite.m ...
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(三)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面看一下CatSprite中最复杂的moveToward方法, ...
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(七)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 打开SpriteBuilder,在文件视图中新建一个文件夹Fon ...
- JuiceFS V1.0 RC1 发布,大幅优化 dump/load 命令性能, 深度用户不容错过
各位社区的伙伴, JuiceFS v1.0 RC1 今天正式发布了!这个版本中,最值得关注的是对元数据迁移备份工具 dump/load 的优化. 这个优化需求来自于某个社区重度用户,这个用户在将亿级数 ...
- 【翻译】Selenium IDE v1.0.11 支持转换格式吗?
原文: http://blog.reallysimplethoughts.com/2011/06/10/does-selenium-ide-v1-0-11-support-changing-forma ...
随机推荐
- RHEL 7修改ssh默认端口号
RHEL7修改默认端口号(默认port22)初次安装系统完毕后默认情况下系统已经启动了sshd服务当然我们也可以先进行检查: 步骤1,检查是否已安装ssh服务 步骤2,检查服务是否已开启 如上图所示显 ...
- 多线程join(加入)
package cn.itcast.thread;/* join方法. 加入 */ //老妈class Mon extends Thread{ public void run() { System.o ...
- c++ Struct和Class的区别
C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能.struct能包含成员函数吗? 能!struct能继承吗? 能!!stru ...
- PyChram简单使用教程
一.PyChram下载官网:http://www.jetbrains.com/pycharm Windows:http://www.jetbrains.com/pycharm/download/#se ...
- git 学习笔记(常用命令)
1.新建一个文件,如果没有使用git add 命令将它提交到暂存区,那么这个文件就还没有被跟踪. 2.通过配置.gitignore文件可以指定要忽略的文件,被忽略的文件夹是不会被提交到暂存区的.所以这 ...
- windows资源管理器中配置右键bash here
windows下安装了git后有git bash here 但是安装了cygwin没有bash here 我们可以通过修改注册表的方式自己做一个 Win10下在注册表内有一般有两个默认的 cmd 和 ...
- Node.js 全局对象介绍
全局对象 这些对象在所有模块里都可用.有些对象不是在全局作用域而是在模块作用域里,这些情况下面文档都会标注出来. global {Object} 全局命名空间对象. 浏览器里,全局作用域就是顶级域.如 ...
- “你什么意思”之基于RNN的语义槽填充(Pytorch实现)
1. 概况 1.1 任务 口语理解(Spoken Language Understanding, SLU)作为语音识别与自然语言处理之间的一个新兴领域,其目的是为了让计算机从用户的讲话中理解他们的意图 ...
- Zookeeper的安装部署
1.Zookeeper的安装部署 7.1 Zookeeper工作机制 7.1.1.Zookeeper集群角色 Zookeeper集群的角色: Leader 和 follower (Observer ...
- 豌豆夹Redis解决方案Codis源码剖析:Proxy代理
豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...