refactor: use relative positioning

pull/25/head
Allison Ryan 4 years ago
parent 7f197a9c3a
commit dbe063b760

@ -11,13 +11,16 @@ import 'package:pinball/game/game.dart' show Anchor;
/// {@endtemplate}
class Plunger extends BodyComponent with KeyboardHandler {
/// {@macro plunger}
Plunger({required Vector2 position}) : _position = position;
Plunger({
required Vector2 position,
required this.compressionDistance,
}) : _position = position;
/// The initial position of the [Plunger] body.
final Vector2 _position;
/// Distance the plunger can lower.
static const compressionDistance = 120.0;
final double compressionDistance;
@override
Body createBody() {
@ -83,7 +86,7 @@ class PlungerAnchor extends Anchor {
}) : super(
position: Vector2(
plunger.body.position.x,
plunger.body.position.y - Plunger.compressionDistance,
plunger.body.position.y - plunger.compressionDistance,
),
);
}

@ -15,18 +15,6 @@ class PinballGame extends Forge2DGame
late final Plunger plunger;
// TODO(erickzanardo): Change to the plumber position
late final ballStartingPosition = screenToWorld(
Vector2(
camera.viewport.effectiveSize.x / 2,
camera.viewport.effectiveSize.y - 20,
),
) -
Vector2(0, -20);
// TODO(alestiago): Change to the design position.
late final flippersPosition = ballStartingPosition - Vector2(0, 5);
@override
void onAttach() {
super.onAttach();
@ -80,7 +68,7 @@ class PinballGame extends Forge2DGame
final flippersPosition = screenToWorld(
Vector2(
camera.viewport.effectiveSize.x / 2,
camera.viewport.effectiveSize.y - 120,
camera.viewport.effectiveSize.y / 1.1,
),
);
const spaceBetweenFlippers = 2;
@ -144,15 +132,17 @@ class PinballGame extends Forge2DGame
Future<void> _addPlunger() async {
late PlungerAnchor plungerAnchor;
final compressionDistance = camera.viewport.effectiveSize.y / 12;
await add(
plunger = Plunger(
position: screenToWorld(
Vector2(
camera.viewport.effectiveSize.x - 30,
camera.viewport.effectiveSize.y - Plunger.compressionDistance,
camera.viewport.effectiveSize.x / 1.035,
camera.viewport.effectiveSize.y - compressionDistance,
),
),
compressionDistance: compressionDistance,
),
);
await add(plungerAnchor = PlungerAnchor(plunger: plunger));

@ -16,11 +16,16 @@ void main() {
final flameTester = FlameTester(PinballGameX.initial);
group('Plunger', () {
const compressionDistance = 0.0;
flameTester.test(
'loads correctly',
(game) async {
await game.ready();
final plunger = Plunger(position: Vector2.zero());
final plunger = Plunger(
position: Vector2.zero(),
compressionDistance: compressionDistance,
);
await game.ensureAdd(plunger);
expect(game.contains(plunger), isTrue);
@ -32,7 +37,10 @@ void main() {
'positions correctly',
(game) async {
final position = Vector2.all(10);
final plunger = Plunger(position: position);
final plunger = Plunger(
position: position,
compressionDistance: compressionDistance,
);
await game.ensureAdd(plunger);
game.contains(plunger);
@ -43,7 +51,10 @@ void main() {
flameTester.test(
'is dynamic',
(game) async {
final plunger = Plunger(position: Vector2.zero());
final plunger = Plunger(
position: Vector2.zero(),
compressionDistance: compressionDistance,
);
await game.ensureAdd(plunger);
expect(plunger.body.bodyType, equals(BodyType.dynamic));
@ -53,7 +64,10 @@ void main() {
flameTester.test(
'ignores gravity',
(game) async {
final plunger = Plunger(position: Vector2.zero());
final plunger = Plunger(
position: Vector2.zero(),
compressionDistance: compressionDistance,
);
await game.ensureAdd(plunger);
expect(plunger.body.gravityScale, isZero);
@ -65,7 +79,10 @@ void main() {
flameTester.test(
'exists',
(game) async {
final plunger = Plunger(position: Vector2.zero());
final plunger = Plunger(
position: Vector2.zero(),
compressionDistance: compressionDistance,
);
await game.ensureAdd(plunger);
expect(plunger.body.fixtures[0], isA<Fixture>());
@ -75,7 +92,10 @@ void main() {
flameTester.test(
'shape is a polygon',
(game) async {
final plunger = Plunger(position: Vector2.zero());
final plunger = Plunger(
position: Vector2.zero(),
compressionDistance: compressionDistance,
);
await game.ensureAdd(plunger);
final fixture = plunger.body.fixtures[0];
@ -86,7 +106,10 @@ void main() {
flameTester.test(
'has density',
(game) async {
final plunger = Plunger(position: Vector2.zero());
final plunger = Plunger(
position: Vector2.zero(),
compressionDistance: compressionDistance,
);
await game.ensureAdd(plunger);
final fixture = plunger.body.fixtures[0];
@ -105,7 +128,10 @@ void main() {
late Plunger plunger;
setUp(() {
plunger = Plunger(position: Vector2.zero());
plunger = Plunger(
position: Vector2.zero(),
compressionDistance: compressionDistance,
);
});
testRawKeyUpEvents(keys, (event) {
@ -162,10 +188,15 @@ void main() {
});
group('PlungerAnchor', () {
const compressionDistance = 10.0;
flameTester.test(
'position is a compression distance below the Plunger',
(game) async {
final plunger = Plunger(position: Vector2.zero());
final plunger = Plunger(
position: Vector2.zero(),
compressionDistance: compressionDistance,
);
await game.ensureAdd(plunger);
final plungerAnchor = PlungerAnchor(plunger: plunger);
@ -173,16 +204,16 @@ void main() {
expect(
plungerAnchor.body.position.y,
equals(plunger.body.position.y - Plunger.compressionDistance),
equals(plunger.body.position.y - compressionDistance),
);
},
);
});
group('PlungerAnchorPrismaticJointDef', () {
late Plunger plunger;
const compressionDistance = 10.0;
final gameBloc = MockGameBloc();
late Plunger plunger;
setUp(() {
whenListen(
@ -190,7 +221,10 @@ void main() {
const Stream<GameState>.empty(),
initialState: const GameState.initial(),
);
plunger = Plunger(position: Vector2.zero());
plunger = Plunger(
position: Vector2.zero(),
compressionDistance: compressionDistance,
);
});
final flameTester = flameBlocTester(gameBloc: gameBloc);

Loading…
Cancel
Save