render method
精灵渲染 代码没几行,坐标计算有点复杂
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();
}