diff --git a/CHANGELOG.md b/CHANGELOG.md index 93b80e1f5..e21993696 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # CHANGELOG ## [next] + - Adding method to load image bases on base64 data url. ## 0.20.0 - Refactor game.dart classes into separate files diff --git a/doc/examples/sprites/.gitignore b/doc/examples/sprites/.gitignore index 6a66cc27d..660dd3d09 100644 --- a/doc/examples/sprites/.gitignore +++ b/doc/examples/sprites/.gitignore @@ -72,3 +72,4 @@ macos test .flutter-plugins-dependencies +web diff --git a/doc/examples/sprites/lib/generated_plugin_registrant.dart b/doc/examples/sprites/lib/generated_plugin_registrant.dart new file mode 100644 index 000000000..db367c1ae --- /dev/null +++ b/doc/examples/sprites/lib/generated_plugin_registrant.dart @@ -0,0 +1,16 @@ +// +// Generated file. Do not edit. +// + +// ignore: unused_import +import 'dart:ui'; + +import 'package:audioplayers/audioplayers_web.dart'; + +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; + +// ignore: public_member_api_docs +void registerPlugins(PluginRegistry registry) { + AudioplayersPlugin.registerWith(registry.registrarFor(AudioplayersPlugin)); + registry.registerMessageHandler(); +} diff --git a/doc/examples/sprites/lib/main_base64.dart b/doc/examples/sprites/lib/main_base64.dart new file mode 100644 index 000000000..b77938acd --- /dev/null +++ b/doc/examples/sprites/lib/main_base64.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart' hide Image; + +import 'package:flame/flame.dart'; +import 'package:flame/sprite.dart'; +import 'package:flame/game.dart'; + +import 'dart:ui'; + +void main() async { + const exampleUrl = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAxElEQVQ4jYWTMQ7DIAxFIeoNuAGK1K1ISL0DMwOHzNC5p6iUPeoNOEM7GZnPJ/EUbP7Lx7KtIfH91B/L++gs5m5M9NreTN/dEZiVghatwbXvY68UlksyPjprRaxFGAJZg+uAuSSzzC7rEDirDYAz2wg0RjWRFa/EUwdnQnQ37QFe1Odjrw04AKTTaBXPAlx8dDaXdNk4rMsc0B7ge/UcYLTZxoFizxCQ/L0DMAhaX4Mzj/uzW6phu3AvtHUUU4BAWJ6t8x9N/HHcruXjwQAAAABJRU5ErkJggg=='; + + final image = await Flame.images.fromBase64('shield.png', exampleUrl); + + runApp(MyGame(image).widget); +} + +class MyGame extends Game { + Sprite _sprite; + + MyGame(Image image) { + _sprite = Sprite.fromImage(image); + } + + @override + void update(dt) {} + + @override + void render(Canvas canvas) { + _sprite.renderRect(canvas, const Rect.fromLTWH(100, 100, 100, 100)); + } +} diff --git a/lib/images.dart b/lib/images.dart index f9a031732..8c7f2a4bd 100644 --- a/lib/images.dart +++ b/lib/images.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:typed_data'; import 'dart:ui'; +import 'dart:convert' show base64; import 'package:flame/flame.dart'; @@ -26,9 +27,26 @@ class Images { return loadedFiles[fileName]; } + Future fromBase64(String fileName, String base64) async { + if (!loadedFiles.containsKey(fileName)) { + loadedFiles[fileName] = await _fetchFromBase64(base64); + } + return loadedFiles[fileName]; + } + + Future _fetchFromBase64(String base64Data) async { + final data = base64Data.substring(base64Data.indexOf(',') + 1); + final Uint8List bytes = base64.decode(data); + return _loadBytes(bytes); + } + Future _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 _loadBytes(Uint8List bytes) { final Completer completer = Completer(); decodeImageFromList(bytes, (image) => completer.complete(image)); return completer.future;