碰撞

__hitWorld?(point: IRadiusPointData): boolean

完全重写碰撞世界坐标方法。

以下为碰撞路径的示例,首先会检测是否需要更新碰撞数据,之后转为本地坐标,再调用 __hit()

注:当检测到光标与元素的外边界碰撞了,才会调用此方法进一步检测

const local = {} as IRadiusPointData

// 类内部

__hitWorld(point: IRadiusPointData): boolean {
    if (this.__layout.hitCanvasChanged) {
        this.__updateHitCanvas()
        this.__layout.hitCanvasChanged = false
    }
    PointHelper.toLocalRadiusPoint(point, this.__world, local)
    return this.__hit(local)
}

__updateHitCanvas(): void {
    if (!this.__hitCanvas) this.__hitCanvas = this.leafer.hitCanvasManager.getPathType(this)
    this.__drawRenderPath(this.__hitCanvas)
}

__hit(local: IRadiusPointData): boolean

仅重写碰撞本地坐标方法。

碰撞路径由__drawRenderPath(this.__hitCanvas) 方法绘制而来。

__hit(local: IRadiusPointData): boolean {
  const { __hitCanvas: h } = this

  if (this.__.fill && h.hitPath(local, this.__.windingRule)) return true

  const strokeWidth = ((this.__.__strokeOuterWidth || 0) + local.radiusX) * 2
  if (h.strokeWidth !== strokeWidth) {
    h.strokeWidth = strokeWidth
    h.stroke()
  }

  return h.hitStroke(local)
}