服务器之家

服务器之家 > 正文

Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系

时间:2021-02-01 14:09     来源/作者:C语言程序设计

 cocos2d-x的坐标系很重要,想要学好该引擎,深入理解它的坐标体系很重要。注释写的很清楚了,对照上运行结果一块来看代码吧!

Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系

Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
bool HelloWorld::init()
{
  bool bRet = false;
  do
  {
 
    CC_BREAK_IF(! CCLayer::init());
        //opengl的坐标系和世界坐标系相同,都是以屏幕左下角为原点,向右为x轴的增加方向,向上为y轴的增加方向
        //这里的世界指的是游戏世界
        //屏幕坐标系是以左上角为原点,是我们熟悉的
   //本地坐标系也叫节点坐标系,世界坐标系是相对于整体而言的,而本地坐标系是相对于父节点而言的,理解这点很重要
 
        //CCDirector::sharedDirector()->convertToGL() 转换到OPENGL坐标系
        //CCDirector::sharedDirector()->convertToUI() 转换到屏幕坐标系
        //CCNode::convertToWorldSpace() 把本地坐标系转换到世界坐标系
        //CCNode::convertToNodeSpace()  把世界坐标系转换到本地坐标系
 
        //sprite1、sprite2的图片大小是100,100
        CCSprite * sprite1 = CCSprite::create("image1.png");
        sprite1->setPosition(ccp(100,100));
 
        //将sprite2添加到sprite1节点中,这时候是以sprite1的左下角为原点,虽然sprite1的锚点是在它图片的中间
        CCSprite * sprite2 = CCSprite::create("image2.png");
        //setPosition中设置的坐标是sprite2的本地坐标
        sprite2->setPosition(ccp(100,100));
        sprite1->addChild(sprite2);
 
        //getPosition中获得的坐标也是sprite2的本地坐标
        CCPoint point = sprite2->getPosition();
        CCLog("point.x=%f,point.y=%f",point.x,point.y);
 
        //获得sprite2的opengl坐标系,屏幕坐标系,世界坐标系,本地坐标系
 
        //convertToWorldSpace的传入参数是sprite2的节点坐标系(本地坐标),也就是setPosition中传入的参数,而convertToNodeSpace的传入参数是sprite2的世界坐标系,看清谁是调用者,传入的参数又是什么
        CCPoint worldSpace = sprite1->convertToWorldSpace(point);
        CCPoint nodeSpace = sprite1->convertToNodeSpace(worldSpace);
 
        //以下俩个函数完成同样的功能,只不过这次的sprite2的坐标是基于sprite1的锚点的,而不是左下角了,所以我们传入了ccp(50,50)
        CCPoint worldSpaceAR = sprite1->convertToWorldSpaceAR(ccp(50,50));
        CCPoint nodeSpaceAR = sprite1->convertToNodeSpaceAR(worldSpaceAR);
 
        //convertToUI中传入的是opengl坐标系,因为opengl坐标和世界坐标系是相同的,所以我们传入世界坐标
        CCPoint ui = CCDirector::sharedDirector()->convertToUI(worldSpace);
        CCPoint opengl = CCDirector::sharedDirector()->convertToGL(ui);
 
        CCLog("opengl.x=%f,opengl.y=%f",opengl.x,opengl.y);
        CCLog("ui.x=%f,ui.y=%f",ui.x,ui.y);
        CCLog("worldspace.x=%f,worldspace.y=%f",worldSpace.x,worldSpace.y);
        CCLog("nodeSpace.x=%f,nodeSpace.y=%f",nodeSpace.x,nodeSpace.y);
        CCLog("worldspaceAR.x=%f,worldspaceAR.y=%f",worldSpaceAR.x,worldSpaceAR.y);
        CCLog("nodeSpaceAR.x=%f,nodeSpaceAR.y=%f",nodeSpaceAR.x,nodeSpaceAR.y);
 
        this->addChild(sprite1);
 
    bRet = true;
  } while (0);
 
  return bRet;
}

 

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
返回顶部