mirror of https://github.com/flutter/pinball.git
parent
df7408728e
commit
9ec099ab4e
@ -1,15 +1,13 @@
|
||||
// ignore_for_file: public_member_api_docs
|
||||
|
||||
import 'package:flame/components.dart';
|
||||
import 'package:flame_forge2d/flame_forge2d.dart';
|
||||
import 'package:pinball/game/pinball_game.dart';
|
||||
import 'package:pinball_audio/pinball_audio.dart';
|
||||
import 'package:pinball_flame/pinball_flame.dart';
|
||||
|
||||
class BumperNoisyBehavior extends ContactBehavior with HasGameRef<PinballGame> {
|
||||
class BumperNoisyBehavior extends ContactBehavior {
|
||||
@override
|
||||
void beginContact(Object other, Contact contact) {
|
||||
super.beginContact(other, contact);
|
||||
gameRef.player.play(PinballAudio.bumper);
|
||||
readProvider<PinballPlayer>().play(PinballAudio.bumper);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,65 @@
|
||||
// ignore_for_file: public_member_api_docs
|
||||
|
||||
import 'package:flame/components.dart';
|
||||
|
||||
class FlameProvider<T> extends Component {
|
||||
FlameProvider.value(
|
||||
this.provider, {
|
||||
Iterable<Component>? children,
|
||||
}) : super(
|
||||
children: children,
|
||||
);
|
||||
|
||||
final T provider;
|
||||
}
|
||||
|
||||
class MultiFlameProvider extends Component {
|
||||
MultiFlameProvider({
|
||||
required List<FlameProvider<dynamic>> providers,
|
||||
Iterable<Component>? children,
|
||||
}) : _providers = providers,
|
||||
_initialChildren = children,
|
||||
assert(providers.isNotEmpty, 'At least one provider must be given') {
|
||||
_addProviders();
|
||||
}
|
||||
|
||||
final List<FlameProvider<dynamic>> _providers;
|
||||
final Iterable<Component>? _initialChildren;
|
||||
FlameProvider<dynamic>? _lastProvider;
|
||||
|
||||
Future<void> _addProviders() async {
|
||||
final _list = [..._providers];
|
||||
|
||||
var current = _list.removeAt(0);
|
||||
while (_list.isNotEmpty) {
|
||||
final provider = _list.removeAt(0);
|
||||
await current.add(provider);
|
||||
current = provider;
|
||||
}
|
||||
|
||||
await add(_providers.first);
|
||||
_lastProvider = current;
|
||||
|
||||
_initialChildren?.forEach(add);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> add(Component component) async {
|
||||
if (_lastProvider == null) {
|
||||
await super.add(component);
|
||||
}
|
||||
await _lastProvider?.add(component);
|
||||
}
|
||||
}
|
||||
|
||||
extension ReadFlameProvider on Component {
|
||||
T readProvider<T>() {
|
||||
final providers = ancestors().whereType<FlameProvider<T>>();
|
||||
assert(
|
||||
providers.isNotEmpty,
|
||||
'No FlameProvider<$T> available on the component tree',
|
||||
);
|
||||
|
||||
return providers.first.provider;
|
||||
}
|
||||
}
|
@ -1,122 +0,0 @@
|
||||
// ignore_for_file: must_call_super
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flame/input.dart';
|
||||
import 'package:flame_bloc/flame_bloc.dart';
|
||||
import 'package:flame_forge2d/flame_forge2d.dart';
|
||||
import 'package:leaderboard_repository/leaderboard_repository.dart';
|
||||
import 'package:mocktail/mocktail.dart';
|
||||
import 'package:pinball/game/game.dart';
|
||||
import 'package:pinball/l10n/l10n.dart';
|
||||
import 'package:pinball_audio/pinball_audio.dart';
|
||||
import 'package:pinball_theme/pinball_theme.dart';
|
||||
|
||||
class _MockPinballPlayer extends Mock implements PinballPlayer {}
|
||||
|
||||
class _MockAppLocalizations extends Mock implements AppLocalizations {}
|
||||
|
||||
class _MockLeaderboardRepository extends Mock implements LeaderboardRepository {
|
||||
}
|
||||
|
||||
class TestGame extends Forge2DGame with FlameBloc {
|
||||
TestGame() {
|
||||
images.prefix = '';
|
||||
}
|
||||
}
|
||||
|
||||
class PinballTestGame extends PinballGame {
|
||||
PinballTestGame({
|
||||
List<String>? assets,
|
||||
PinballPlayer? player,
|
||||
LeaderboardRepository? leaderboardRepository,
|
||||
CharacterTheme? theme,
|
||||
AppLocalizations? l10n,
|
||||
}) : _assets = assets,
|
||||
super(
|
||||
player: player ?? _MockPinballPlayer(),
|
||||
leaderboardRepository:
|
||||
leaderboardRepository ?? _MockLeaderboardRepository(),
|
||||
characterTheme: theme ?? const DashTheme(),
|
||||
l10n: l10n ?? _MockAppLocalizations(),
|
||||
);
|
||||
final List<String>? _assets;
|
||||
|
||||
@override
|
||||
Future<void> onLoad() async {
|
||||
if (_assets != null) {
|
||||
await images.loadAll(_assets!);
|
||||
}
|
||||
await super.onLoad();
|
||||
}
|
||||
}
|
||||
|
||||
class DebugPinballTestGame extends DebugPinballGame {
|
||||
DebugPinballTestGame({
|
||||
List<String>? assets,
|
||||
PinballPlayer? player,
|
||||
LeaderboardRepository? leaderboardRepository,
|
||||
CharacterTheme? theme,
|
||||
AppLocalizations? l10n,
|
||||
}) : _assets = assets,
|
||||
super(
|
||||
player: player ?? _MockPinballPlayer(),
|
||||
leaderboardRepository:
|
||||
leaderboardRepository ?? _MockLeaderboardRepository(),
|
||||
characterTheme: theme ?? const DashTheme(),
|
||||
l10n: l10n ?? _MockAppLocalizations(),
|
||||
);
|
||||
|
||||
final List<String>? _assets;
|
||||
|
||||
@override
|
||||
Future<void> onLoad() async {
|
||||
if (_assets != null) {
|
||||
await images.loadAll(_assets!);
|
||||
}
|
||||
await super.onLoad();
|
||||
}
|
||||
}
|
||||
|
||||
class EmptyPinballTestGame extends PinballTestGame {
|
||||
EmptyPinballTestGame({
|
||||
List<String>? assets,
|
||||
PinballPlayer? player,
|
||||
CharacterTheme? theme,
|
||||
AppLocalizations? l10n,
|
||||
}) : super(
|
||||
assets: assets,
|
||||
player: player,
|
||||
theme: theme,
|
||||
l10n: l10n ?? _MockAppLocalizations(),
|
||||
);
|
||||
|
||||
@override
|
||||
Future<void> onLoad() async {
|
||||
if (_assets != null) {
|
||||
await images.loadAll(_assets!);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class EmptyKeyboardPinballTestGame extends PinballTestGame
|
||||
with HasKeyboardHandlerComponents {
|
||||
EmptyKeyboardPinballTestGame({
|
||||
List<String>? assets,
|
||||
PinballPlayer? player,
|
||||
CharacterTheme? theme,
|
||||
AppLocalizations? l10n,
|
||||
}) : super(
|
||||
assets: assets,
|
||||
player: player,
|
||||
theme: theme,
|
||||
l10n: l10n ?? _MockAppLocalizations(),
|
||||
);
|
||||
|
||||
@override
|
||||
Future<void> onLoad() async {
|
||||
if (_assets != null) {
|
||||
await images.loadAll(_assets!);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue