mirror of https://github.com/flutter/pinball.git
chore: removed `Wall` and `Board` (#224)
* chore: remove wall and board * fix: lint * refactor: bottom group test * chore: remove start and end variables * refactor: group stories * refactor: bottom group blueprint * style: remove whitespace and add comma * refactor: add drain behavior * refactor: bottom group to component * fix: render issuepull/260/head
parent
6395835f20
commit
cf688f0f26
@ -1,86 +0,0 @@
|
|||||||
import 'package:flame/components.dart';
|
|
||||||
import 'package:pinball/game/game.dart';
|
|
||||||
import 'package:pinball_components/pinball_components.dart';
|
|
||||||
|
|
||||||
/// {@template board}
|
|
||||||
/// The main flat surface of the [PinballGame].
|
|
||||||
/// {endtemplate}
|
|
||||||
class Board extends Component {
|
|
||||||
/// {@macro board}
|
|
||||||
// TODO(alestiago): Make Board a Blueprint and sort out priorities.
|
|
||||||
Board() : super(priority: 1);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> onLoad() async {
|
|
||||||
// TODO(allisonryan0002): add bottom group and flutter forest to pinball
|
|
||||||
// game directly. Then remove board.
|
|
||||||
final bottomGroup = _BottomGroup();
|
|
||||||
|
|
||||||
final flutterForest = FlutterForest();
|
|
||||||
|
|
||||||
await addAll([
|
|
||||||
bottomGroup,
|
|
||||||
flutterForest,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// {@template bottom_group}
|
|
||||||
/// Grouping of the board's bottom [Component]s.
|
|
||||||
///
|
|
||||||
/// The [_BottomGroup] consists of[Flipper]s, [Baseboard]s and [Kicker]s.
|
|
||||||
/// {@endtemplate}
|
|
||||||
// TODO(alestiago): Consider renaming once entire Board is defined.
|
|
||||||
class _BottomGroup extends Component {
|
|
||||||
/// {@macro bottom_group}
|
|
||||||
_BottomGroup() : super(priority: RenderPriority.bottomGroup);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> onLoad() async {
|
|
||||||
final rightSide = _BottomGroupSide(
|
|
||||||
side: BoardSide.right,
|
|
||||||
);
|
|
||||||
final leftSide = _BottomGroupSide(
|
|
||||||
side: BoardSide.left,
|
|
||||||
);
|
|
||||||
|
|
||||||
await addAll([rightSide, leftSide]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// {@template bottom_group_side}
|
|
||||||
/// Group with one side of [_BottomGroup]'s symmetric [Component]s.
|
|
||||||
///
|
|
||||||
/// For example, [Flipper]s are symmetric components.
|
|
||||||
/// {@endtemplate}
|
|
||||||
class _BottomGroupSide extends Component {
|
|
||||||
/// {@macro bottom_group_side}
|
|
||||||
_BottomGroupSide({
|
|
||||||
required BoardSide side,
|
|
||||||
}) : _side = side;
|
|
||||||
|
|
||||||
final BoardSide _side;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> onLoad() async {
|
|
||||||
final direction = _side.direction;
|
|
||||||
final centerXAdjustment = _side.isLeft ? 0 : -6.5;
|
|
||||||
|
|
||||||
final flipper = ControlledFlipper(
|
|
||||||
side: _side,
|
|
||||||
)..initialPosition = Vector2((11.8 * direction) + centerXAdjustment, 43.6);
|
|
||||||
final baseboard = Baseboard(side: _side)
|
|
||||||
..initialPosition = Vector2(
|
|
||||||
(25.58 * direction) + centerXAdjustment,
|
|
||||||
28.69,
|
|
||||||
);
|
|
||||||
final kicker = Kicker(
|
|
||||||
side: _side,
|
|
||||||
)..initialPosition = Vector2(
|
|
||||||
(22.4 * direction) + centerXAdjustment,
|
|
||||||
25,
|
|
||||||
);
|
|
||||||
|
|
||||||
await addAll([flipper, baseboard, kicker]);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,58 @@
|
|||||||
|
import 'package:flame/components.dart';
|
||||||
|
import 'package:pinball/game/game.dart';
|
||||||
|
import 'package:pinball_components/pinball_components.dart';
|
||||||
|
|
||||||
|
/// {@template bottom_group}
|
||||||
|
/// Grouping of the board's symmetrical bottom [Component]s.
|
||||||
|
///
|
||||||
|
/// The [BottomGroup] consists of [Flipper]s, [Baseboard]s and [Kicker]s.
|
||||||
|
/// {@endtemplate}
|
||||||
|
// TODO(allisonryan0002): Consider renaming.
|
||||||
|
class BottomGroup extends Component {
|
||||||
|
/// {@macro bottom_group}
|
||||||
|
BottomGroup()
|
||||||
|
: super(
|
||||||
|
children: [
|
||||||
|
_BottomGroupSide(side: BoardSide.right),
|
||||||
|
_BottomGroupSide(side: BoardSide.left),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// {@template bottom_group_side}
|
||||||
|
/// Group with one side of [BottomGroup]'s symmetric [Component]s.
|
||||||
|
///
|
||||||
|
/// For example, [Flipper]s are symmetric components.
|
||||||
|
/// {@endtemplate}
|
||||||
|
class _BottomGroupSide extends Component {
|
||||||
|
/// {@macro bottom_group_side}
|
||||||
|
_BottomGroupSide({
|
||||||
|
required BoardSide side,
|
||||||
|
}) : _side = side,
|
||||||
|
super(priority: RenderPriority.bottomGroup);
|
||||||
|
|
||||||
|
final BoardSide _side;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> onLoad() async {
|
||||||
|
final direction = _side.direction;
|
||||||
|
final centerXAdjustment = _side.isLeft ? 0 : -6.5;
|
||||||
|
|
||||||
|
final flipper = ControlledFlipper(
|
||||||
|
side: _side,
|
||||||
|
)..initialPosition = Vector2((11.8 * direction) + centerXAdjustment, 43.6);
|
||||||
|
final baseboard = Baseboard(side: _side)
|
||||||
|
..initialPosition = Vector2(
|
||||||
|
(25.58 * direction) + centerXAdjustment,
|
||||||
|
28.69,
|
||||||
|
);
|
||||||
|
final kicker = Kicker(
|
||||||
|
side: _side,
|
||||||
|
)..initialPosition = Vector2(
|
||||||
|
(22.4 * direction) + centerXAdjustment,
|
||||||
|
25,
|
||||||
|
);
|
||||||
|
|
||||||
|
await addAll([flipper, baseboard, kicker]);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
import 'package:flame/components.dart';
|
||||||
|
import 'package:pinball/game/game.dart';
|
||||||
|
import 'package:pinball_components/pinball_components.dart';
|
||||||
|
import 'package:pinball_flame/pinball_flame.dart';
|
||||||
|
|
||||||
|
/// {@template dino_desert}
|
||||||
|
/// Area located next to the [Launcher] containing the [ChromeDino] and
|
||||||
|
/// [DinoWalls].
|
||||||
|
/// {@endtemplate}
|
||||||
|
// TODO(allisonryan0002): use a controller to initiate dino bonus when dino is
|
||||||
|
// fully implemented.
|
||||||
|
class DinoDesert extends Blueprint {
|
||||||
|
/// {@macro dino_desert}
|
||||||
|
DinoDesert()
|
||||||
|
: super(
|
||||||
|
components: [
|
||||||
|
ChromeDino()..initialPosition = Vector2(12.3, -6.9),
|
||||||
|
],
|
||||||
|
blueprints: [
|
||||||
|
DinoWalls(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
import 'package:flame/extensions.dart';
|
||||||
|
import 'package:flame_forge2d/flame_forge2d.dart';
|
||||||
|
import 'package:pinball/game/game.dart';
|
||||||
|
import 'package:pinball_components/pinball_components.dart';
|
||||||
|
|
||||||
|
/// {@template drain}
|
||||||
|
/// Area located at the bottom of the board to detect when a [Ball] is lost.
|
||||||
|
/// {@endtemplate}
|
||||||
|
// TODO(allisonryan0002): move to components package when possible.
|
||||||
|
class Drain extends BodyComponent with ContactCallbacks {
|
||||||
|
/// {@macro drain}
|
||||||
|
Drain() : super(renderBody: false);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Body createBody() {
|
||||||
|
final shape = EdgeShape()
|
||||||
|
..set(
|
||||||
|
BoardDimensions.bounds.bottomLeft.toVector2(),
|
||||||
|
BoardDimensions.bounds.bottomRight.toVector2(),
|
||||||
|
);
|
||||||
|
final fixtureDef = FixtureDef(shape, isSensor: true);
|
||||||
|
final bodyDef = BodyDef(userData: this);
|
||||||
|
|
||||||
|
return world.createBody(bodyDef)..createFixture(fixtureDef);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(allisonryan0002): move this to ball.dart when BallLost is removed.
|
||||||
|
@override
|
||||||
|
void beginContact(Object other, Contact contact) {
|
||||||
|
super.beginContact(other, contact);
|
||||||
|
if (other is! ControlledBall) return;
|
||||||
|
other.controller.lost();
|
||||||
|
}
|
||||||
|
}
|
@ -1,60 +0,0 @@
|
|||||||
// ignore_for_file: avoid_renaming_method_parameters
|
|
||||||
|
|
||||||
import 'package:flame/extensions.dart';
|
|
||||||
import 'package:flame_forge2d/flame_forge2d.dart';
|
|
||||||
import 'package:pinball/game/game.dart';
|
|
||||||
import 'package:pinball_components/pinball_components.dart' hide Assets;
|
|
||||||
|
|
||||||
/// {@template wall}
|
|
||||||
/// A continuous generic and [BodyType.static] barrier that divides a game area.
|
|
||||||
/// {@endtemplate}
|
|
||||||
// TODO(alestiago): Remove [Wall] for [Pathway.straight].
|
|
||||||
class Wall extends BodyComponent {
|
|
||||||
/// {@macro wall}
|
|
||||||
Wall({
|
|
||||||
required this.start,
|
|
||||||
required this.end,
|
|
||||||
});
|
|
||||||
|
|
||||||
/// The [start] of the [Wall].
|
|
||||||
final Vector2 start;
|
|
||||||
|
|
||||||
/// The [end] of the [Wall].
|
|
||||||
final Vector2 end;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Body createBody() {
|
|
||||||
final shape = EdgeShape()..set(start, end);
|
|
||||||
|
|
||||||
final fixtureDef = FixtureDef(shape)
|
|
||||||
..restitution = 0.1
|
|
||||||
..friction = 0;
|
|
||||||
|
|
||||||
final bodyDef = BodyDef()
|
|
||||||
..userData = this
|
|
||||||
..position = Vector2.zero()
|
|
||||||
..type = BodyType.static;
|
|
||||||
|
|
||||||
return world.createBody(bodyDef)..createFixture(fixtureDef);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// {@template bottom_wall}
|
|
||||||
/// [Wall] located at the bottom of the board.
|
|
||||||
///
|
|
||||||
/// {@endtemplate}
|
|
||||||
class BottomWall extends Wall with ContactCallbacks {
|
|
||||||
/// {@macro bottom_wall}
|
|
||||||
BottomWall()
|
|
||||||
: super(
|
|
||||||
start: BoardDimensions.bounds.bottomLeft.toVector2(),
|
|
||||||
end: BoardDimensions.bounds.bottomRight.toVector2(),
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
void beginContact(Object other, Contact contact) {
|
|
||||||
super.beginContact(other, contact);
|
|
||||||
if (other is! ControlledBall) return;
|
|
||||||
other.controller.lost();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
import 'package:dashbook/dashbook.dart';
|
|
||||||
import 'package:sandbox/common/common.dart';
|
|
||||||
import 'package:sandbox/stories/baseboard/baseboard_game.dart';
|
|
||||||
|
|
||||||
void addBaseboardStories(Dashbook dashbook) {
|
|
||||||
dashbook.storiesOf('Baseboard').addGame(
|
|
||||||
title: 'Traced',
|
|
||||||
description: BaseboardGame.description,
|
|
||||||
gameBuilder: (_) => BaseboardGame(),
|
|
||||||
);
|
|
||||||
}
|
|
@ -0,0 +1 @@
|
|||||||
|
export 'stories.dart';
|
@ -0,0 +1,24 @@
|
|||||||
|
import 'package:dashbook/dashbook.dart';
|
||||||
|
import 'package:sandbox/common/common.dart';
|
||||||
|
import 'package:sandbox/stories/bottom_group/baseboard_game.dart';
|
||||||
|
import 'package:sandbox/stories/bottom_group/flipper_game.dart';
|
||||||
|
import 'package:sandbox/stories/bottom_group/kicker_game.dart';
|
||||||
|
|
||||||
|
void addBottomGroupStories(Dashbook dashbook) {
|
||||||
|
dashbook.storiesOf('Bottom Group')
|
||||||
|
..addGame(
|
||||||
|
title: 'Flipper',
|
||||||
|
description: FlipperGame.description,
|
||||||
|
gameBuilder: (_) => FlipperGame(),
|
||||||
|
)
|
||||||
|
..addGame(
|
||||||
|
title: 'Kicker',
|
||||||
|
description: KickerGame.description,
|
||||||
|
gameBuilder: (_) => KickerGame(),
|
||||||
|
)
|
||||||
|
..addGame(
|
||||||
|
title: 'Baseboard',
|
||||||
|
description: BaseboardGame.description,
|
||||||
|
gameBuilder: (_) => BaseboardGame(),
|
||||||
|
);
|
||||||
|
}
|
@ -1,11 +0,0 @@
|
|||||||
import 'package:dashbook/dashbook.dart';
|
|
||||||
import 'package:sandbox/common/common.dart';
|
|
||||||
import 'package:sandbox/stories/flipper/flipper_game.dart';
|
|
||||||
|
|
||||||
void addFlipperStories(Dashbook dashbook) {
|
|
||||||
dashbook.storiesOf('Flipper').addGame(
|
|
||||||
title: 'Traced',
|
|
||||||
description: FlipperGame.description,
|
|
||||||
gameBuilder: (_) => FlipperGame(),
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
import 'package:dashbook/dashbook.dart';
|
|
||||||
import 'package:sandbox/common/common.dart';
|
|
||||||
import 'package:sandbox/stories/kicker/kicker_game.dart';
|
|
||||||
|
|
||||||
void addKickerStories(Dashbook dashbook) {
|
|
||||||
dashbook.storiesOf('Kickers').addGame(
|
|
||||||
title: 'Traced',
|
|
||||||
description: KickerGame.description,
|
|
||||||
gameBuilder: (_) => KickerGame(),
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,110 +0,0 @@
|
|||||||
// ignore_for_file: cascade_invocations
|
|
||||||
|
|
||||||
import 'package:flame_test/flame_test.dart';
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
|
||||||
import 'package:pinball/game/game.dart';
|
|
||||||
import 'package:pinball_components/pinball_components.dart';
|
|
||||||
|
|
||||||
import '../../helpers/helpers.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
TestWidgetsFlutterBinding.ensureInitialized();
|
|
||||||
final assets = [
|
|
||||||
Assets.images.dash.bumper.main.active.keyName,
|
|
||||||
Assets.images.dash.bumper.main.inactive.keyName,
|
|
||||||
Assets.images.dash.bumper.a.active.keyName,
|
|
||||||
Assets.images.dash.bumper.a.inactive.keyName,
|
|
||||||
Assets.images.dash.bumper.b.active.keyName,
|
|
||||||
Assets.images.dash.bumper.b.inactive.keyName,
|
|
||||||
Assets.images.dash.animatronic.keyName,
|
|
||||||
Assets.images.signpost.inactive.keyName,
|
|
||||||
Assets.images.signpost.active1.keyName,
|
|
||||||
Assets.images.signpost.active2.keyName,
|
|
||||||
Assets.images.signpost.active3.keyName,
|
|
||||||
Assets.images.baseboard.left.keyName,
|
|
||||||
Assets.images.baseboard.right.keyName,
|
|
||||||
Assets.images.flipper.left.keyName,
|
|
||||||
Assets.images.flipper.right.keyName,
|
|
||||||
];
|
|
||||||
final flameTester = FlameTester(
|
|
||||||
() => EmptyPinballTestGame(assets: assets),
|
|
||||||
);
|
|
||||||
|
|
||||||
group('Board', () {
|
|
||||||
flameTester.test(
|
|
||||||
'loads correctly',
|
|
||||||
(game) async {
|
|
||||||
final board = Board();
|
|
||||||
await game.ready();
|
|
||||||
await game.ensureAdd(board);
|
|
||||||
|
|
||||||
expect(game.contains(board), isTrue);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
group('loads', () {
|
|
||||||
flameTester.test(
|
|
||||||
'one left flipper',
|
|
||||||
(game) async {
|
|
||||||
final board = Board();
|
|
||||||
await game.ready();
|
|
||||||
await game.ensureAdd(board);
|
|
||||||
|
|
||||||
final leftFlippers = board.descendants().whereType<Flipper>().where(
|
|
||||||
(flipper) => flipper.side.isLeft,
|
|
||||||
);
|
|
||||||
expect(leftFlippers.length, equals(1));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.test(
|
|
||||||
'one right flipper',
|
|
||||||
(game) async {
|
|
||||||
final board = Board();
|
|
||||||
await game.ready();
|
|
||||||
await game.ensureAdd(board);
|
|
||||||
final rightFlippers = board.descendants().whereType<Flipper>().where(
|
|
||||||
(flipper) => flipper.side.isRight,
|
|
||||||
);
|
|
||||||
expect(rightFlippers.length, equals(1));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.test(
|
|
||||||
'two Baseboards',
|
|
||||||
(game) async {
|
|
||||||
final board = Board();
|
|
||||||
await game.ready();
|
|
||||||
await game.ensureAdd(board);
|
|
||||||
|
|
||||||
final baseboards = board.descendants().whereType<Baseboard>();
|
|
||||||
expect(baseboards.length, equals(2));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.test(
|
|
||||||
'two Kickers',
|
|
||||||
(game) async {
|
|
||||||
final board = Board();
|
|
||||||
await game.ready();
|
|
||||||
await game.ensureAdd(board);
|
|
||||||
|
|
||||||
final kickers = board.descendants().whereType<Kicker>();
|
|
||||||
expect(kickers.length, equals(2));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.test(
|
|
||||||
'one FlutterForest',
|
|
||||||
(game) async {
|
|
||||||
final board = Board();
|
|
||||||
await game.ready();
|
|
||||||
await game.ensureAdd(board);
|
|
||||||
|
|
||||||
final flutterForest = board.descendants().whereType<FlutterForest>();
|
|
||||||
expect(flutterForest.length, equals(1));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
@ -0,0 +1,86 @@
|
|||||||
|
// ignore_for_file: cascade_invocations
|
||||||
|
|
||||||
|
import 'package:flame_test/flame_test.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:pinball/game/game.dart';
|
||||||
|
import 'package:pinball_components/pinball_components.dart';
|
||||||
|
|
||||||
|
import '../../helpers/helpers.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
TestWidgetsFlutterBinding.ensureInitialized();
|
||||||
|
final assets = [
|
||||||
|
Assets.images.baseboard.left.keyName,
|
||||||
|
Assets.images.baseboard.right.keyName,
|
||||||
|
Assets.images.flipper.left.keyName,
|
||||||
|
Assets.images.flipper.right.keyName,
|
||||||
|
];
|
||||||
|
final flameTester = FlameTester(
|
||||||
|
() => EmptyPinballTestGame(assets: assets),
|
||||||
|
);
|
||||||
|
|
||||||
|
group('BottomGroup', () {
|
||||||
|
flameTester.test(
|
||||||
|
'loads correctly',
|
||||||
|
(game) async {
|
||||||
|
final bottomGroup = BottomGroup();
|
||||||
|
await game.ensureAdd(bottomGroup);
|
||||||
|
|
||||||
|
expect(game.contains(bottomGroup), isTrue);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
group('loads', () {
|
||||||
|
flameTester.test(
|
||||||
|
'one left flipper',
|
||||||
|
(game) async {
|
||||||
|
final bottomGroup = BottomGroup();
|
||||||
|
await game.ensureAdd(bottomGroup);
|
||||||
|
|
||||||
|
final leftFlippers =
|
||||||
|
bottomGroup.descendants().whereType<Flipper>().where(
|
||||||
|
(flipper) => flipper.side.isLeft,
|
||||||
|
);
|
||||||
|
expect(leftFlippers.length, equals(1));
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
flameTester.test(
|
||||||
|
'one right flipper',
|
||||||
|
(game) async {
|
||||||
|
final bottomGroup = BottomGroup();
|
||||||
|
await game.ensureAdd(bottomGroup);
|
||||||
|
|
||||||
|
final rightFlippers =
|
||||||
|
bottomGroup.descendants().whereType<Flipper>().where(
|
||||||
|
(flipper) => flipper.side.isRight,
|
||||||
|
);
|
||||||
|
expect(rightFlippers.length, equals(1));
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
flameTester.test(
|
||||||
|
'two Baseboards',
|
||||||
|
(game) async {
|
||||||
|
final bottomGroup = BottomGroup();
|
||||||
|
await game.ensureAdd(bottomGroup);
|
||||||
|
|
||||||
|
final basebottomGroups =
|
||||||
|
bottomGroup.descendants().whereType<Baseboard>();
|
||||||
|
expect(basebottomGroups.length, equals(2));
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
flameTester.test(
|
||||||
|
'two Kickers',
|
||||||
|
(game) async {
|
||||||
|
final bottomGroup = BottomGroup();
|
||||||
|
await game.ensureAdd(bottomGroup);
|
||||||
|
|
||||||
|
final kickers = bottomGroup.descendants().whereType<Kicker>();
|
||||||
|
expect(kickers.length, equals(2));
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
// ignore_for_file: cascade_invocations
|
||||||
|
|
||||||
|
import 'package:flame_forge2d/flame_forge2d.dart';
|
||||||
|
import 'package:flame_test/flame_test.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:mocktail/mocktail.dart';
|
||||||
|
import 'package:pinball/game/game.dart';
|
||||||
|
|
||||||
|
import '../../helpers/helpers.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
TestWidgetsFlutterBinding.ensureInitialized();
|
||||||
|
final flameTester = FlameTester(TestGame.new);
|
||||||
|
|
||||||
|
group('Drain', () {
|
||||||
|
flameTester.test(
|
||||||
|
'loads correctly',
|
||||||
|
(game) async {
|
||||||
|
final drain = Drain();
|
||||||
|
await game.ensureAdd(drain);
|
||||||
|
|
||||||
|
expect(game.contains(drain), isTrue);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
flameTester.test(
|
||||||
|
'body is static',
|
||||||
|
(game) async {
|
||||||
|
final drain = Drain();
|
||||||
|
await game.ensureAdd(drain);
|
||||||
|
|
||||||
|
expect(drain.body.bodyType, equals(BodyType.static));
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
flameTester.test(
|
||||||
|
'is sensor',
|
||||||
|
(game) async {
|
||||||
|
final drain = Drain();
|
||||||
|
await game.ensureAdd(drain);
|
||||||
|
|
||||||
|
expect(drain.body.fixtures.first.isSensor, isTrue);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
test(
|
||||||
|
'calls lost on contact with ball',
|
||||||
|
() async {
|
||||||
|
final drain = Drain();
|
||||||
|
final ball = MockControlledBall();
|
||||||
|
final controller = MockBallController();
|
||||||
|
when(() => ball.controller).thenReturn(controller);
|
||||||
|
|
||||||
|
drain.beginContact(ball, MockContact());
|
||||||
|
|
||||||
|
verify(controller.lost).called(1);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
@ -1,165 +0,0 @@
|
|||||||
// ignore_for_file: cascade_invocations
|
|
||||||
|
|
||||||
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/game.dart';
|
|
||||||
|
|
||||||
import '../../helpers/helpers.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
TestWidgetsFlutterBinding.ensureInitialized();
|
|
||||||
final flameTester = FlameTester(EmptyPinballTestGame.new);
|
|
||||||
|
|
||||||
group('Wall', () {
|
|
||||||
flameTester.test(
|
|
||||||
'loads correctly',
|
|
||||||
(game) async {
|
|
||||||
await game.ready();
|
|
||||||
final wall = Wall(
|
|
||||||
start: Vector2.zero(),
|
|
||||||
end: Vector2(100, 0),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(wall);
|
|
||||||
|
|
||||||
expect(game.contains(wall), isTrue);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
group('body', () {
|
|
||||||
flameTester.test(
|
|
||||||
'positions correctly',
|
|
||||||
(game) async {
|
|
||||||
final wall = Wall(
|
|
||||||
start: Vector2.zero(),
|
|
||||||
end: Vector2(100, 0),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(wall);
|
|
||||||
game.contains(wall);
|
|
||||||
|
|
||||||
expect(wall.body.position, Vector2.zero());
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.test(
|
|
||||||
'is static',
|
|
||||||
(game) async {
|
|
||||||
final wall = Wall(
|
|
||||||
start: Vector2.zero(),
|
|
||||||
end: Vector2(100, 0),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(wall);
|
|
||||||
|
|
||||||
expect(wall.body.bodyType, equals(BodyType.static));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
group('fixture', () {
|
|
||||||
flameTester.test(
|
|
||||||
'exists',
|
|
||||||
(game) async {
|
|
||||||
final wall = Wall(
|
|
||||||
start: Vector2.zero(),
|
|
||||||
end: Vector2(100, 0),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(wall);
|
|
||||||
|
|
||||||
expect(wall.body.fixtures[0], isA<Fixture>());
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.test(
|
|
||||||
'has restitution',
|
|
||||||
(game) async {
|
|
||||||
final wall = Wall(
|
|
||||||
start: Vector2.zero(),
|
|
||||||
end: Vector2(100, 0),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(wall);
|
|
||||||
|
|
||||||
final fixture = wall.body.fixtures[0];
|
|
||||||
expect(fixture.restitution, greaterThan(0));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.test(
|
|
||||||
'has no friction',
|
|
||||||
(game) async {
|
|
||||||
final wall = Wall(
|
|
||||||
start: Vector2.zero(),
|
|
||||||
end: Vector2(100, 0),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(wall);
|
|
||||||
|
|
||||||
final fixture = wall.body.fixtures[0];
|
|
||||||
expect(fixture.friction, equals(0));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
group(
|
|
||||||
'BottomWall',
|
|
||||||
() {
|
|
||||||
group('removes ball on contact', () {
|
|
||||||
late GameBloc gameBloc;
|
|
||||||
|
|
||||||
setUp(() {
|
|
||||||
gameBloc = GameBloc();
|
|
||||||
});
|
|
||||||
|
|
||||||
final flameBlocTester = FlameBlocTester<PinballGame, GameBloc>(
|
|
||||||
gameBuilder: EmptyPinballTestGame.new,
|
|
||||||
blocBuilder: () => gameBloc,
|
|
||||||
);
|
|
||||||
|
|
||||||
flameBlocTester.testGameWidget(
|
|
||||||
'when ball is launch',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
final ball = ControlledBall.launch(
|
|
||||||
characterTheme: game.characterTheme,
|
|
||||||
);
|
|
||||||
final wall = BottomWall();
|
|
||||||
await game.ensureAddAll([ball, wall]);
|
|
||||||
|
|
||||||
beginContact(game, ball, wall);
|
|
||||||
await game.ready();
|
|
||||||
|
|
||||||
expect(game.contains(ball), isFalse);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameBlocTester.testGameWidget(
|
|
||||||
'when ball is bonus',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
final ball = ControlledBall.bonus(
|
|
||||||
characterTheme: game.characterTheme,
|
|
||||||
);
|
|
||||||
final wall = BottomWall();
|
|
||||||
await game.ensureAddAll([ball, wall]);
|
|
||||||
|
|
||||||
beginContact(game, ball, wall);
|
|
||||||
await game.ready();
|
|
||||||
|
|
||||||
expect(game.contains(ball), isFalse);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameBlocTester.testGameWidget(
|
|
||||||
'when ball is debug',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
final ball = ControlledBall.debug();
|
|
||||||
final wall = BottomWall();
|
|
||||||
await game.ensureAddAll([ball, wall]);
|
|
||||||
|
|
||||||
beginContact(game, ball, wall);
|
|
||||||
await game.ready();
|
|
||||||
|
|
||||||
expect(game.contains(ball), isFalse);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
Loading…
Reference in new issue