本地坐标和全局坐标转化

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 03:31   11   0

涉及到的API

globalToLocal

localToGlobal

toParentPoint

fromParentPoint

  /**
   * 把本地坐标转换为相对stage的全局坐标。
   * @param point    本地坐标点。
   * @param createNewPoint (可选)是否创建一个新的Point对象作为返回值,默认为false,使用输入的point对象返回,减少对象创建开销。
   * @return 转换后的坐标的点。
   */
  public function localToGlobal(point:Point, createNewPoint:Boolean = false):Point {
   //if (!_displayedInStage || !point) return point;
   if (createNewPoint === true) {
    point = new Point(point.x, point.y);
   }
                    //此处的this指的是调用此API的对象
   var ele:Sprite = this;
   while (ele) {
    if (ele == Laya.stage) break;
    point = ele.toParentPoint(point);
    ele = ele.parent as Sprite;
   }
   
   return point;
  }
  
  /**
   * 把stage的全局坐标转换为本地坐标。
   * @param point    全局坐标点。
   * @param createNewPoint (可选)是否创建一个新的Point对象作为返回值,默认为false,使用输入的point对象返回,减少对象创建开销。
   * @return 转换后的坐标的点。
   */
  public function globalToLocal(point:Point, createNewPoint:Boolean = false):Point {
   //if (!_displayedInStage || !point) return point;
   if (createNewPoint) {
    point = new Point(point.x, point.y);
   }
                    //此处的this指的是调用此API的对象
   var ele:Sprite = this;
   var list:Array = [];
   while (ele) {
    if (ele == Laya.stage) break;
    list.push(ele);
    ele = ele.parent as Sprite;
   }
   var i:int = list.length - 1;
   while (i >= 0) {
    ele = list[i];
    point = ele.fromParentPoint(point);
    i--;
   }
   return point;
  }
  
  /**
   * 将本地坐标系坐标转转换到父容器坐标系。
   * @param point 本地坐标点。
   * @return  转换后的点。
   */
  public function toParentPoint(point:Point):Point {
   if (!point) return point;
   point.x -= pivotX;
   point.y -= pivotY;
   
   if (transform) {
    _transform.transformPoint(point);
   }
   point.x += _x;
   point.y += _y;
   var scroll:Rectangle = this._style.scrollRect;
   if (scroll) {
    point.x -= scroll.x;
    point.y -= scroll.y;
   }
   return point;
  }
  
  /**
   * 将父容器坐标系坐标转换到本地坐标系。
   * @param point 父容器坐标点。
   * @return  转换后的点。
   */
  public function fromParentPoint(point:Point):Point {
   if (!point) return point;
   point.x -= _x;
   point.y -= _y;
   var scroll:Rectangle = this._style.scrollRect;
   if (scroll) {
    point.x += scroll.x;
    point.y += scroll.y;
   }
   if (transform) {
    //_transform.setTranslate(0,0);
    _transform.invertTransformPoint(point);
   }
   point.x += pivotX;
   point.y += pivotY;
   return point;
  }

当需要的某个元素的父容器和要添加的子元素的容器不是同一个元素,需要用到此处的坐标转化

查API可以发现,

//设置p的坐标(此时p参考的原点坐标为ele的(0,0)点)
var p:Point = new Point(x,y);

//将p相对于ele的本地坐标转化为相对Stage的全局坐标,转化之后,p参考的原点坐标为Stage的(0,0点)
ele.localToGlobal(p);

//将p相对于Stage的全局坐标转化为相对anotherEle的本地坐标,转化之后,p参考的原点坐标为anotherEle的(0,0)点
anotherEle.globalToLocal(p);

//设置p的坐标(此时p参考的原点坐标为ele的(0,0)点)
var p:Point = new Point(x,y);
//将p相对于ele的本地坐标转化为相对Stage的全局坐标,转化之后,p参考的原点坐标为Stage的(0,0点)

ele.localToGlobal(p);
//将p相对于Stage的全局坐标转化为相对anotherEle的本地坐标,转化之后,p参考的原点坐标为anotherEle的(0,0)点

anotherEle.globalToLocal(p);

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP