load static method

Future<DFAnimationSprite> load(
  1. String json, {
  2. dynamic scale = 0.5,
  3. dynamic blendMode = BlendMode.srcOver,
})

将plist转换Json后读取精灵 { "frames": { "idle_00000.png": { "frame": "{{929,291},{76,110}}", "offset": "{-19,24}", "rotated": true } } }

Implementation

static Future<DFAnimationSprite> load(String json, {scale = 0.5, blendMode = BlendMode.srcOver}) async {
  print("DFAnimationSprite Load:" + json);
  DFAnimationSprite animationSprite = DFAnimationSprite(stepTime: 100, loop: true);
  DFAnimation.keys.forEach((element) {
    animationSprite.frames[element] = [];
  });
  Map<String, dynamic> jsonMap = await DFAssetsLoader.loadJson(json);
  ui.Image image = await DFAssetsLoader.loadImage(json.replaceAll(".json", ".png"));
  final jsonFrames = jsonMap['frames'] as Map<String, dynamic>;

  /// final jsonMetadata = jsonMap['metadata'] as Map<String, dynamic>;
  jsonFrames.forEach((key, value) {
    final map = value as Map;

    bool rotated = false;
    if (map['rotated'] != null) {
      rotated = map['rotated'] as bool;
    }

    final frame = map['frame'] as String;
    final offset = map['offset'] as String;
    List<String> frameText = frame.replaceAll("{{", "").replaceAll("},{", ",").replaceAll("}}", "").split(",");
    List<String> offsetText = offset.replaceAll("{", "").replaceAll("}", "").split(",");

    DFRect frameRect = DFRect(double.parse(frameText[0]), double.parse(frameText[1]), double.parse(frameText[2]),
        double.parse(frameText[3]));
    DFOffset frameOffset = DFOffset(double.parse(offsetText[0]), double.parse(offsetText[1]));

    /// 如果是旋转的参数也修改一下
    if (rotated) {
      frameRect = DFRect(double.parse(frameText[0]), double.parse(frameText[1]), double.parse(frameText[3]),
          double.parse(frameText[2]));
      frameOffset = DFOffset(double.parse(offsetText[1]), double.parse(offsetText[0]));
    }

    /// print("frameSize:" + frameRect.toString());
    /// print("frameOffset:" + frameOffset.toString());

    DFImageSprite sprite = DFImageSprite(
      image,
      offset: frameOffset,
      rect: frameRect,
      rotated: rotated,
      blendMode: blendMode,
    );
    sprite.scale = scale;

    /// idle_00000.png
    String actionText = "idle_";
    String action = DFAction.IDLE;
    if (key.contains("idle_")) {
      actionText = "idle_";
      action = DFAction.IDLE;
    } else if (key.contains("run_")) {
      actionText = "run_";
      action = DFAction.RUN;
    } else if (key.contains("attack_")) {
      actionText = "attack_";
      action = DFAction.ATTACK;
    } else if (key.contains("casting_")) {
      actionText = "casting_";
      action = DFAction.CASTING;
    } else if (key.contains("collect_")) {
      actionText = "collect_";
      action = DFAction.COLLECT;
    } else if (key.contains("death_")) {
      actionText = "death_";
      action = DFAction.DEATH;
    } else if (key.contains("track_")) {
      actionText = "track_";
      action = DFAction.TRACK;
    } else if (key.contains("explode_")) {
      actionText = "explode_";
      action = DFAction.EXPLODE;
    }

    String keyNumber = key.replaceAll(actionText, "").replaceAll(".png", "");
    if (keyNumber.startsWith("000")) {
      animationSprite.frames[action + DFDirection.UP]?.add(sprite);
    }
    if (keyNumber.startsWith("100")) {
      animationSprite.frames[action + DFDirection.UP_RIGHT]?.add(sprite);
      animationSprite.frames[action + DFDirection.UP_LEFT]?.add(sprite);
    }
    if (keyNumber.startsWith("200")) {
      animationSprite.frames[action + DFDirection.RIGHT]?.add(sprite);
      animationSprite.frames[action + DFDirection.LEFT]?.add(sprite);
    }
    if (keyNumber.startsWith("300")) {
      animationSprite.frames[action + DFDirection.DOWN_RIGHT]?.add(sprite);
      animationSprite.frames[action + DFDirection.DOWN_LEFT]?.add(sprite);
    }
    if (keyNumber.startsWith("400")) {
      animationSprite.frames[action + DFDirection.DOWN]?.add(sprite);
    }
  });

  return animationSprite;
}