03、坐标系、锚点

cocos2d-js的坐标系

cocos2d-js采用的是openGL的坐标系,即笛卡尔坐标系。x轴向右,y轴向上。如下图 :


03、坐标系、锚点_第1张图片

(黑色矩形为屏幕,0为原点)



锚点

锚点指物体原点的位置。如 :

var s = new cc.Sprite('bg.jpg');
s.x = 0;
s.y = 0;
this.addChild(s);

程序里把s对象的坐标值设置为 x = 0, y = 0。 程序运行后如下图 :

03、坐标系、锚点_第2张图片

这里精灵的位置之所以会在屏幕之外,是因为精灵的锚点默认在中间,如下图 :

03、坐标系、锚点_第3张图片

可通过cc.Node的setAnchorPoint函数来修改锚点,取值范围为0~1。取值范围可参照下图 :

03、坐标系、锚点_第4张图片

如 :

s.setAnchorPoint(cc.p(0,0));

设置锚点为0,0后在运行程序,如下图 :

03、坐标系、锚点_第5张图片

openGL坐标系、屏幕坐标系、本地坐标系、世界坐标系之间的转换

我们先来了解下上面说的坐标系都是什么意思先吧微笑


openGL坐标系 :  即笛卡尔坐标系

屏幕坐标系       :  与笛卡尔坐标系的y轴相反,y轴向上为负,向下为正

本地坐标系       :  指物体本身的坐标系。如上面的例子中,精灵左下角到右上角的位置,可以视为精灵的本地坐标系

世界坐标系       :  又叫绝对坐标系,它是相对于本地坐标系来说的


openGL坐标系与屏幕坐标系之间的转换 :

cc.director.convertToUI    //把OpenGL坐标转换为屏幕坐标,参数为openGL坐标x、y的point对象

cc.director.convertToGL  //把屏幕坐标转换为openGL坐标,参数为屏幕坐标x、y的point对象


本地坐标、世界坐标之间的转换 :

convertToNodeSpace       //转换为本地坐标

convertToWorldSpace      //转换为世界坐标

我们还是通过代码来解释上面的函数如何使用吧大笑

var s1 = new cc.Sprite('res/on.png');
s1.x = 200;
s1.y = 400;
this.addChild(s1);

var s2 = new cc.Sprite('res/on.png');
s2.x = 500;
s2.y = 800;
this.addChild(s2);

var point1 = s2.convertToNodeSpace(s1.getPosition());
console.log(point1.x + ', ' + point1.y);

var point2 = s2.convertToWorldSpace(s1.getPosition());
console.log(point2.x + ', ' + point2.y);

程序运行后,如下图 :

03、坐标系、锚点_第6张图片

(红色箭头处为原点0,0 , 蓝色箭头为s1, 绿色箭头为s2)


打印出结果为 : 

-300, -400

700, 1200

先来看这句 :

var point1 = s2.convertToNodeSpace(s1.getPosition());
console.log(point1.x + ', ' + point1.y);

这句的意思是 : 计算出s1的坐标点相对于s2的本地坐标点的位置。也就是现在我们要把s2的坐标点看作原点(0,0), 如下图 :

03、坐标系、锚点_第7张图片

(红色箭头现在为原点(0,0), 然后蓝色箭头所指处刚好是-300,-400) ,需要注意的是,convertToNodeSpace函数是真正的把s2的坐标设置为原点(0,0)

再来看这句 :

var point2 = s2.convertToWorldSpace(s1.getPosition());
console.log(point2.x + ', ' + point2.y);
这句的意思是 : 计算出s1的坐标点相对于s2的世界坐标点的位置。也就是现在我们要把s2的坐标点看作原点(0,0), 如下图 :

03、坐标系、锚点_第8张图片

现在我们把500,800这个点看作是原点(0,0),然后因为s1的坐标点是200 和 400, 所以我们右移200个像素,上移400个像素。最后呈现的结果如下图 :

03、坐标系、锚点_第9张图片

把红色箭头处当做原点(0,0),然后右移200,上移400。刚好是 700,1200。需要注意的是,convertToWorldSpace函数不是真正的把s2的坐标当做原点。



忽略锚点对位置的影响

例子 :

var s = new cc.Sprite('res/on.jpg');
s.setAnchorPoint(cc.p(0.5,0));
s.x = 25;
s.y = 0;
this.addChild(s);
var scale = new cc.ScaleTo(2, 1, 4);
s.runAction(scale);
运行结果 :

03、坐标系、锚点_第10张图片

s以蓝色箭头为原点(0,0),s的 W = 50, H = 100。 然后s将会从下往上逐渐缩放到黑色箭头所指处。代码实际上有个地方很麻烦,那就是s的x坐标。

上述代码s的坐标为x = 25,因为其锚点默认为中心点,所以我们需要设置坐标为25它才会处于屏幕的0,0,点处。这样很麻烦。。

所以我们可以使用 ignoreAnchorPointForPosition 函数来解决这个麻烦的问题。 如 :

s.ignoreAnchorPointForPosition(true);

使用该函数后,设置精灵的位置以左下角为原点。并且setAnchorPoint函数对精灵的坐标不产生任何作用。(注意只是对坐标不产生作用)

而且精灵runAction的时候又能参照setAnchorPoint的锚点来执行动作。

修改代码后 :

var s = new cc.Sprite('res/on.jpg');
s.ignoreAnchorPointForPosition(true); //忽略锚点对位置的影响 
s.setAnchorPoint(cc.p(0.5,0));
s.x = 0;			      //这里设置为0就可以了
s.y = 0;
this.addChild(s);
var scale = new cc.ScaleTo(2, 1, 4);
s.runAction(scale);
 

你可能感兴趣的:(03、坐标系、锚点)