Files
flame/lib/assets/images.dart
2020-09-30 00:07:10 -03:00

77 lines
2.0 KiB
Dart

import 'dart:async';
import 'dart:convert' show base64;
import 'dart:typed_data';
import 'dart:ui';
import '../flame.dart';
class Images {
final Map<String, _ImageAssetLoader> _loadedFiles = {};
void clear(String fileName) {
_loadedFiles.remove(fileName);
}
void clearCache() {
_loadedFiles.clear();
}
Image fromCache(String fileName) {
final image = _loadedFiles[fileName];
assert(
image?.loadedImage != null,
'Tried to access an inexistent entry on cache "$fileName", make sure to use the load method before accessing a file on the cache',
);
return image.loadedImage;
}
Future<List<Image>> loadAll(List<String> fileNames) async {
return Future.wait(fileNames.map(load));
}
Future<Image> load(String fileName) async {
if (!_loadedFiles.containsKey(fileName)) {
_loadedFiles[fileName] = _ImageAssetLoader(_fetchToMemory(fileName));
}
return await _loadedFiles[fileName].retreive();
}
Future<Image> fromBase64(String fileName, String base64) async {
if (!_loadedFiles.containsKey(fileName)) {
_loadedFiles[fileName] = _ImageAssetLoader(_fetchFromBase64(base64));
}
return await _loadedFiles[fileName].retreive();
}
Future<Image> _fetchFromBase64(String base64Data) async {
final data = base64Data.substring(base64Data.indexOf(',') + 1);
final Uint8List bytes = base64.decode(data);
return _loadBytes(bytes);
}
Future<Image> _fetchToMemory(String name) async {
final ByteData data = await Flame.bundle.load('assets/images/' + name);
final Uint8List bytes = Uint8List.view(data.buffer);
return _loadBytes(bytes);
}
Future<Image> _loadBytes(Uint8List bytes) {
final Completer<Image> completer = Completer();
decodeImageFromList(bytes, (image) => completer.complete(image));
return completer.future;
}
}
class _ImageAssetLoader {
_ImageAssetLoader(this.future);
Image loadedImage;
Future<Image> future;
Future<Image> retreive() async {
loadedImage ??= await future;
return loadedImage;
}
}