From 9e1b1aa87c19c6fc57e4212ec61e97bf33cf2338 Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Thu, 17 Mar 2022 11:45:43 +0100 Subject: [PATCH] refactor: create fixtures for pathways and opening improved --- lib/game/components/baseboard.dart | 10 ++++---- lib/game/components/flipper.dart | 10 ++++---- lib/game/components/jetpack_ramp.dart | 26 ++++++++++++-------- lib/game/components/launcher_ramp.dart | 34 ++++++++++++++++---------- lib/game/components/layer.dart | 4 +-- lib/game/components/pathway.dart | 34 ++++++++++++-------------- lib/game/components/sling_shot.dart | 8 +++--- 7 files changed, 68 insertions(+), 58 deletions(-) diff --git a/lib/game/components/baseboard.dart b/lib/game/components/baseboard.dart index 62c9210c..48d38497 100644 --- a/lib/game/components/baseboard.dart +++ b/lib/game/components/baseboard.dart @@ -22,7 +22,7 @@ class Baseboard extends BodyComponent with InitialPosition { final BoardSide _side; List _createFixtureDefs() { - final fixtures = []; + final fixturesDef = []; final circleShape1 = CircleShape()..radius = Baseboard.height / 2; circleShape1.position.setValues( @@ -30,7 +30,7 @@ class Baseboard extends BodyComponent with InitialPosition { 0, ); final circle1FixtureDef = FixtureDef(circleShape1); - fixtures.add(circle1FixtureDef); + fixturesDef.add(circle1FixtureDef); final circleShape2 = CircleShape()..radius = Baseboard.height / 2; circleShape2.position.setValues( @@ -38,7 +38,7 @@ class Baseboard extends BodyComponent with InitialPosition { 0, ); final circle2FixtureDef = FixtureDef(circleShape2); - fixtures.add(circle2FixtureDef); + fixturesDef.add(circle2FixtureDef); final rectangle = PolygonShape() ..setAsBoxXY( @@ -46,9 +46,9 @@ class Baseboard extends BodyComponent with InitialPosition { Baseboard.height / 2, ); final rectangleFixtureDef = FixtureDef(rectangle); - fixtures.add(rectangleFixtureDef); + fixturesDef.add(rectangleFixtureDef); - return fixtures; + return fixturesDef; } @override diff --git a/lib/game/components/flipper.dart b/lib/game/components/flipper.dart index 8b029b1e..c0036907 100644 --- a/lib/game/components/flipper.dart +++ b/lib/game/components/flipper.dart @@ -131,7 +131,7 @@ class Flipper extends BodyComponent with KeyboardHandler, InitialPosition { } List _createFixtureDefs() { - final fixtures = []; + final fixturesDef = []; final isLeft = side.isLeft; final bigCircleShape = CircleShape()..radius = height / 2; @@ -142,7 +142,7 @@ class Flipper extends BodyComponent with KeyboardHandler, InitialPosition { 0, ); final bigCircleFixtureDef = FixtureDef(bigCircleShape); - fixtures.add(bigCircleFixtureDef); + fixturesDef.add(bigCircleFixtureDef); final smallCircleShape = CircleShape()..radius = bigCircleShape.radius / 2; smallCircleShape.position.setValues( @@ -152,7 +152,7 @@ class Flipper extends BodyComponent with KeyboardHandler, InitialPosition { 0, ); final smallCircleFixtureDef = FixtureDef(smallCircleShape); - fixtures.add(smallCircleFixtureDef); + fixturesDef.add(smallCircleFixtureDef); final trapeziumVertices = isLeft ? [ @@ -171,9 +171,9 @@ class Flipper extends BodyComponent with KeyboardHandler, InitialPosition { final trapeziumFixtureDef = FixtureDef(trapezium) ..density = 50.0 // TODO(alestiago): Use a proper density. ..friction = .1; // TODO(alestiago): Use a proper friction. - fixtures.add(trapeziumFixtureDef); + fixturesDef.add(trapeziumFixtureDef); - return fixtures; + return fixturesDef; } @override diff --git a/lib/game/components/jetpack_ramp.dart b/lib/game/components/jetpack_ramp.dart index d871caa4..715d155a 100644 --- a/lib/game/components/jetpack_ramp.dart +++ b/lib/game/components/jetpack_ramp.dart @@ -17,6 +17,7 @@ class JetpackRamp extends Component with HasGameRef { final double _radius = 200; final double _width = 80; + // TODO(ruialonso): Avoid using radians. final double _angle = radians(210); final double _rotation = radians(-10); @@ -40,8 +41,9 @@ class JetpackRamp extends Component with HasGameRef { radius: _radius, angle: _angle, rotation: _rotation, - layer: _layer, - )..initialPosition = position; + ) + ..initialPosition = position + ..layer = _layer; final leftOpening = JetpackRampOpening( orientation: RampOrientation.down, rotation: radians(15), @@ -84,17 +86,21 @@ class JetpackRampOpening extends RampOpening { final double _rotation; /// Size of the [RampOpening] placed at the entrance/exit of [JetpackRamp]. - final int _size = 6; + // TODO(ruialonso): Avoid magic number 3, should be propotional to + // [JetpackRamp]. + final Vector2 _size = Vector2(3, .1); @override RampOrientation get orientation => _orientation; @override - Shape get shape => PolygonShape() - ..set([ - Vector2(-_size / 2, -.1)..rotate(_rotation), - Vector2(-_size / 2, .1)..rotate(_rotation), - Vector2(_size / 2, .1)..rotate(_rotation), - Vector2(_size / 2, -.1)..rotate(_rotation), - ]); + Shape get shape { + final area = PolygonShape()..setAsBoxXY(_size.x, _size.y); + // TODO(alestiago): Use shape.rotate() once it's implemented. + for (final vertex in area.vertices) { + vertex.rotate(_rotation); + } + + return area; + } } diff --git a/lib/game/components/launcher_ramp.dart b/lib/game/components/launcher_ramp.dart index d6259ae4..aee9d804 100644 --- a/lib/game/components/launcher_ramp.dart +++ b/lib/game/components/launcher_ramp.dart @@ -24,6 +24,8 @@ class LauncherRamp extends Component with HasGameRef { /// The position of this [LauncherRamp] final Vector2 position; + static const _layer = Layer.launcher; + @override Future onLoad() async { gameRef.addContactCallback( @@ -35,16 +37,18 @@ class LauncherRamp extends Component with HasGameRef { start: Vector2(0, 0), end: Vector2(0, 600), width: 80, - layer: Layer.launcher, - )..initialPosition = position; + ) + ..initialPosition = position + ..layer = _layer; final curvedPath = Pathway.arc( color: const Color.fromARGB(255, 251, 255, 0), center: position + Vector2(-28.8, -6), radius: _radius, angle: _angle, width: _width, - layer: Layer.launcher, - )..initialPosition = position + Vector2(-28.8, -6); + ) + ..initialPosition = position + Vector2(-28.8, -6) + ..layer = _layer; final leftOpening = LauncherRampOpening( orientation: RampOrientation.down, rotation: radians(13), @@ -86,18 +90,22 @@ class LauncherRampOpening extends RampOpening { /// entrance/exit of [LauncherRamp]. final double _rotation; - /// Size of the [RampOpening] placed at the entrance/exit of [LauncherRamp]. - final int _size = 6; + /// Size of the [RampOpening] placed at the entrance/exit of [JetpackRamp]. + // TODO(ruialonso): Avoid magic number 3, should be propotional to + // [JetpackRamp]. + final Vector2 _size = Vector2(3, .1); @override RampOrientation get orientation => _orientation; @override - Shape get shape => PolygonShape() - ..set([ - Vector2(-_size / 2, -.1)..rotate(_rotation), - Vector2(-_size / 2, .1)..rotate(_rotation), - Vector2(_size / 2, .1)..rotate(_rotation), - Vector2(_size / 2, -.1)..rotate(_rotation), - ]); + Shape get shape { + final area = PolygonShape()..setAsBoxXY(_size.x, _size.y); + // TODO(alestiago): Use shape.rotate() once it's implemented. + for (final vertex in area.vertices) { + vertex.rotate(_rotation); + } + + return area; + } } diff --git a/lib/game/components/layer.dart b/lib/game/components/layer.dart index 45e7f9ec..d471403c 100644 --- a/lib/game/components/layer.dart +++ b/lib/game/components/layer.dart @@ -11,7 +11,7 @@ import 'package:pinball/game/game.dart'; /// bodies with a different bit value. /// {@endtemplate} mixin Layered on BodyComponent { - Layer _layer = Layer.board; + Layer _layer = Layer.all; /// Sets [Filter] category and mask bits for the [BodyComponent]. Layer get layer => _layer; @@ -19,7 +19,7 @@ mixin Layered on BodyComponent { set layer(Layer value) { _layer = value; if (!isLoaded) { - // TODO(erickzanardo): Use loaded.whenComplete once provided. + // TODO(alestiago): Use loaded.whenComplete once provided. mounted.whenComplete(() => layer = value); } else { for (final fixture in body.fixtures) { diff --git a/lib/game/components/pathway.dart b/lib/game/components/pathway.dart index a31ec632..414442d3 100644 --- a/lib/game/components/pathway.dart +++ b/lib/game/components/pathway.dart @@ -9,14 +9,12 @@ import 'package:pinball/game/game.dart'; /// /// [BodyComponent]s such as a Ball can collide and move along a [Pathway]. /// {@endtemplate} -class Pathway extends BodyComponent with InitialPosition { +class Pathway extends BodyComponent with InitialPosition, Layered { Pathway._({ // TODO(ruialonso): remove color when assets added. Color? color, required List> paths, - Layer? layer, - }) : _paths = paths, - _layer = layer { + }) : _paths = paths { paint = Paint() ..color = color ?? const Color.fromARGB(0, 0, 0, 0) ..style = PaintingStyle.stroke; @@ -35,7 +33,6 @@ class Pathway extends BodyComponent with InitialPosition { required double width, double rotation = 0, bool singleWall = false, - Layer? layer, }) { final paths = >[]; @@ -57,7 +54,6 @@ class Pathway extends BodyComponent with InitialPosition { return Pathway._( color: color, paths: paths, - layer: layer, ); } @@ -81,7 +77,6 @@ class Pathway extends BodyComponent with InitialPosition { required double angle, double rotation = 0, bool singleWall = false, - Layer? layer, }) { final paths = >[]; @@ -107,7 +102,6 @@ class Pathway extends BodyComponent with InitialPosition { return Pathway._( color: color, paths: paths, - layer: layer, ); } @@ -126,7 +120,6 @@ class Pathway extends BodyComponent with InitialPosition { required double width, double rotation = 0, bool singleWall = false, - Layer? layer, }) { final paths = >[]; @@ -148,28 +141,31 @@ class Pathway extends BodyComponent with InitialPosition { return Pathway._( color: color, paths: paths, - layer: layer, ); } final List> _paths; - Layer? _layer; - @override - Body createBody() { - final bodyDef = BodyDef()..position = initialPosition; - final body = world.createBody(bodyDef); + List _createFixtureDefs() { + final fixturesDef = []; + for (final path in _paths) { final chain = ChainShape() ..createChain( path.map(gameRef.screenToWorld).toList(), ); - final fixtureDef = FixtureDef(chain); - - body.createFixture(fixtureDef).filterData.categoryBits = - _layer?.maskBits ?? Layer.board.maskBits; + fixturesDef.add(FixtureDef(chain)); } + return fixturesDef; + } + + @override + Body createBody() { + final bodyDef = BodyDef()..position = initialPosition; + final body = world.createBody(bodyDef); + _createFixtureDefs().forEach(body.createFixture); + return body; } } diff --git a/lib/game/components/sling_shot.dart b/lib/game/components/sling_shot.dart index 61d28c29..a39d130e 100644 --- a/lib/game/components/sling_shot.dart +++ b/lib/game/components/sling_shot.dart @@ -34,7 +34,7 @@ class SlingShot extends BodyComponent with InitialPosition { static final Vector2 size = Vector2(6, 8); List _createFixtureDefs() { - final fixtures = []; + final fixturesDef = []; // TODO(alestiago): This magic number can be deduced by specifying the // angle and using polar coordinate system to place the bottom right @@ -65,7 +65,7 @@ class SlingShot extends BodyComponent with InitialPosition { final triangle = PolygonShape()..set(triangleVertices); final triangleFixtureDef = FixtureDef(triangle)..friction = 0; - fixtures.add(triangleFixtureDef); + fixturesDef.add(triangleFixtureDef); final kicker = EdgeShape() ..set( @@ -76,9 +76,9 @@ class SlingShot extends BodyComponent with InitialPosition { final kickerFixtureDef = FixtureDef(kicker) ..restitution = 10.0 ..friction = 0; - fixtures.add(kickerFixtureDef); + fixturesDef.add(kickerFixtureDef); - return fixtures; + return fixturesDef; } @override