11import 'dart:async' ;
22import 'dart:math' ;
3+ import 'dart:typed_data' ;
34import 'dart:ui' ;
45
56import 'package:crystal_ball/game/game.dart' ;
7+ import 'package:crystal_ball/gen/assets.gen.dart' ;
68import 'package:flame/components.dart' ;
9+ import 'package:flame/flame.dart' ;
710import 'package:flame/game.dart' ;
811import 'package:flame/input.dart' ;
912import 'package:flame_bloc/flame_bloc.dart' ;
1013import 'package:flutter/painting.dart' ;
14+ import 'package:flutter/widgets.dart' show FlutterError, FlutterErrorDetails;
1115
1216class CrystalBallGame extends FlameGame <CrystalWorld >
1317 with HasKeyboardHandlerComponents , HasCollisionDetection {
1418 CrystalBallGame ({
1519 required this .textStyle,
1620 required this .random,
1721 required this .gameCubit,
18- required this .platformsShader,
19- required this .theBallShader,
20- required this .groundShader,
22+ required this .assetsCache,
2123 required this .pixelRatio,
2224 }) : super (
2325 world: CrystalWorld (
@@ -40,7 +42,6 @@ class CrystalBallGame extends FlameGame<CrystalWorld>
4042 add (cameraWithCameras);
4143 add (camerasWorld);
4244
43-
4445 world.addAll ([
4546 directionalController = KeyboardHandlerSync (),
4647 ]);
@@ -51,11 +52,9 @@ class CrystalBallGame extends FlameGame<CrystalWorld>
5152 final GameCubit gameCubit;
5253 final double pixelRatio;
5354
54- late final KeyboardHandlerSync directionalController ;
55+ final AssetsCache assetsCache ;
5556
56- final FragmentShader platformsShader;
57- final FragmentShader theBallShader;
58- final FragmentShader groundShader;
57+ late final KeyboardHandlerSync directionalController;
5958
6059 FutureOr <void > addCamera (CameraComponent component) {
6160 return add (component..follow (world.cameraTarget));
@@ -69,12 +68,11 @@ class CrystalBallGame extends FlameGame<CrystalWorld>
6968 world: camera.world,
7069 );
7170
72-
7371 late final camerasWorld = World ();
7472
7573 late final cameraWithCameras = SamplerCamera (
7674 samplerOwner: GroundSamplerOwner (
77- groundShader,
75+ assetsCache. groundShader,
7876 world,
7977 ),
8078 world: camerasWorld,
@@ -83,12 +81,11 @@ class CrystalBallGame extends FlameGame<CrystalWorld>
8381 theBallGlowCamera..follow (world.cameraTarget),
8482 ],
8583 pixelRatio: pixelRatio,
86-
8784 );
8885
8986 late final platformGlowCamera = SamplerCamera .withFixedResolution (
9087 samplerOwner: PlatformsSamplerOwner (
91- platformsShader,
88+ assetsCache. platformsShader,
9289 world,
9390 ),
9491 world: camera.world,
@@ -99,7 +96,7 @@ class CrystalBallGame extends FlameGame<CrystalWorld>
9996
10097 late final theBallGlowCamera = SamplerCamera .withFixedResolution (
10198 samplerOwner: TheBallSamplerOwner (
102- theBallShader,
99+ assetsCache. theBallShader,
103100 world,
104101 ),
105102 world: camera.world,
@@ -116,3 +113,59 @@ class CrystalBallGame extends FlameGame<CrystalWorld>
116113 @override
117114 Future <void > onLoad () async {}
118115}
116+
117+ class AssetsCache {
118+ AssetsCache ({
119+ required this .concreteImage,
120+ required this .platformsShader,
121+ required this .theBallShader,
122+ required this .groundShader,
123+ }) : super ();
124+
125+ static Future <AssetsCache > loadAll () async {
126+ final [concrete] = await Future .wait ([
127+ _loadImage (Assets .images.concrete.keyName),
128+ ]);
129+
130+ final [
131+ platformsShader,
132+ theBallShader,
133+ groundShader,
134+ ] = await Future .wait ([
135+ _loadShader ('shaders/platforms.glsl' ),
136+ _loadShader ('shaders/the_ball.glsl' ),
137+ _loadShader ('shaders/ground.glsl' ),
138+ ]);
139+
140+ return AssetsCache (
141+ concreteImage: concrete,
142+ platformsShader: platformsShader,
143+ theBallShader: theBallShader,
144+ groundShader: groundShader,
145+ );
146+ }
147+
148+ static Future <Image > _loadImage (String name) async {
149+ final data = await Flame .bundle.load (name);
150+ final bytes = Uint8List .view (data.buffer);
151+ return decodeImageFromList (bytes);
152+ }
153+
154+ static Future <FragmentShader > _loadShader (String name) async {
155+ try {
156+ final program = await FragmentProgram .fromAsset (name);
157+ return program.fragmentShader ();
158+ } catch (error, stackTrace) {
159+ FlutterError .reportError (
160+ FlutterErrorDetails (exception: error, stack: stackTrace),
161+ );
162+ rethrow ;
163+ }
164+ }
165+
166+ final Image concreteImage;
167+
168+ final FragmentShader platformsShader;
169+ final FragmentShader theBallShader;
170+ final FragmentShader groundShader;
171+ }
0 commit comments