触摸点(Touch position)
所以在处理触摸事件时需要用重写以下四个函数:
1
2
3
4
|
virtual bool
onTouchBegan(Touch *touch, Event * event); virtual void
onTouchEnded(Touch *touch, Event * event); virtual void
onTouchCancelled(Touch *touch, Event * event); virtual void
onTouchMoved(Touch *touch, Event * event); |
在函数中获取到touch,我们在设计游戏逻辑时需要用到触摸点在Cocos2d坐标系中的位置,就需要将touch的坐标转换成OpenGL坐标系中的点坐标。
Touch position是屏幕坐标系中的点,OpenGL position是Cocos2d-x用到的OpenGL坐标系上的点坐标。通常我们在开发中会使用两个接口getLocation()
和getLocationInView()
来进行相应坐标转换工作。
在开发中一般使用getLocation()
获取触摸点的GL坐标,而getLocation()
内部实现是通过调用Director::getInstance()->convertToGL(_point);
返回GL坐标。
此外,关于世界坐标系和本地坐标系的相互转换,在Node中定义了以下四个常用的坐标变换的相关方法。
1
2
3
4
5
6
7
8
9
10
11
|
//
把世界坐标转换到当前节点的本地坐标系中 Point
convertToNodeSpace( const Point&
worldPoint) const ; //
把基于当前节点的本地坐标系下的坐标转换到世界坐标系中 Point
convertToWorldSpace( const Point&
nodePoint) const ; //
基于Anchor Point把基于当前节点的本地坐标系下的坐标转换到世界坐标系中 Point
convertToNodeSpaceAR( const Point&
worldPoint) const ; //
基于Anchor Point把世界坐标转换到当前节点的本地坐标系中 Point
convertToWorldSpaceAR( const Point&
nodePoint) const ; |
下面通过一个例子来说明这四个方法的理解和作用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
auto
*sprite1 = Sprite::create( "HelloWorld.png" ); sprite1->setPosition(ccp(20,40)); sprite1->setAnchorPoint(ccp(0,0)); this ->addChild(sprite1); //此时添加到的是世界坐标系,也就是OpenGL坐标系 auto
*sprite2 = Sprite::create( "HelloWorld.png" ); sprite2->setPosition(ccp(-5,-20)); sprite2->setAnchorPoint(ccp(1,1)); this ->addChild(sprite2); //此时添加到的是世界坐标系,也就是OpenGL坐标系 //将
sprite2 这个节点的坐标ccp(-5,-20) 转换为 sprite1节点 下的本地(节点)坐标系统的 位置坐标 Point
point1 = sprite1->convertToNodeSpace(sprite2->getPosition()); //将
sprite2 这个节点的坐标ccp(-5,-20) 转换为 sprite1节点 下的世界坐标系统的 位置坐标 Point
point2 = sprite1->convertToWorldSpace(sprite2->getPosition()); log ( "position
= (%f,%f)" ,point1.x,point1.y); log ( "position
= (%f,%f)" ,point2.x,point2.y); |
1
2
3
4
|
运行结果: Cocos2d:
position = (-25.000000,-60.000000) Cocos2d:
position = (15.000000,20.000000) |

其中:Point point1 = sprite1->convertToNodeSpace(sprite2->getPosition());
相当于sprite2
这个节点添加到(实际没有添加,只是这样理解)sprite1
这个节点上,那么就需要使用sprite1
这个节点的节点坐标系统,这个节点的节点坐标系统的原点在(20,40),而sprite1
的坐标是(-5,-20),那么经过变换之后,sprite1
的坐标就是(-25,-60)。
其中:Point point2 = sprite1->convertToWorldSpace(sprite2->getPosition());
此时的变换是将sprite2
的坐标转换到sprite1
的世界坐标系下,而其中世界坐标系是没有变化的,始终都是和OpenGL等同,只不过sprite2
在变换的时候将sprite1
作为了”参照“而已。所以变换之后sprite2
的坐标为:(15,20)。
原地址:http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/coordinate-system/zh.md