">

- bool HelloWorld::init()
- {
-
- if( !Layer::init() )
- {
- returnfalse;
- }
-
- SizevisibleSize = Director::getInstance()->getVisibleSize();
- Pointorigin = Director::getInstance()->getVisibleOrigin();
- autocloseItem = MenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
-
- closeItem->setPosition(Point(origin.x+ visibleSize.width - closeItem->getContentSize().width/2 ,
- origin.y+ closeItem->getContentSize().height/2));
-
- automenu = Menu::create(closeItem, NULL);
- menu->setPosition(Point::ZERO);
- this->addChild(menu,1);
- //创建背景
- autobg = Sprite::create("bg.png"); ①
- bg->setPosition(Point(origin.x+ visibleSize.width/2,
- origin.y+ visibleSize.height/2));
-
- this->addChild(bg,0); ②
- //创建Node1
- autonode1 = Sprite::create("node1.png"); ③
- node1->setPosition(Point(400,500));
- node1->setAnchorPoint(Point(1.0,1.0));
-
- this->addChild(node1,0); ④
- //创建Node2
- autonode2 = Sprite::create("node2.png"); ⑤
- node2->setPosition(Point(200,300));
- node2->setAnchorPoint(Point(0.5,0.5));
-
- this->addChild(node2,0); ⑥
-
- PointPoint1 = node1->convertToNodeSpace(node2->getPosition()); ⑦
- PointPoint3 = node1->convertToNodeSpaceAR(node2->getPosition()); ⑧
-
- log("Node2NodeSpace = (%f,%f)",Point1.x,Point1.y);
- log("Node2NodeSpaceAR = (%f,%f)",Point3.x,Point3.y);
-
- returntrue;
- }
代码①~②行是创建背景精灵对象,这个背景是一个白色900 x 640像素的图片。代码第③~④行是创建Node1对象,并设置了位置和锚点属性。代码第⑤~⑥行是创建Node2对象,并设置了位置和锚点属性。第⑦行代码将Node2的世界坐标转换为相对于Node1的模型坐标。而第⑧行代码是类似的,它是相对于锚点的位置。
运行结果如下:
Node2 NodeSpace = (100.000000,-100.000000)
Node2 NodeSpaceAR =(-200.000000,-200.000000)
Node2的世界坐标转换为相对于Node1的模型坐标,就是将Node1的左下角作为坐标原点(图3-22中的A点),我们不难计算出A点的世界坐标是(100,400),那么convertToNodeSpace函数就是A点坐标减去C点坐标,结果是(-100,100)。而convertToNodeSpaceAR函数要考虑锚点,因此坐标原点是B点,B点坐标减去C点坐标,结果是(-200, -200)。
2、模型坐标转换为世界坐标
下面是模型坐标转换为世界坐标实例运行结果。

在游戏场景中有两个Node对象,其中Node1的坐标是(400, 500),大小是300 x 100像素。Node2是放置在Node1中的,它对于Node1的模型坐标是(0, 0),大小也是150 x 50像素。
编写代码如下:
- bool HelloWorld::init()
- {
- if( !Layer::init() )
- {
- returnfalse;
- }
-
- SizevisibleSize = Director::getInstance()->getVisibleSize();
- Pointorigin = Director::getInstance()->getVisibleOrigin();
-
- autocloseItem = MenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
-
- closeItem->setPosition(Point(origin.x+ visibleSize.width - closeItem->getContentSize().width/2 ,
- origin.y+ closeItem->getContentSize().height/2));
-
- automenu = Menu::create(closeItem, NULL);
- menu->setPosition(Point::ZERO);
- this->addChild(menu,1);
-
- //创建背景
- autobg = Sprite::create("bg.png");
- bg->setPosition(Point(origin.x+ visibleSize.width/2,
- origin.y+ visibleSize.height/2));
- this->addChild(bg,0);
-
- //创建Node1
- autonode1 = Sprite::create("node1.png");
- node1->setPosition(Point(400,500));
- this->addChild(node1,0);
-
- //创建Node2
- autonode2 = Sprite::create("node2.png");
- node2->setPosition(Point(0.0,0.0)); ①
- node2->setAnchorPoint(Point(0.0,0.0)); ②
- node1->addChild(node2,0); ③
-
- PointPoint2 = node1->convertToWorldSpace(node2->getPosition()); ④
- Point Point4 =node1->convertToWorldSpaceAR(node2->getPosition()); ⑤
-
-
- log("Node2WorldSpace = (%f,%f)",Point2.x,Point2.y);
- log("Node2WorldSpaceAR = (%f,%f)",Point4.x,Point4.y);
-
- returntrue;
- }
上述代码我们主要关注第③行,它是将Node2放到Node1中,这是与之前的代码的区别。这样第①行设置的坐标就变成了相对于Node1的模型坐标了。
第④行代码将Node2的模型坐标转换为世界坐标。而第⑤行代码是类似的,它是相对于锚点的位置。
运行结果如下:
Node2 WorldSpace =(250.000000,450.000000)
Node2 WorldSpaceAR =(400.000000,500.000000)
所示的位置,可以用世界坐标描述。代码①~③行修改如下:
node2->setPosition(Point(250, 450));
node2->setAnchorPoint(Point(0.0,0.0));
this->addChild(node2, 0);
[1] Direct3D(简称:D3D)是微软公司在Microsoft Windows操作系统上所开发的一套3D绘图编程接口,是DirectX的一部份,目前广为各家显卡所支持。与OpenGL同为计算机绘图软件和计算机游戏最常使用的两套绘图编程接口之一。—— 引自于维基百科 http://zh.wikipedia.org/wiki/Direct3D