触摸点(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)
|
![](http://cn.cocos2d-x.org/doc/cocos-docs-master/manual/framework/native/v3/coordinate-system/res/convert1.jpg)
其中: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