cocos2dx 缩放场景以后的碰撞检测跟触摸
2014-01-26 22:36
351 查看
大家看了这题目之后或许可能会淡然一笑,心想:这会有什么问题吗?正常情况下,两个精灵放在同一个层,这样子是没有问题的,但是你有没有试过两个精灵在不同层的碰撞检测?如果你尝试过,就知道这篇文章为什么会诞生了……我有一个HelloWorld,这个是主场景,我在主场景中添加了一个游戏层,GameLayer的实例,添加了一个碰撞精灵,Pig的实例。在这里多说一句,我的适配使用了:CCEGLView::sharedOpenGLView()->setDesignResolutionSize(1280, 720, kResolutionNoBorder);Pig添加:【其中的一个需要进行碰撞检测的精灵】,方法如下:?
GameLayer添加:【游戏层】,方法如下:?
这两个操作之后,我们就把游戏层和游戏精灵加载到场景中了,接下来处理下主场景:?
这些准备就绪后,我们再到游戏层GameLayer中添加地面,Ground的实例。Ground添加,【另外一个需要进行碰撞检测的精灵】,添加方法如下:?
这样之后,我们的Ground实例精灵和Pig实例精灵就分别位于两个层上了,Ground:添加到了GameLayer层,Pig:添加到了HelloWorld层。我们在Ground实例中进行碰撞检测,区域判断如下:?
在这段代码中,?
这两句是比较重要的,第一句处理了缩放后坐标的转化,第二句统一了两个精灵的坐标系,将两个精灵的坐标转化为相对于游戏层的坐标。关于pigTemp->getGlobalScale(),这个是为了大家测试方便,代码方便,我把场景的缩放值绑定到了Pig的实例上。。。在这里,大家可能还不明白为什么我使用了convertToNodeSpace进行坐标转化之后还要处理一下Pig实例的坐标。下面大家跟我一步步看看源码:convertToNodeSpace方法:?
这里边主要是CCPointApplyAffineTransform,点的映射转化,它是一个宏定义:#define CCPointApplyAffineTransform __CCPointApplyAffineTransform__CCPointApplyAffineTransform如下:?
在这里边它进行了坐标的处理,但是没有涉及到场景的缩放值,所以,到这里你应该明白了。。。希望这个对大家有帮助。。。欢迎大神拍砖,多多指教……之前很多朋友说文章不详细啊,没有例子啊,希望大家多多提意见,之后文章尽量详细,贴图。例子都挂在我的github下面
123456 | void HelloWorld::addPig() { Pig *pig = Pig::getInstance(); pig->setPosition(ccp(300,200)); this ->addChild(pig); } |
1234 | // init gamelayer m_pGameLayer = GameLayer::create(); m_pGameLayer->setPosition(ccp(500,0)); addChild(m_pGameLayer); |
12 | setAnchorPoint(CCPointZero); this ->ignoreAnchorPointForPosition( false ); |
1234567 | void GameLayer::addGround() { Ground *ground = Ground::create( "Icon-72.png" ); ground->setPosition(ccp(200,200)); ground->setGameLayer( this ); this ->addChild(ground); } |
1234567891011121314151617181920212223242526 | CCRect Ground::atlasRect() { CCSize cSize = getContentSize(); CCPoint pos = this ->getPosition(); return CCRectMake(pos.x - cSize.width/2, pos.y - cSize.height/2, cSize.width, cSize.height); } bool Ground::isContaintRect(CCRect rect) { return atlasRect().intersectsRect(rect); } CCRect Ground::getPigRect() { Pig *pigTemp = Pig::getInstance(); CCPoint pos =pigTemp->getPosition(); pos = ccp(pos.x*pigTemp->getGlobalScale(),pos.y*pigTemp->getGlobalScale()); pos = _m_pGameLayer->convertToNodeSpace(pos); CCSize cSize = pigTemp->getContentSize(); float width = cSize.width; float height = cSize.height; return CCRectMake(pos.x - width/2, pos.y - height/2, width, height); } |
12 | pos = ccp(pos.x*pigTemp->getGlobalScale(),pos.y*pigTemp->getGlobalScale()); pos = _m_pGameLayer->convertToNodeSpace(pos); |
12345 | CCPoint CCNode::convertToNodeSpace( const CCPoint& worldPoint) { CCPoint ret = CCPointApplyAffineTransform(worldPoint, worldToNodeTransform()); return ret; } |
1234567 | CCPoint __CCPointApplyAffineTransform( const CCPoint& point, const CCAffineTransform& t) { CCPoint p; p.x = ( float )(( double )t.a * point.x + ( double )t.c * point.y + t.tx); p.y = ( float )(( double )t.b * point.x + ( double )t.d * point.y + t.ty); return p; } |
相关文章推荐
- Cocos2dx 3.1.1 之 监听器、特效切换场景、动作、检测碰撞、回调函数
- cocos2dx tiledmap 碰撞检测
- cocos2dx物理引擎和碰撞检测(一)
- cocos2dx物理引擎和碰撞检测(二)
- 数独游戏(2)之单点触摸事件,碰撞检测,计算出不可用数据
- 基于像素的碰撞检测(移植到cocos2dx 3.x)
- cocos2dx 碰撞检测 总结
- Ogre中场景查询和碰撞检测
- cocos2dx3.X项目重写(四)添加地板,障碍物和碰撞检测
- COCOS2DX,cocostudio::ColliderDetector 简单介绍 骨骼动画绑定碰撞区域进行碰撞检测
- cocos2dx碰撞检测实现
- cocos2dx粒子碰撞检测
- SpriteKit:检测当新场景显示以后
- cocos2dx - JS - 碰撞检测
- 给Away3D添加自己的八叉树场景管理和碰撞检测
- Unity2d 弱联网游戏制作(二) 动画、场景、渲染层、碰撞检测、音乐播放
- SpriteKit:检测当新场景显示以后
- cocos2d-x 2.X demo学习笔记 9 ----Touches 触摸事件 以及碰撞检测
- cocos2dx物理引擎和碰撞检测(五)框架Fixtures
- SpriteKit:检测当新场景显示以后