load static method
Future<DFAnimationSprite>
load(
- String json, {
- dynamic scale = 0.5,
- 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;
}