spritesheet.dart 2.69 KB
Newer Older
1 2 3 4
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5
part of flutter_sprites;
6 7 8 9 10 11 12 13 14

/// A sprite sheet packs a number of smaller images into a single large image.
///
/// The placement of the smaller images are defined by a json file. The larger image and json file is typically created
/// by a tool such as TexturePacker. The [SpriteSheet] class will take a reference to a larger image and a json string.
/// From the image and the string the [SpriteSheet] creates a number of [Texture] objects. The names of the frames in
/// the sprite sheet definition are used to reference the different textures.
class SpriteSheet {

15
  ui.Image _image;
Hixie's avatar
Hixie committed
16
  Map<String, Texture> _textures = new Map<String, Texture>();
17 18 19 20 21 22 23 24 25

  /// Creates a new sprite sheet from an [_image] and a sprite sheet [jsonDefinition].
  ///
  ///     var mySpriteSheet = new SpriteSheet(myImage, jsonString);
  SpriteSheet(this._image, String jsonDefinition) {
    assert(_image != null);
    assert(jsonDefinition != null);

    JsonDecoder decoder = new JsonDecoder();
26
    Map<dynamic, dynamic> file = decoder.convert(jsonDefinition);
27 28
    assert(file != null);

29
    List<dynamic> frames = file["frames"];
30

31
    for (Map<dynamic, dynamic> frameInfo in frames) {
32 33 34 35 36 37 38 39
      String fileName = frameInfo["filename"];
      Rect frame = _readJsonRect(frameInfo["frame"]);
      bool rotated = frameInfo["rotated"];
      bool trimmed = frameInfo["trimmed"];
      Rect spriteSourceSize = _readJsonRect(frameInfo["spriteSourceSize"]);
      Size sourceSize = _readJsonSize(frameInfo["sourceSize"]);
      Point pivot = _readJsonPoint(frameInfo["pivot"]);

40
      Texture texture = new Texture._fromSpriteFrame(_image, fileName, sourceSize, rotated, trimmed, frame,
41 42 43 44 45
        spriteSourceSize, pivot);
      _textures[fileName] = texture;
    }
  }

46
  Rect _readJsonRect(Map<dynamic, dynamic> data) {
47 48 49 50 51 52 53 54
    num x = data["x"];
    num y = data["y"];
    num w = data["w"];
    num h = data["h"];

    return new Rect.fromLTRB(x.toDouble(), y.toDouble(), (x + w).toDouble(), (y + h).toDouble());
  }

55
  Size _readJsonSize(Map<dynamic, dynamic> data) {
56 57 58 59 60 61
    num w = data["w"];
    num h = data["h"];

    return new Size(w.toDouble(), h.toDouble());
  }

62
  Point _readJsonPoint(Map<dynamic, dynamic> data) {
63 64 65 66 67 68 69 70 71
    num x = data["x"];
    num y = data["y"];

    return new Point(x.toDouble(), y.toDouble());
  }

  /// The image used by the sprite sheet.
  ///
  ///     var spriteSheetImage = mySpriteSheet.image;
72
  ui.Image get image => _image;
73 74 75 76 77 78

  /// Returns a texture by its name.
  ///
  ///     var myTexture = mySpriteSheet["example.png"];
  Texture operator [](String fileName) => _textures[fileName];
}