细说cocos2d坐标系坐标系,锚点,点击精灵判断

add:
默认情况下addchild总是setpostion(0,0),锚点精灵是(0.5,0.5),cclayer是(0,0);
1.坐标系

坐标系作用是说明质点的方向,表明质点位置。坐标系是一个整体的概念。

经典的坐标系是初中时候的笛卡尔平面坐标系和直线坐标系

cocos2d包含两种类型坐标系:屏幕坐标系(UI point)和GL坐标系

屏幕坐标系是较通用的坐标系,如windows和手机屏幕等各种屏幕坐标(二维),如windows的渲染采用directx 3d引擎

cocos2d采用gl坐标,原因在与cocos2d使用opengl ES渲染(这是一种三维的坐标系)

屏幕坐标系图:
GL坐标系图:


2.相对坐标和绝对坐标

绝对坐标(世界坐标),是一个绝对的值,一个值对应坐标系中一个固定的点,无论用在程序的什么地方,都表示同一个点。

相对坐标(本地坐标),是i一个相对值,总是相对于一个参照物来说的。同一个坐标值,相对的物体不同,则表示的点也不同。

每一个点一定有且只有一个绝对坐标,有可能有无数个相对坐标

3.锚点(anchor)

锚点用在设定一个对象位置的时候,表示对象自身的中心点(中心是质点中心,而不是几何中心,不一定是(0.5,0.5))

类似于一个门牌钉到一个门上,门牌需要一个订书钉,那么这个订书钉就是门牌的锚点,表示门牌的中心点

锚点值范围在门牌自身范围之内,如:obj.anchor=(0,0) 门牌左下角 (1,1)门牌右上角

锚点在ccsprite中默认开启(0.5,0.5),在cclayer中默认关闭,总是左下脚(0,0),设置别的值也无效,可以自己启用

例子:将一个红色方框(200*200),锚点(0.5,0,5 )放到屏幕上100,100的位置。屏幕是父,红框是子

CCSprite* pRed=[CCSprite spriteWithFile:@"1.jpg"];
pRed.position = ccp(100,100);
[pRed setAnchorPoint:(ccp(0.5,0.5))];
[self addChild:pRed];

再放入一个绿框(50*50),锚点(0.5,作为红框的儿子,结果是图1,而不是图2

CCSprite* pGreen=[CCSprite spriteWithFile:@"2.jpg"];
pGreen.position= ccp(0,0);
[pGreen setAnchorPoint:(ccp(0.5,0.5))];
[pRed addChild:pGreen];

说明:如下关系情况下:祖父-父-子-孙

(1)设置子在父中位置时,子锚点起作用,与父锚点无关,子永远是拿自己的锚点去钉父的左下角

4.如何判断一个坐标点是否在一个节点中
或者说,如何判断touch点是否是自己
方法一:
CGPoint localAlas = [pRed convertTouchToNodeSpaceAR:touch];
CGRect rc = [pRed textureRect];
CGRect rcAlas = CGRectMake( - rc.size.width / 2,-rc.size.height / 2,rc.size.width,rc.size.height);
if(CGRectContainsPoint(rcAlas,localAlas))
{
//点中了
}

方法二:
CGPoint local=[pRed convertTouchToNodeSpace:touch];
CGRect rc = [pRed textureRect];
if(CGRectContainsPoint(rc,local))
{
//点中了
}
例子:绿框左下角坐标(100,100),绿色框大小(50,50),点击黑点,黑点绝对坐标(115,115)绿框中心的地方是(125,125)

localAlas=(-10,-10),rcAlas=(-25,-25,50,50)
local=(15,15),rc=(0,50)
两者的CGRectcontainsPoint方法都是一样的,可见,方法不同只是对rect的解释不同
第一种localAlas认为黑点相对于铝框的中心店(0.5,0,5)为原点,相对坐标(-10,-10)虽然包含结果正确,但是不符合锚点定义
第二种local认为黑点相对于绿框的左下角为原点,相对坐标(15,15),符合锚点的含义





5.convertTouchToNodeSpace的含义

//CGPoint touchLocation = [touch locationInView: [touch view]];

// touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
//touchLocation = [self convertToNodeSpace:touchLocation];

//替换上面三句,实际上也是分为三步来的:touch->UI point->world GL point->Node GL point
CGPoint touchLocation = [self convertTouchToNodeSpace:touch];

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...