chore: update project to the latest flame and forge2d (#41)

pull/44/head
Erick 4 years ago committed by GitHub
parent 03d48eac40
commit 1539ab7bd3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -6,16 +6,18 @@ import 'package:pinball/game/game.dart';
/// A solid, [BodyType.dynamic] sphere that rolls and bounces along the /// A solid, [BodyType.dynamic] sphere that rolls and bounces along the
/// [PinballGame]. /// [PinballGame].
/// {@endtemplate} /// {@endtemplate}
class Ball extends PositionBodyComponent<PinballGame, SpriteComponent> { class Ball extends BodyComponent<PinballGame> {
/// {@macro ball} /// {@macro ball}
Ball({ Ball({
required Vector2 position, required Vector2 position,
}) : _position = position, }) : _position = position;
super(size: Vector2.all(2));
/// The initial position of the [Ball] body. /// The initial position of the [Ball] body.
final Vector2 _position; final Vector2 _position;
/// The size of the [Ball]
final Vector2 size = Vector2.all(2);
/// Asset location of the sprite that renders with the [Ball]. /// Asset location of the sprite that renders with the [Ball].
/// ///
/// Sprite is preloaded by [PinballGameAssetsX]. /// Sprite is preloaded by [PinballGameAssetsX].
@ -26,7 +28,13 @@ class Ball extends PositionBodyComponent<PinballGame, SpriteComponent> {
await super.onLoad(); await super.onLoad();
final sprite = await gameRef.loadSprite(spritePath); final sprite = await gameRef.loadSprite(spritePath);
final tint = gameRef.theme.characterTheme.ballColor.withOpacity(0.5); final tint = gameRef.theme.characterTheme.ballColor.withOpacity(0.5);
positionComponent = SpriteComponent(sprite: sprite, size: size)..tint(tint); await add(
SpriteComponent(
sprite: sprite,
size: size,
anchor: Anchor.center,
)..tint(tint),
);
} }
@override @override

@ -1,9 +1,9 @@
export 'anchor.dart';
export 'ball.dart'; export 'ball.dart';
export 'baseboard.dart'; export 'baseboard.dart';
export 'board_side.dart'; export 'board_side.dart';
export 'bonus_word.dart'; export 'bonus_word.dart';
export 'flipper.dart'; export 'flipper.dart';
export 'joint_anchor.dart';
export 'pathway.dart'; export 'pathway.dart';
export 'plunger.dart'; export 'plunger.dart';
export 'score_points.dart'; export 'score_points.dart';

@ -1,25 +1,29 @@
import 'dart:async'; import 'dart:async';
import 'dart:math' as math; import 'dart:math' as math;
import 'package:flame/components.dart' show PositionComponent, SpriteComponent; import 'package:flame/components.dart';
import 'package:flame/input.dart'; import 'package:flame/input.dart';
import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
/// {@template flipper_group} /// {@template flipper_group}
/// Loads a [Flipper.right] and a [Flipper.left]. /// Loads a [Flipper.right] and a [Flipper.left].
/// {@endtemplate} /// {@endtemplate}
class FlipperGroup extends PositionComponent { class FlipperGroup extends Component {
/// {@macro flipper_group} /// {@macro flipper_group}
FlipperGroup({ FlipperGroup({
required Vector2 position, required this.position,
required this.spacing, required this.spacing,
}) : super(position: position); });
/// The amount of space between the [Flipper.right] and [Flipper.left]. /// The amount of space between the [Flipper.right] and [Flipper.left].
final double spacing; final double spacing;
/// The position of this [FlipperGroup]
final Vector2 position;
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
final leftFlipper = Flipper.left( final leftFlipper = Flipper.left(
@ -45,15 +49,14 @@ class FlipperGroup extends PositionComponent {
/// ///
/// [Flipper] can be controlled by the player in an arc motion. /// [Flipper] can be controlled by the player in an arc motion.
/// {@endtemplate flipper} /// {@endtemplate flipper}
class Flipper extends PositionBodyComponent with KeyboardHandler { class Flipper extends BodyComponent with KeyboardHandler {
/// {@macro flipper} /// {@macro flipper}
Flipper._({ Flipper._({
required Vector2 position, required Vector2 position,
required this.side, required this.side,
required List<LogicalKeyboardKey> keys, required List<LogicalKeyboardKey> keys,
}) : _position = position, }) : _position = position,
_keys = keys, _keys = keys;
super(size: Vector2(width, height));
/// A left positioned [Flipper]. /// A left positioned [Flipper].
Flipper.left({ Flipper.left({
@ -124,14 +127,17 @@ class Flipper extends PositionBodyComponent with KeyboardHandler {
/// Loads the sprite that renders with the [Flipper]. /// Loads the sprite that renders with the [Flipper].
Future<void> _loadSprite() async { Future<void> _loadSprite() async {
final sprite = await gameRef.loadSprite(spritePath); final sprite = await gameRef.loadSprite(spritePath);
positionComponent = SpriteComponent( final spriteComponent = SpriteComponent(
sprite: sprite, sprite: sprite,
size: size, size: Vector2(width, height),
anchor: Anchor.center,
); );
if (side.isRight) { if (side.isRight) {
positionComponent!.flipHorizontally(); spriteComponent.flipHorizontally();
} }
await add(spriteComponent);
} }
/// Anchors the [Flipper] to the [RevoluteJoint] that controls its arc motion. /// Anchors the [Flipper] to the [RevoluteJoint] that controls its arc motion.
@ -160,11 +166,11 @@ class Flipper extends PositionBodyComponent with KeyboardHandler {
final fixtures = <FixtureDef>[]; final fixtures = <FixtureDef>[];
final isLeft = side.isLeft; final isLeft = side.isLeft;
final bigCircleShape = CircleShape()..radius = size.y / 2; final bigCircleShape = CircleShape()..radius = height / 2;
bigCircleShape.position.setValues( bigCircleShape.position.setValues(
isLeft isLeft
? -(size.x / 2) + bigCircleShape.radius ? -(width / 2) + bigCircleShape.radius
: (size.x / 2) - bigCircleShape.radius, : (width / 2) - bigCircleShape.radius,
0, 0,
); );
final bigCircleFixtureDef = FixtureDef(bigCircleShape); final bigCircleFixtureDef = FixtureDef(bigCircleShape);
@ -173,8 +179,8 @@ class Flipper extends PositionBodyComponent with KeyboardHandler {
final smallCircleShape = CircleShape()..radius = bigCircleShape.radius / 2; final smallCircleShape = CircleShape()..radius = bigCircleShape.radius / 2;
smallCircleShape.position.setValues( smallCircleShape.position.setValues(
isLeft isLeft
? (size.x / 2) - smallCircleShape.radius ? (width / 2) - smallCircleShape.radius
: -(size.x / 2) + smallCircleShape.radius, : -(width / 2) + smallCircleShape.radius,
0, 0,
); );
final smallCircleFixtureDef = FixtureDef(smallCircleShape); final smallCircleFixtureDef = FixtureDef(smallCircleShape);
@ -205,6 +211,7 @@ class Flipper extends PositionBodyComponent with KeyboardHandler {
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
paint = Paint()..color = Colors.transparent;
await Future.wait([ await Future.wait([
_loadSprite(), _loadSprite(),
_anchorToJoint(), _anchorToJoint(),
@ -249,15 +256,15 @@ class Flipper extends PositionBodyComponent with KeyboardHandler {
/// ///
/// The end of a [Flipper] depends on its [Flipper.side]. /// The end of a [Flipper] depends on its [Flipper.side].
/// {@endtemplate} /// {@endtemplate}
class FlipperAnchor extends Anchor { class FlipperAnchor extends JointAnchor {
/// {@macro flipper_anchor} /// {@macro flipper_anchor}
FlipperAnchor({ FlipperAnchor({
required Flipper flipper, required Flipper flipper,
}) : super( }) : super(
position: Vector2( position: Vector2(
flipper.side.isLeft flipper.side.isLeft
? flipper.body.position.x - flipper.size.x / 2 ? flipper.body.position.x - Flipper.width / 2
: flipper.body.position.x + flipper.size.x / 2, : flipper.body.position.x + Flipper.width / 2,
flipper.body.position.y, flipper.body.position.y,
), ),
); );

@ -1,6 +1,6 @@
import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_forge2d/flame_forge2d.dart';
/// {@template anchor} /// {@template joint_anchor}
/// Non visual [BodyComponent] used to hold a [BodyType.dynamic] in [Joint]s /// Non visual [BodyComponent] used to hold a [BodyType.dynamic] in [Joint]s
/// with this [BodyType.static]. /// with this [BodyType.static].
/// ///
@ -15,9 +15,9 @@ import 'package:flame_forge2d/flame_forge2d.dart';
/// ); /// );
/// ``` /// ```
/// {@endtemplate} /// {@endtemplate}
class Anchor extends BodyComponent { class JointAnchor extends BodyComponent {
/// {@macro anchor} /// {@macro joint_anchor}
Anchor({ JointAnchor({
required Vector2 position, required Vector2 position,
}) : _position = position; }) : _position = position;

@ -1,7 +1,7 @@
import 'package:flame/input.dart'; import 'package:flame/input.dart';
import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:pinball/game/game.dart' show Anchor; import 'package:pinball/game/game.dart';
/// {@template plunger} /// {@template plunger}
/// [Plunger] serves as a spring, that shoots the ball on the right side of the /// [Plunger] serves as a spring, that shoots the ball on the right side of the
@ -77,9 +77,9 @@ class Plunger extends BodyComponent with KeyboardHandler {
} }
/// {@template plunger_anchor} /// {@template plunger_anchor}
/// [Anchor] positioned below a [Plunger]. /// [JointAnchor] positioned below a [Plunger].
/// {@endtemplate} /// {@endtemplate}
class PlungerAnchor extends Anchor { class PlungerAnchor extends JointAnchor {
/// {@macro plunger_anchor} /// {@macro plunger_anchor}
PlungerAnchor({ PlungerAnchor({
required Plunger plunger, required Plunger plunger,
@ -92,11 +92,11 @@ class PlungerAnchor extends Anchor {
} }
/// {@template plunger_anchor_prismatic_joint_def} /// {@template plunger_anchor_prismatic_joint_def}
/// [PrismaticJointDef] between a [Plunger] and an [Anchor] with motion on /// [PrismaticJointDef] between a [Plunger] and an [JointAnchor] with motion on
/// the vertical axis. /// the vertical axis.
/// ///
/// The [Plunger] is constrained vertically between its starting position and /// The [Plunger] is constrained vertically between its starting position and
/// the [Anchor]. The [Anchor] must be below the [Plunger]. /// the [JointAnchor]. The [JointAnchor] must be below the [Plunger].
/// {@endtemplate} /// {@endtemplate}
class PlungerAnchorPrismaticJointDef extends PrismaticJointDef { class PlungerAnchorPrismaticJointDef extends PrismaticJointDef {
/// {@macro plunger_anchor_prismatic_joint_def} /// {@macro plunger_anchor_prismatic_joint_def}

@ -7,14 +7,14 @@ packages:
name: _fe_analyzer_shared name: _fe_analyzer_shared
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "30.0.0" version: "31.0.0"
analyzer: analyzer:
dependency: transitive dependency: transitive
description: description:
name: analyzer name: analyzer
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.7.0" version: "2.8.0"
args: args:
dependency: transitive dependency: transitive
description: description:
@ -35,14 +35,14 @@ packages:
name: bloc name: bloc
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "8.0.2" version: "8.0.3"
bloc_test: bloc_test:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: bloc_test name: bloc_test
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "9.0.2" version: "9.0.3"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@ -140,21 +140,21 @@ packages:
name: flame name: flame
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0-releasecandidate.4" version: "1.1.0-releasecandidate.5"
flame_bloc: flame_bloc:
dependency: "direct main" dependency: "direct main"
description: description:
name: flame_bloc name: flame_bloc
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0-releasecandidate.4" version: "1.2.0-releasecandidate.5"
flame_forge2d: flame_forge2d:
dependency: "direct main" dependency: "direct main"
description: description:
name: flame_forge2d name: flame_forge2d
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.9.0-releasecandidate.4" version: "0.9.0-releasecandidate.5"
flame_test: flame_test:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -190,7 +190,7 @@ packages:
name: forge2d name: forge2d
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.8.1" version: "0.8.2"
frontend_server_client: frontend_server_client:
dependency: transitive dependency: transitive
description: description:
@ -218,7 +218,7 @@ packages:
name: http_multi_server name: http_multi_server
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.1" version: "3.2.0"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
@ -246,7 +246,7 @@ packages:
name: js name: js
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.3" version: "0.6.4"
logging: logging:
dependency: transitive dependency: transitive
description: description:
@ -351,14 +351,14 @@ packages:
name: provider name: provider
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.1" version: "6.0.2"
pub_semver: pub_semver:
dependency: transitive dependency: transitive
description: description:
name: pub_semver name: pub_semver
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
shelf: shelf:
dependency: transitive dependency: transitive
description: description:
@ -489,7 +489,7 @@ packages:
name: vm_service name: vm_service
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "7.3.0" version: "7.5.0"
watcher: watcher:
dependency: transitive dependency: transitive
description: description:

@ -9,9 +9,9 @@ environment:
dependencies: dependencies:
bloc: ^8.0.2 bloc: ^8.0.2
equatable: ^2.0.3 equatable: ^2.0.3
flame: ^1.1.0-releasecandidate.4 flame: ^1.1.0-releasecandidate.5
flame_bloc: ^1.2.0-releasecandidate.4 flame_bloc: ^1.2.0-releasecandidate.5
flame_forge2d: ^0.9.0-releasecandidate.4 flame_forge2d: ^0.9.0-releasecandidate.5
flutter: flutter:
sdk: flutter sdk: flutter
flutter_bloc: ^8.0.1 flutter_bloc: ^8.0.1

@ -103,9 +103,7 @@ void main() {
) as Flipper; ) as Flipper;
expect( expect(
leftFlipper.body.position.x + leftFlipper.body.position.x + Flipper.width + flipperGroup.spacing,
leftFlipper.size.x +
flipperGroup.spacing,
equals(rightFlipper.body.position.x), equals(rightFlipper.body.position.x),
); );
}, },

@ -10,13 +10,13 @@ import '../../helpers/helpers.dart';
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
group('Anchor', () { group('JointAnchor', () {
final flameTester = FlameTester(PinballGameTest.create); final flameTester = FlameTester(PinballGameTest.create);
flameTester.test( flameTester.test(
'loads correctly', 'loads correctly',
(game) async { (game) async {
final anchor = Anchor(position: Vector2.zero()); final anchor = JointAnchor(position: Vector2.zero());
await game.ready(); await game.ready();
await game.ensureAdd(anchor); await game.ensureAdd(anchor);
@ -30,7 +30,7 @@ void main() {
(game) async { (game) async {
await game.ready(); await game.ready();
final position = Vector2.all(10); final position = Vector2.all(10);
final anchor = Anchor(position: position); final anchor = JointAnchor(position: position);
await game.ensureAdd(anchor); await game.ensureAdd(anchor);
game.contains(anchor); game.contains(anchor);
@ -42,7 +42,7 @@ void main() {
'is static', 'is static',
(game) async { (game) async {
await game.ready(); await game.ready();
final anchor = Anchor(position: Vector2.zero()); final anchor = JointAnchor(position: Vector2.zero());
await game.ensureAdd(anchor); await game.ensureAdd(anchor);
expect(anchor.body.bodyType, equals(BodyType.static)); expect(anchor.body.bodyType, equals(BodyType.static));
@ -54,7 +54,7 @@ void main() {
flameTester.test( flameTester.test(
'has none', 'has none',
(game) async { (game) async {
final anchor = Anchor(position: Vector2.zero()); final anchor = JointAnchor(position: Vector2.zero());
await game.ensureAdd(anchor); await game.ensureAdd(anchor);
expect(anchor.body.fixtures, isEmpty); expect(anchor.body.fixtures, isEmpty);
Loading…
Cancel
Save