细说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,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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cocos 3D是一个用于开发3D游戏和应用程序的框架,它基于Cocos2d-x引擎。在Cocos 3D中,坐标系可以分为世界坐标系、模型坐标系和观察坐标系。 要将3D坐标转换为2D坐标,我们首先需要确定摄像机的位置和观察方向。通过设置摄像机的位置和方向,可以确定观察坐标系。然后,我们可以使用透视投影或正交投影来将3D场景投射到2D平面上。 在Cocos 3D中,可以使用Viewport(视口)和Camera(摄像机)来控制3D到2D的转换。视口决定了渲染的区域,而摄像机则定义了观察坐标系。 在代码中,可以通过以下步骤将3D坐标转换为2D坐标: 1. 创建一个Viewport,并设置它的大小和位置。 2. 创建一个Camera,并设置它的位置、观察目标和投影方式(透视或正交)。 3. 将需要转换的3D坐标传递给Camera的unproject方法。 unproject方法可以将3D坐标转换为在视口中的2D坐标。它将返回一个Vec3对象,其中包含在视口中的2D坐标。 以下是一个简单的示例代码,展示如何将3D坐标转换为2D坐标: ```cpp // 创建一个Viewport auto viewport = Viewport::create(0, 0, screenWidth, screenHeight); // 创建一个Camera auto camera = Camera::createPerspective(60, screenWidth / screenHeight, 0.1f, 1000); // 设置Camera的位置和观察目标 camera->setPosition3D(Vec3(0, 0, 10)); camera->lookAt(Vec3(0, 0, 0)); // 将3D坐标(1, 1, 1)转换为2D坐标 Vec3 worldPosition(1, 1, 1); Vec3 screenPosition = camera->unproject(viewport, worldPosition); // 打印转换后的2D坐标 CCLOG("2D坐标:(%f, %f)", screenPosition.x, screenPosition.y); ``` 通过以上步骤,我们可以将3D坐标转换为2D坐标,并将结果保存在screenPosition变量中。在示例中,我们将3D坐标(1, 1, 1)转换为2D坐标,并打印结果。 需要注意的是,3D坐标转换为2D坐标需要在渲染之前进行,因此最好在update或draw函数中进行转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值