Merge pull request #668 from eseidelGoogle/music_asset

Make Asteroids.apk use background music from its bundle
diff --git a/examples/game/README.md b/examples/game/README.md
index 029c193..3492069 100644
--- a/examples/game/README.md
+++ b/examples/game/README.md
@@ -1,2 +1,4 @@
-Assets for this game are taken from Galactic Guardian:
-https://github.com/slembcke/GalacticGuardian.spritebuilder
\ No newline at end of file
+Assets for this game are from Galactic Guardian:
+https://github.com/slembcke/GalacticGuardian.spritebuilder
+And are used under MIT license:
+https://github.com/slembcke/GalacticGuardian.spritebuilder/pull/2
diff --git a/examples/game/assets/temp_music.aac b/examples/game/assets/temp_music.aac
new file mode 100644
index 0000000..934fb54
--- /dev/null
+++ b/examples/game/assets/temp_music.aac
Binary files differ
diff --git a/examples/game/lib/main.dart b/examples/game/lib/main.dart
index d18fe06..6a28fab 100644
--- a/examples/game/lib/main.dart
+++ b/examples/game/lib/main.dart
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'dart:async';
+
 import 'package:sky/mojo/asset_bundle.dart';
 import 'package:sky/theme/colors.dart' as colors;
 import 'package:sky/rendering/object.dart';
@@ -24,40 +26,48 @@
 
 final AssetBundle _bundle = _initBundle();
 
-ImageMap _loader;
+ImageMap _imageMap;
 SpriteSheet _spriteSheet;
 SpriteSheet _spriteSheetUI;
 GameDemoApp _app;
 Map<String,SoundEffect> _sounds = {};
 
 main() async {
-  _loader = new ImageMap(_bundle);
+  _imageMap = new ImageMap(_bundle);
 
-  await _loader.load([
+  // Use a list to wait on all loads in parallel just before starting the app.
+  List loads = [];
+
+  loads.add(_imageMap.load([
     'assets/nebula.png',
     'assets/sprites.png',
     'assets/starfield.png',
     'assets/game_ui.png',
-  ]);
+  ]));
 
+  // TODO(eseidel): These load in serial which is bad for startup!
   String json = await _bundle.loadString('assets/sprites.json');
-  _spriteSheet = new SpriteSheet(_loader['assets/sprites.png'], json);
+  _spriteSheet = new SpriteSheet(_imageMap['assets/sprites.png'], json);
 
   json = await _bundle.loadString('assets/game_ui.json');
-  _spriteSheetUI = new SpriteSheet(_loader["assets/game_ui.png"], json);
+  _spriteSheetUI = new SpriteSheet(_imageMap['assets/game_ui.png'], json);
 
   _app = new GameDemoApp();
 
-  _sounds["explosion"] = new SoundEffect(_bundle.load('assets/explosion.wav'));
-  _sounds["laser"] = new SoundEffect(_bundle.load('assets/laser.wav'));
+  // TODO(eseidel): SoundEffect doesn't really do anything except hold a future.
+  _sounds['explosion'] = new SoundEffect(_bundle.load('assets/explosion.wav'));
+  _sounds['laser'] = new SoundEffect(_bundle.load('assets/laser.wav'));
 
-  await _sounds["explosion"].load();
-  await _sounds["laser"].load();
+  loads.addAll([
+    _sounds['explosion'].load(),
+    _sounds['laser'].load(),
+  ]);
 
   SoundTrackPlayer stPlayer = SoundTrackPlayer.sharedInstance();
-  SoundTrack music = await stPlayer.load('https://github.com/slembcke/GalacticGuardian.spritebuilder/raw/GDC/Source/Resources/TempMusic.aac');
+  SoundTrack music = await stPlayer.load(_bundle.load('assets/temp_music.aac'));
   stPlayer.play(music);
 
+  await Future.wait(loads);
   runApp(_app);
 }
 
@@ -111,7 +121,7 @@
             _game = new GameDemoWorld(
               _app,
               navigator,
-              _loader,
+              _imageMap,
               _spriteSheet,
               _spriteSheetUI,
               _sounds,
@@ -121,8 +131,8 @@
             );
             navigator.pushNamed('/game');
           },
-          texture: _spriteSheetUI["btn_play_up.png"],
-          textureDown: _spriteSheetUI["btn_play_down.png"],
+          texture: _spriteSheetUI['btn_play_up.png'],
+          textureDown: _spriteSheetUI['btn_play_down.png'],
           width: 128.0,
           height: 128.0
         ),
@@ -231,7 +241,7 @@
 
 class MainScreenBackground extends NodeWithSize {
   MainScreenBackground() : super(new Size(1024.0, 1024.0)) {
-    Sprite sprtBackground = new Sprite.fromImage(_loader["assets/starfield.png"]);
+    Sprite sprtBackground = new Sprite.fromImage(_imageMap['assets/starfield.png']);
     sprtBackground.position = new Point(512.0, 512.0);
     addChild(sprtBackground);
 
diff --git a/examples/game/lib/sound.dart b/examples/game/lib/sound.dart
index b217090..b5ff1d9 100644
--- a/examples/game/lib/sound.dart
+++ b/examples/game/lib/sound.dart
@@ -170,16 +170,13 @@
 
   MediaServiceProxy _mediaService;
 
-  Future<SoundTrack> load(String url) async {
+  Future<SoundTrack> load(Future<MojoDataPipeConsumer> pipe) async {
     // Create media player
     SoundTrack soundTrack = new SoundTrack();
     soundTrack._player = new MediaPlayerProxy.unbound();
     _mediaService.ptr.createPlayer(soundTrack._player);
 
-    // Load and prepare
-    UrlResponse response = await fetchUrl(url);
-    await soundTrack._player.ptr.prepare(response.body);
-
+    await soundTrack._player.ptr.prepare(await pipe);
     return soundTrack;
   }
 
diff --git a/examples/game/lib/sprites.dart b/examples/game/lib/sprites.dart
index 8735554..e26bb45 100644
--- a/examples/game/lib/sprites.dart
+++ b/examples/game/lib/sprites.dart
@@ -11,11 +11,9 @@
 import 'dart:sky';
 
 import 'package:mojo/core.dart';
-import 'package:mojo/mojo/url_response.mojom.dart';
 import 'package:sky/animation/curves.dart';
 import 'package:sky/base/scheduler.dart' as scheduler;
 import 'package:sky/mojo/asset_bundle.dart';
-import 'package:sky/mojo/net/fetch.dart';
 import 'package:sky/mojo/shell.dart' as shell;
 import 'package:sky/rendering/box.dart';
 import 'package:sky/rendering/object.dart';
diff --git a/examples/game/sky.yaml b/examples/game/sky.yaml
index d88daaa..df02f36 100644
--- a/examples/game/sky.yaml
+++ b/examples/game/sky.yaml
@@ -9,3 +9,4 @@
   - assets/laser.wav
   - assets/levelup.wav
   - assets/pickup.wav
+  - assets/temp_music.aac