Merge remote-tracking branch 'origin' into refactor/rename-dash-bumper

pull/381/head
alestiago 3 years ago
commit b3230f3aa4

@ -2,3 +2,6 @@ include: package:very_good_analysis/analysis_options.2.4.0.yaml
analyzer:
exclude:
- lib/**/*.gen.dart
linter:
rules:
public_member_api_docs: false

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:authentication_repository/authentication_repository.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'dart:async';
import 'dart:developer';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_flame/pinball_flame.dart';

@ -1,4 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'dart:math' as math;
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'game_bloc.dart';
@immutable

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'game_bloc.dart';
/// Defines bonuses that a player can gain during a PinballGame.

@ -1,4 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'dart:async';
import 'package:flame/components.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame/game.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'dart:async';
import 'package:flutter/material.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:pinball_theme/pinball_theme.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'character_theme_cubit.dart';
class CharacterThemeState extends Equatable {

@ -69,9 +69,9 @@ class _CharacterGrid extends StatelessWidget {
child: Column(
children: [
_Character(
key: const Key('sparky_character_selection'),
character: const SparkyTheme(),
isSelected: state.isSparkySelected,
key: const Key('dash_character_selection'),
character: const DashTheme(),
isSelected: state.isDashSelected,
),
const SizedBox(height: 6),
_Character(
@ -87,9 +87,9 @@ class _CharacterGrid extends StatelessWidget {
child: Column(
children: [
_Character(
key: const Key('dash_character_selection'),
character: const DashTheme(),
isSelected: state.isDashSelected,
key: const Key('sparky_character_selection'),
character: const SparkyTheme(),
isSelected: state.isSparkySelected,
),
const SizedBox(height: 6),
_Character(

@ -2,3 +2,6 @@ include: package:very_good_analysis/analysis_options.2.4.0.yaml
analyzer:
exclude:
- lib/**/*.gen.dart
linter:
rules:
public_member_api_docs: false

@ -103,7 +103,6 @@ class AndroidBumper extends BodyComponent with InitialPosition, ZIndex {
final double _minorRadius;
// ignore: public_member_api_docs
final AndroidBumperCubit bloc;
@override

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'android_bumper_state.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'android_bumper_cubit.dart';
enum AndroidBumperState {

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'dart:async';
import 'dart:math' as math;

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'android_spaceship_state.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'android_spaceship_cubit.dart';
enum AndroidSpaceshipState {

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:pinball_theme/pinball_theme.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'ball_cubit.dart';
class BallState extends Equatable {

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame/components.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';

@ -43,7 +43,6 @@ class ChromeDino extends BodyComponent
required this.bloc,
});
// ignore: public_member_api_docs
final ChromeDinoCubit bloc;
/// Angle to rotate the dino up or down from the starting horizontal position.

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:pinball_components/pinball_components.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'chrome_dino_cubit.dart';
enum ChromeDinoStatus {

@ -21,7 +21,6 @@ export 'initial_position.dart';
export 'joint_anchor.dart';
export 'kicker/kicker.dart';
export 'launch_ramp.dart';
export 'layer.dart';
export 'layer_sensor/layer_sensor.dart';
export 'multiball/multiball.dart';
export 'multiplier/multiplier.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'dash_bumper_state.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'google_letter_state.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'google_letter_cubit.dart';
enum GoogleLetterState {

@ -73,7 +73,6 @@ class GoogleLetter extends BodyComponent with InitialPosition {
required this.bloc,
});
// ignore: public_member_api_docs
final GoogleLetterCubit bloc;
@override

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'kicker_state.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'kicker_cubit.dart';
enum KickerState {

@ -57,7 +57,6 @@ class Kicker extends BodyComponent with InitialPosition {
required BoardSide side,
}) : _side = side;
// ignore: public_member_api_docs
final KickerCubit bloc;
@override
@ -172,7 +171,6 @@ class _KickerSpriteGroupComponent extends SpriteGroupComponent<KickerState>
@override
Future<void> onLoad() async {
await super.onLoad();
// ignore: public_member_api_docs
parent.bloc.stream.listen((state) => current = state);
final sprites = {

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';

@ -1,8 +1,7 @@
// ignore_for_file: avoid_renaming_method_parameters, public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/layer_sensor/behaviors/layer_filtering_behavior.dart';
import 'package:pinball_flame/pinball_flame.dart';
/// {@template layer_entrance_orientation}
/// Determines if a layer entrance is oriented [up] or [down] on the board.

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

@ -1,8 +1,5 @@
// ignore_for_file: comment_references, public_member_api_docs
part of 'multiball_cubit.dart';
/// Indicates the different sprite states for [MultiballSpriteGroupComponent].
enum MultiballLightState {
lit,
dimmed,

@ -80,7 +80,6 @@ class Multiball extends Component {
required this.bloc,
});
// ignore: public_member_api_docs
final MultiballCubit bloc;
@override

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:pinball_components/pinball_components.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'multiplier_cubit.dart';
enum MultiplierSpriteState {

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame/components.dart';
import 'package:flutter/material.dart';
import 'package:pinball_components/gen/assets.gen.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'dart:async';
import 'package:flame/components.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:geometry/geometry.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame/extensions.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:geometry/geometry.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame/extensions.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:geometry/geometry.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'signpost_state.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'signpost_cubit.dart';
enum SignpostState {

@ -41,7 +41,6 @@ class Signpost extends BodyComponent with InitialPosition {
required this.bloc,
});
// ignore: public_member_api_docs
final SignpostCubit bloc;
@override

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'skill_shot_cubit.dart';
enum SkillShotSpriteState {

@ -43,7 +43,6 @@ class SkillShot extends BodyComponent with ZIndex {
required this.bloc,
});
// ignore: public_member_api_docs
final SkillShotCubit bloc;
@override

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'spaceship_ramp_cubit.dart';
class SpaceshipRampState extends Equatable {

@ -32,12 +32,6 @@ class SpaceshipRamp extends Component {
RampBallAscendingContactBehavior(),
],
)..initialPosition = Vector2(1.7, -20.4),
_SpaceshipRampOpening(
outsidePriority: ZIndexes.ballOnBoard,
rotation: math.pi,
)
..initialPosition = Vector2(1.7, -19.8)
..layer = Layer.opening,
_SpaceshipRampOpening(
outsideLayer: Layer.spaceship,
outsidePriority: ZIndexes.ballOnSpaceship,
@ -46,10 +40,9 @@ class SpaceshipRamp extends Component {
..initialPosition = Vector2(-13.7, -18.6)
..layer = Layer.spaceshipEntranceRamp,
_SpaceshipRampBackground(),
_SpaceshipRampBoardOpeningSpriteComponent()
..position = Vector2(3.4, -39.5),
_SpaceshipRampBoardOpening()..initialPosition = Vector2(3.4, -39.5),
_SpaceshipRampForegroundRailing(),
_SpaceshipRampBase()..initialPosition = Vector2(1.7, -20),
_SpaceshipRampBase()..initialPosition = Vector2(3.4, -42.5),
_SpaceshipRampBackgroundRailingSpriteComponent(),
SpaceshipRampArrowSpriteComponent(
current: bloc.state.hits,
@ -66,7 +59,6 @@ class SpaceshipRamp extends Component {
required this.bloc,
}) : super();
// ignore: public_member_api_docs
final SpaceshipRampCubit bloc;
@override
@ -254,12 +246,103 @@ extension on SpaceshipRampArrowSpriteState {
}
}
class _SpaceshipRampBoardOpeningSpriteComponent extends SpriteComponent
with HasGameRef, ZIndex {
_SpaceshipRampBoardOpeningSpriteComponent() : super(anchor: Anchor.center) {
class _SpaceshipRampBoardOpening extends BodyComponent
with Layered, ZIndex, InitialPosition {
_SpaceshipRampBoardOpening()
: super(
renderBody: false,
children: [
_SpaceshipRampBoardOpeningSpriteComponent(),
LayerContactBehavior(layer: Layer.spaceshipEntranceRamp)
..applyTo(['inside']),
LayerContactBehavior(layer: Layer.board)..applyTo(['outside']),
ZIndexContactBehavior(zIndex: ZIndexes.ballOnBoard)
..applyTo(['outside']),
ZIndexContactBehavior(zIndex: ZIndexes.ballOnSpaceshipRamp)
..applyTo(['middle', 'inside']),
],
) {
zIndex = ZIndexes.spaceshipRampBoardOpening;
layer = Layer.opening;
}
List<FixtureDef> _createFixtureDefs() {
final topEdge = EdgeShape()
..set(
Vector2(-3.4, -1.2),
Vector2(3.4, -1.6),
);
final bottomEdge = EdgeShape()
..set(
Vector2(-6.2, 1.5),
Vector2(6.2, 1.5),
);
final middleCurve = BezierCurveShape(
controlPoints: [
topEdge.vertex1,
Vector2(0, 2.3),
Vector2(7.5, 2.3),
topEdge.vertex2,
],
);
final leftCurve = BezierCurveShape(
controlPoints: [
Vector2(-4.4, -1.2),
Vector2(-4.65, 0),
bottomEdge.vertex1,
],
);
final rightCurve = BezierCurveShape(
controlPoints: [
Vector2(4.4, -1.6),
Vector2(4.65, 0),
bottomEdge.vertex2,
],
);
const outsideKey = 'outside';
return [
FixtureDef(
topEdge,
isSensor: true,
userData: 'inside',
),
FixtureDef(
bottomEdge,
isSensor: true,
userData: outsideKey,
),
FixtureDef(
middleCurve,
isSensor: true,
userData: 'middle',
),
FixtureDef(
leftCurve,
isSensor: true,
userData: outsideKey,
),
FixtureDef(
rightCurve,
isSensor: true,
userData: outsideKey,
),
];
}
@override
Body createBody() {
final bodyDef = BodyDef(position: initialPosition);
final body = world.createBody(bodyDef);
_createFixtureDefs().forEach(body.createFixture);
return body;
}
}
class _SpaceshipRampBoardOpeningSpriteComponent extends SpriteComponent
with HasGameRef {
_SpaceshipRampBoardOpeningSpriteComponent() : super(anchor: Anchor.center);
@override
Future<void> onLoad() async {
await super.onLoad();
@ -343,28 +426,23 @@ class _SpaceshipRampForegroundRailingSpriteComponent extends SpriteComponent
}
}
class _SpaceshipRampBase extends BodyComponent with InitialPosition, Layered {
class _SpaceshipRampBase extends BodyComponent with Layered, InitialPosition {
_SpaceshipRampBase() : super(renderBody: false) {
layer = Layer.board;
}
@override
Body createBody() {
const baseWidth = 9;
final baseShape = BezierCurveShape(
final shape = BezierCurveShape(
controlPoints: [
Vector2(initialPosition.x - baseWidth / 2, initialPosition.y),
Vector2(initialPosition.x - baseWidth / 2, initialPosition.y) +
Vector2(2, -5),
Vector2(initialPosition.x + baseWidth / 2, initialPosition.y) +
Vector2(-2, -5),
Vector2(initialPosition.x + baseWidth / 2, initialPosition.y)
Vector2(-4.25, 1.75),
Vector2(-2, -2.1),
Vector2(2, -2.3),
Vector2(4.1, 1.5),
],
);
final fixtureDef = FixtureDef(baseShape);
final bodyDef = BodyDef(position: initialPosition);
return world.createBody(bodyDef)..createFixture(fixtureDef);
return world.createBody(bodyDef)..createFixtureFromShape(shape);
}
}
@ -420,7 +498,6 @@ class RampScoringSensor extends BodyComponent
}
/// Creates a [RampScoringSensor] without any children.
///
@visibleForTesting
RampScoringSensor.test();

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'sparky_bumper_state.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'sparky_bumper_cubit.dart';
enum SparkyBumperState {

@ -102,7 +102,6 @@ class SparkyBumper extends BodyComponent with InitialPosition, ZIndex {
final double _majorRadius;
final double _minorRadius;
// ignore: public_member_api_docs
final SparkyBumperCubit bloc;
@override
@ -148,7 +147,6 @@ class _SparkyBumperSpriteGroupComponent
@override
Future<void> onLoad() async {
await super.onLoad();
// ignore: public_member_api_docs
parent.bloc.stream.listen((state) => current = state);
final sprites = {

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'sparky_computer_state.dart';

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
part of 'sparky_computer_cubit.dart';
enum SparkyComputerState {

@ -37,7 +37,6 @@ class SparkyComputer extends BodyComponent {
Iterable<Component>? children,
}) : super(children: children);
// ignore: public_member_api_docs
final SparkyComputerCubit bloc;
@override

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
/// Z-Indexes for the component rendering order in the pinball game.
abstract class ZIndexes {
static const _base = 0;

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:flame/input.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class AndroidSpaceshipGame extends BallGame {

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:flame/input.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class SpaceshipRailGame extends BallGame {

@ -4,6 +4,7 @@ import 'package:flame/input.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class SpaceshipRampGame extends BallGame with KeyboardEvents {
@ -33,6 +34,9 @@ class SpaceshipRampGame extends BallGame with KeyboardEvents {
- Press space to progress arrow sprites.
''';
@override
Color backgroundColor() => Colors.white;
late final SpaceshipRamp _spaceshipRamp;
@override

@ -1,5 +1,6 @@
import 'package:flame/input.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import 'package:pinball_theme/pinball_theme.dart' as theme;
import 'package:sandbox/common/common.dart';

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:flame/input.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class LaunchRampGame extends BallGame {

@ -2,6 +2,7 @@ import 'package:flame/input.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class LayerGame extends BallGame with TapDetector {

@ -44,7 +44,6 @@ void main() {
expect(game.contains(androidBumper), isTrue);
});
// ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async {
final bloc = _MockAndroidBumperCubit();
whenListen(

@ -70,7 +70,6 @@ void main() {
},
);
// ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async {
final bloc = _MockAndroidSpaceshipCubit();
whenListen(

@ -5,6 +5,7 @@ import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import 'package:pinball_theme/pinball_theme.dart' as theme;
import '../../../helpers/helpers.dart';

@ -71,7 +71,6 @@ void main() {
},
);
// ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async {
final bloc = _MockChromeDinoCubit();
whenListen(

@ -102,7 +102,6 @@ void main() {
expect(() => GoogleLetter(6), throwsA(isA<RangeError>()));
});
// ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async {
final bloc = _MockGoogleLetterCubit();
whenListen(

@ -61,7 +61,6 @@ void main() {
},
);
// ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async {
final bloc = _MockKickerCubit();
whenListen(

@ -6,6 +6,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/layer_sensor/behaviors/behaviors.dart';
import 'package:pinball_flame/pinball_flame.dart';
import '../../../../helpers/helpers.dart';

@ -4,6 +4,7 @@ import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/layer_sensor/behaviors/behaviors.dart';
import 'package:pinball_flame/pinball_flame.dart';
import '../../../helpers/helpers.dart';

@ -29,7 +29,6 @@ void main() {
expect(game.contains(skillShot), isTrue);
});
// ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async {
final bloc = _MockSkillShotCubit();
whenListen(

@ -44,7 +44,6 @@ void main() {
expect(game.contains(sparkyBumper), isTrue);
});
// ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async {
final bloc = _MockSparkyBumperCubit();
whenListen(

@ -47,7 +47,6 @@ void main() {
},
);
// ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async {
final bloc = _MockSparkyComputerCubit();
whenListen(

@ -1,10 +1,11 @@
library pinball_flame;
export 'src/behaviors/behaviors.dart';
export 'src/canvas/canvas.dart';
export 'src/component_controller.dart';
export 'src/contact_behavior.dart';
export 'src/flame_provider.dart';
export 'src/keyboard_input_controller.dart';
export 'src/layer.dart';
export 'src/parent_is_a.dart';
export 'src/pinball_forge2d_game.dart';
export 'src/sprite_animation.dart';

@ -0,0 +1,3 @@
export 'contact_behavior.dart';
export 'layer_contact_behavior.dart';
export 'z_index_contact_behavior.dart';

@ -0,0 +1,20 @@
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_flame/pinball_flame.dart';
/// {@template layer_contact_behavior}
/// Switches the [Layer] of any [Layered] body that contacts with it.
/// {@endtemplate}
class LayerContactBehavior extends ContactBehavior<BodyComponent> {
/// {@macro layer_contact_behavior}
LayerContactBehavior({required Layer layer}) : _layer = layer;
final Layer _layer;
@override
void beginContact(Object other, Contact contact) {
super.beginContact(other, contact);
if (other is! Layered) return;
if (other.layer == _layer) return;
other.layer = _layer;
}
}

@ -0,0 +1,20 @@
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_flame/pinball_flame.dart';
/// {@template layer_contact_behavior}
/// Switches the z-index of any [ZIndex] body that contacts with it.
/// {@endtemplate}
class ZIndexContactBehavior extends ContactBehavior<BodyComponent> {
/// {@macro layer_contact_behavior}
ZIndexContactBehavior({required int zIndex}) : _zIndex = zIndex;
final int _zIndex;
@override
void beginContact(Object other, Contact contact) {
super.beginContact(other, contact);
if (other is! ZIndex) return;
if (other.zIndex == _zIndex) return;
other.zIndex = _zIndex;
}
}

@ -1,9 +1,11 @@
// ignore_for_file: public_member_api_docs
import 'dart:typed_data';
import 'dart:ui';
/// {@template canvas_wrapper}
/// Custom [Canvas] implementation for Pinball
/// {@endtemplate}
class CanvasWrapper implements Canvas {
/// [Canvas] used for painting operations
late Canvas canvas;
@override

@ -1,21 +1,28 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.dart';
/// {@template flame_provider}
/// Provider-style component, similar to Provider in Flutter, but used to
/// retrieve [Component] objects previously provided
/// {@endtemplate}
class FlameProvider<T> extends Component {
//// {@macro flame_provider}
FlameProvider.value(
this.provider, {
Iterable<Component>? children,
}) : super(
children: children,
);
}) : super(children: children);
/// The object that needs to be provided
final T provider;
}
//// {@template multi_flame_provider}
/// MultiProvider-style component, similar to MultiProvider in Flutter,
/// but used to retrieve more than one [Component] object previously provided
/// {@endtemplate}
class MultiFlameProvider extends Component {
/// {@macro multi_flame_provider}
MultiFlameProvider({
required List<FlameProvider<dynamic>> providers,
Iterable<Component>? children,
@ -54,7 +61,9 @@ class MultiFlameProvider extends Component {
}
}
/// Extended API on [Component]
extension ReadFlameProvider on Component {
/// Retrieve an object of type [T] that was previously provided
T readProvider<T>() {
final providers = ancestors().whereType<FlameProvider<T>>();
assert(
@ -64,9 +73,8 @@ extension ReadFlameProvider on Component {
return providers.first.provider;
}
}
extension ReadFlameBlocProvider on Component {
/// Retrieve a bloc [B] with state [S] previously provided
B readBloc<B extends BlocBase<S>, S>() {
final providers = ancestors().whereType<FlameBlocProvider<B, S>>();
assert(

@ -1,5 +1,3 @@
// ignore_for_file: public_member_api_docs
import 'dart:math';
import 'package:flame/components.dart';
@ -20,6 +18,7 @@ class SpriteAnimationWidget extends StatelessWidget {
/// The positioning [Anchor].
final Anchor anchor;
/// Controller in charge of the sprite animations
final SpriteAnimationController controller;
@override
@ -38,7 +37,11 @@ class SpriteAnimationWidget extends StatelessWidget {
}
}
/// {@template sprite_animation_controller}
/// Custom [AnimationController] that manages sprite assets
/// {@endtemplate}
class SpriteAnimationController extends AnimationController {
/// {@macro sprite_animation_controller}
SpriteAnimationController({
required TickerProvider vsync,
required this.animation,
@ -46,6 +49,7 @@ class SpriteAnimationController extends AnimationController {
duration = Duration(seconds: animation.totalDuration().ceil());
}
/// [SpriteAnimation] associated to this controller
final SpriteAnimation animation;
double? _lastUpdated;
@ -61,7 +65,11 @@ class SpriteAnimationController extends AnimationController {
}
}
/// {@template sprite_painter}
/// [CustomPainter] specialized in [Sprite] assets.
/// {@endtemplate}
class SpritePainter extends CustomPainter {
/// {@macro sprite_painter}
SpritePainter(
this._sprite,
this._anchor, {

@ -4,9 +4,9 @@ import 'dart:math' as math;
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
class TestLayeredBodyComponent extends BodyComponent with Layered {
class _TestLayeredBodyComponent extends BodyComponent with Layered {
@override
Body createBody() {
final fixtureDef = FixtureDef(CircleShape());
@ -14,7 +14,7 @@ class TestLayeredBodyComponent extends BodyComponent with Layered {
}
}
class TestBodyComponent extends BodyComponent {
class _TestBodyComponent extends BodyComponent {
@override
Body createBody() {
final fixtureDef = FixtureDef(CircleShape());
@ -41,12 +41,12 @@ void main() {
}
flameTester.test('TestBodyComponent has fixtures', (game) async {
final component = TestBodyComponent();
final component = _TestBodyComponent();
await game.ensureAdd(component);
});
test('correctly sets and gets', () {
final component = TestLayeredBodyComponent()
final component = _TestLayeredBodyComponent()
..layer = Layer.spaceshipEntranceRamp;
expect(component.layer, Layer.spaceshipEntranceRamp);
});
@ -55,7 +55,7 @@ void main() {
'layers correctly before being loaded',
(game) async {
const expectedLayer = Layer.spaceshipEntranceRamp;
final component = TestLayeredBodyComponent()..layer = expectedLayer;
final component = _TestLayeredBodyComponent()..layer = expectedLayer;
await game.ensureAdd(component);
_expectLayerOnFixtures(
@ -70,7 +70,7 @@ void main() {
'when multiple different sets',
(game) async {
const expectedLayer = Layer.launcher;
final component = TestLayeredBodyComponent()
final component = _TestLayeredBodyComponent()
..layer = Layer.spaceshipEntranceRamp;
expect(component.layer, isNot(equals(expectedLayer)));
@ -89,7 +89,7 @@ void main() {
'layers correctly after being loaded',
(game) async {
const expectedLayer = Layer.spaceshipEntranceRamp;
final component = TestLayeredBodyComponent();
final component = _TestLayeredBodyComponent();
await game.ensureAdd(component);
component.layer = expectedLayer;
_expectLayerOnFixtures(
@ -104,7 +104,7 @@ void main() {
'when multiple different sets',
(game) async {
const expectedLayer = Layer.launcher;
final component = TestLayeredBodyComponent();
final component = _TestLayeredBodyComponent();
await game.ensureAdd(component);
component.layer = Layer.spaceshipEntranceRamp;
@ -122,7 +122,7 @@ void main() {
'defaults to Layer.all '
'when no layer is given',
(game) async {
final component = TestLayeredBodyComponent();
final component = _TestLayeredBodyComponent();
await game.ensureAdd(component);
expect(component.layer, equals(Layer.all));
},
@ -134,15 +134,18 @@ void main() {
const parentLayer = Layer.spaceshipEntranceRamp;
const childLayer = Layer.board;
final component = TestLayeredBodyComponent()..layer = parentLayer;
final childComponent = TestLayeredBodyComponent()..layer = childLayer;
final component = _TestLayeredBodyComponent()..layer = parentLayer;
final childComponent = _TestLayeredBodyComponent()..layer = childLayer;
await component.add(childComponent);
await game.ensureAdd(component);
expect(childLayer, isNot(equals(parentLayer)));
for (final child in component.children) {
expect((child as TestLayeredBodyComponent).layer, equals(childLayer));
expect(
(child as _TestLayeredBodyComponent).layer,
equals(childLayer),
);
}
},
);
@ -152,15 +155,15 @@ void main() {
(game) async {
const parentLayer = Layer.spaceshipEntranceRamp;
final component = TestLayeredBodyComponent()..layer = parentLayer;
final childComponent = TestBodyComponent();
final component = _TestLayeredBodyComponent()..layer = parentLayer;
final childComponent = _TestBodyComponent();
await component.add(childComponent);
await game.ensureAdd(component);
for (final child in component.children) {
expect(
(child as TestBodyComponent)
(child as _TestBodyComponent)
.body
.fixtures
.first

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save