refactor: changed sparky fire zone

pull/154/head
RuiAlonso 4 years ago
parent b223ade201
commit 5a78106ed5

@ -1,6 +1,7 @@
// ignore_for_file: avoid_renaming_method_parameters // ignore_for_file: avoid_renaming_method_parameters
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pinball/flame/flame.dart'; import 'package:pinball/flame/flame.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
@ -8,27 +9,48 @@ import 'package:pinball_components/pinball_components.dart';
// TODO(ruimiguel): create and add SparkyFireZone component here in other PR. // TODO(ruimiguel): create and add SparkyFireZone component here in other PR.
class ControlledSparkyBumper extends SparkyBumper
with Controls<_SparkyBumperController> {
ControlledSparkyBumper() : super.a() {
controller = _SparkyBumperController(this);
}
}
/// {@template sparky_bumper_controller} /// {@template sparky_bumper_controller}
/// Controls a [SparkyBumper]. /// Controls a [SparkyBumper].
/// {@endtemplate} /// {@endtemplate}
@visibleForTesting class _SparkyBumperController extends ComponentController<SparkyBumper>
class SparkyBumperController extends ComponentController<SparkyBumper>
with HasGameRef<PinballGame> { with HasGameRef<PinballGame> {
/// {@macro sparky_bumper_controller} /// {@macro sparky_bumper_controller}
SparkyBumperController(SparkyBumper sparkyBumper) : super(sparkyBumper); _SparkyBumperController(SparkyBumper sparkyBumper) : super(sparkyBumper);
/// Flag for activated state of the [SparkyBumper]. /// Flag for activated state of the [SparkyBumper].
/// ///
/// Used to toggle [SparkyBumper]s' state between activated and deactivated. /// Used to toggle [SparkyBumper]s' state between activated and deactivated.
bool _isActivated = false; bool isActivated = false;
/// Registers when a [SparkyBumper] is hit by a [Ball]. /// Registers when a [SparkyBumper] is hit by a [Ball].
///
/// Triggered by [ControlledSparkyBumperBallContactCallback].
void hit() { void hit() {
if (_isActivated) { if (isActivated) {
component.deactivate(); component.deactivate();
} else { } else {
component.activate(); component.activate();
} }
_isActivated = !_isActivated; isActivated = !isActivated;
}
}
/// Listens when a [Ball] bounces bounces against a [SparkyBumper].
class ControlledSparkyBumperBallContactCallback
extends ContactCallback<Controls<_SparkyBumperController>, Ball> {
@override
void begin(
Controls<_SparkyBumperController> controlledSparkyBumper,
Ball _,
Contact __,
) {
controlledSparkyBumper.controller.hit();
} }
} }

@ -1,3 +1,8 @@
// ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.dart';
import 'package:flame_test/flame_test.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
@ -6,27 +11,57 @@ import 'package:pinball_components/pinball_components.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
void main() { void main() {
group('SparkyBumperController', () { TestWidgetsFlutterBinding.ensureInitialized();
late SparkyBumper sparkyBumper; final flameTester = FlameTester(EmptyPinballGameTest.new);
setUp(() { group('SparkyFireZone', () {
sparkyBumper = MockSparkyBumper(); group('bumpers', () {
}); late ControlledSparkyBumper controlledSparkyBumper;
flameTester.testGameWidget(
'activate when deactivated bumper is hit',
setUp: (game, tester) async {
controlledSparkyBumper = ControlledSparkyBumper();
await game.ensureAdd(controlledSparkyBumper);
final callback = ControlledSparkyBumperBallContactCallback();
game.addContactCallback(callback);
test('toggle activated state when bumper is hit', () { callback.begin(
final controller = SparkyBumperController(sparkyBumper); controlledSparkyBumper,
MockBall(),
MockContact(),
);
},
verify: (game, tester) async {
expect(controlledSparkyBumper.controller.isActivated, isTrue);
},
);
when(() => sparkyBumper.activate()).thenReturn(null); flameTester.testGameWidget(
when(() => sparkyBumper.deactivate()).thenReturn(null); 'deactivate when activated bumper is hit',
setUp: (game, tester) async {
controlledSparkyBumper = ControlledSparkyBumper();
await game.ensureAdd(controlledSparkyBumper);
controller final callback = ControlledSparkyBumperBallContactCallback();
..hit() game.addContactCallback(callback);
..hit();
verifyInOrder([ callback.begin(
() => sparkyBumper.activate(), controlledSparkyBumper,
() => sparkyBumper.deactivate(), MockBall(),
]); MockContact(),
);
callback.begin(
controlledSparkyBumper,
MockBall(),
MockContact(),
);
},
verify: (game, tester) async {
expect(controlledSparkyBumper.controller.isActivated, isFalse);
},
);
}); });
}); });
} }

@ -74,5 +74,3 @@ class MockComponentSet extends Mock implements ComponentSet {}
class MockDashNestBumper extends Mock implements DashNestBumper {} class MockDashNestBumper extends Mock implements DashNestBumper {}
class MockPinballAudio extends Mock implements PinballAudio {} class MockPinballAudio extends Mock implements PinballAudio {}
class MockSparkyBumper extends Mock implements SparkyBumper {}

Loading…
Cancel
Save