mirror of https://github.com/flutter/pinball.git
parent
0502d97400
commit
910b2ce2da
@ -0,0 +1,29 @@
|
||||
import 'package:flame/components.dart';
|
||||
import 'package:flame_bloc/flame_bloc.dart';
|
||||
import 'package:pinball/game/game.dart';
|
||||
import 'package:pinball/select_character/select_character.dart';
|
||||
import 'package:pinball_components/pinball_components.dart';
|
||||
import 'package:pinball_flame/pinball_flame.dart';
|
||||
|
||||
/// Updates the launch [Ball] to reflect character selections.
|
||||
class BallThemingBehavior extends Component
|
||||
with
|
||||
FlameBlocListenable<CharacterThemeCubit, CharacterThemeState>,
|
||||
HasGameRef {
|
||||
@override
|
||||
void onNewState(CharacterThemeState state) {
|
||||
final ballsInGame = gameRef.descendants().whereType<Ball>();
|
||||
if (ballsInGame.isNotEmpty) {
|
||||
gameRef.removeAll(ballsInGame);
|
||||
}
|
||||
final plunger = gameRef.descendants().whereType<Plunger>().single;
|
||||
final canvas = gameRef.descendants().whereType<ZCanvasComponent>().single;
|
||||
final ball = ControlledBall.launch(characterTheme: state.characterTheme)
|
||||
..initialPosition = Vector2(
|
||||
plunger.body.position.x,
|
||||
plunger.body.position.y - Ball.size.y + 1.1,
|
||||
);
|
||||
|
||||
canvas.add(ball);
|
||||
}
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
export 'ball_spawning_behavior.dart';
|
||||
export 'ball_theming_behavior.dart';
|
||||
export 'bumper_noise_behavior.dart';
|
||||
export 'camera_focusing_behavior.dart';
|
||||
export 'scoring_behavior.dart';
|
||||
|
@ -0,0 +1,86 @@
|
||||
// ignore_for_file: cascade_invocations
|
||||
|
||||
import 'package:flame/components.dart';
|
||||
import 'package:flame_bloc/flame_bloc.dart';
|
||||
import 'package:flame_forge2d/flame_forge2d.dart';
|
||||
import 'package:flame_test/flame_test.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pinball/game/behaviors/behaviors.dart';
|
||||
import 'package:pinball/select_character/select_character.dart';
|
||||
import 'package:pinball_components/pinball_components.dart';
|
||||
import 'package:pinball_flame/pinball_flame.dart';
|
||||
import 'package:pinball_theme/pinball_theme.dart' as theme;
|
||||
|
||||
class _TestGame extends Forge2DGame {
|
||||
@override
|
||||
Future<void> onLoad() async {
|
||||
images.prefix = '';
|
||||
await images.loadAll([
|
||||
theme.Assets.images.dash.ball.keyName,
|
||||
theme.Assets.images.dino.ball.keyName,
|
||||
]);
|
||||
}
|
||||
|
||||
Future<void> pump(
|
||||
List<Component> children, {
|
||||
CharacterThemeCubit? characterThemeBloc,
|
||||
}) async {
|
||||
await ensureAdd(
|
||||
FlameBlocProvider<CharacterThemeCubit, CharacterThemeState>.value(
|
||||
value: characterThemeBloc ?? CharacterThemeCubit(),
|
||||
children: children,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
group(
|
||||
'BallThemingBehavior',
|
||||
() {
|
||||
final flameTester = FlameTester(_TestGame.new);
|
||||
|
||||
test('can be instantiated', () {
|
||||
expect(
|
||||
BallThemingBehavior(),
|
||||
isA<BallThemingBehavior>(),
|
||||
);
|
||||
});
|
||||
|
||||
flameTester.test(
|
||||
'loads',
|
||||
(game) async {
|
||||
final behavior = BallThemingBehavior();
|
||||
await game.pump([behavior]);
|
||||
expect(game.descendants(), contains(behavior));
|
||||
},
|
||||
);
|
||||
|
||||
flameTester.test(
|
||||
'onNewState replaces the current ball with a new ball',
|
||||
(game) async {
|
||||
final behavior = BallThemingBehavior();
|
||||
await game.pump([
|
||||
behavior,
|
||||
ZCanvasComponent(),
|
||||
Plunger.test(compressionDistance: 10),
|
||||
Ball(),
|
||||
]);
|
||||
expect(game.descendants().whereType<Ball>(), isNotEmpty);
|
||||
final dashBall = game.descendants().whereType<Ball>().single;
|
||||
|
||||
const dinoTheme = CharacterThemeState(theme.DinoTheme());
|
||||
behavior.onNewState(dinoTheme);
|
||||
await game.ready();
|
||||
|
||||
expect(game.descendants().whereType<Ball>(), isNotEmpty);
|
||||
final dinoBall = game.descendants().whereType<Ball>().single;
|
||||
|
||||
expect(dinoBall != dashBall, isTrue);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
Loading…
Reference in new issue