render method

  1. @override
void render(
  1. Canvas canvas
)
override

精灵渲染 代码没几行,坐标计算有点复杂

Implementation

@override
void render(Canvas canvas) {
  /// 画布暂存
  canvas.save();

  /// 目标位置
  Rect dstRect;

  if (rotated) {
    /// 将子精灵转换为相对坐标
    if (parent == null) {
      canvas.translate(position.y, position.x);
    } else {
      canvas.translate(position.y - parent!.size.height / 2, position.x - parent!.size.width / 2);
    }

    /// 针对json中的图像旋转
    canvas.rotate(-90 * pi / 180); //弧度

    dstRect = Rect.fromCenter(center: Offset(0, 0), width: rect.width * scale, height: rect.height * scale);
  } else {
    /// 将子精灵转换为相对坐标
    if (parent == null) {
      canvas.translate(position.x, position.y);
    } else {
      canvas.translate(position.x - parent!.size.width / 2, position.y - parent!.size.height / 2);
    }
    canvas.rotate(this.angle * pi / 180); //弧度

    dstRect =
        Rect.fromCenter(center: Offset(0, -rect.height / 2), width: rect.width * scale, height: rect.height * scale);
  }

  /// 水平镜像
  if (flippedX) {
    if (rotated) {
      canvas.scale(1, -1); //左右镜像翻转
    } else {
      canvas.scale(-1, 1); //左右镜像翻转
    }
  }

  /// 目标绘制位置
  if (rotated) {
    dstRect = Rect.fromCenter(center: Offset(offset.dx, offset.dy), width: rect.width, height: rect.height);
  } else {
    dstRect = Rect.fromCenter(center: Offset(offset.dx, -offset.dy), width: rect.width, height: rect.height);
  }

  /// 处理缩放
  Rect outputRect = Rect.fromCenter(
      center: Offset(dstRect.center.dx * scale, dstRect.center.dy * scale),
      width: dstRect.width * scale,
      height: dstRect.height * scale);

  /// 绘制图像
  Paint paintImage = Paint()..color = color;
  paintImage.blendMode = this.blendMode;
  canvas.drawImageRect(this.image, rect.toRect(), outputRect, paintImage);

  /// 画布恢复
  canvas.restore();
}