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

来源:互联网 发布:sql2000 mdf恢复数据库 编辑:程序博客网 时间:2024/05/15 04:37

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,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,0,50,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];
0 0
原创粉丝点击