From 48f831264e860156af4dcd2c6cc92a7b359c6592 Mon Sep 17 00:00:00 2001 From: Rui Miguel Alonso Date: Fri, 1 Apr 2022 10:20:37 +0200 Subject: [PATCH] feat: add dino wall (#115) * feat: added dino walls * refactor: moved board * fix: undo board movement * feat: fixing shapes for wall with asset * fix: placed dino wall asset and shapes * fix: fixed top wall shape * feat: added dino bottom wall * fix: show background * fix: fixed geometry test * test: added golden tests for dino wall * test: removed unused import * refactor: moved dino walls to pinball_components * chore: analysis errors * refactor: more analysis errors * chore: analysis error * test: added tests for dino walls * chore: unused import * test: refactored golden test * refactor: refactored vertices shapes * test: make dino wall private and removed golden tests for them Co-authored-by: Alejandro Santiago --- lib/game/components/wall.dart | 4 +- lib/game/game_assets.dart | 2 + lib/game/pinball_game.dart | 7 + lib/gen/assets.gen.dart | 3 + packages/geometry/lib/src/geometry.dart | 2 +- packages/geometry/test/src/geometry_test.dart | 8 +- .../assets/images/dino/dino-land-bottom.png | Bin 0 -> 11297 bytes .../assets/images/dino/dino-land-top.png | Bin 0 -> 16559 bytes .../lib/gen/assets.gen.dart | 14 +- .../lib/src/components/components.dart | 1 + .../lib/src/components/dino_walls.dart | 225 ++++++++++++++++++ packages/pinball_components/pubspec.yaml | 1 + .../test/src/components/dino_walls_test.dart | 28 +++ .../components/golden/dino-bottom-wall.png | Bin 0 -> 39312 bytes .../src/components/golden/dino-top-wall.png | Bin 0 -> 45600 bytes 15 files changed, 287 insertions(+), 8 deletions(-) create mode 100644 packages/pinball_components/assets/images/dino/dino-land-bottom.png create mode 100644 packages/pinball_components/assets/images/dino/dino-land-top.png create mode 100644 packages/pinball_components/lib/src/components/dino_walls.dart create mode 100644 packages/pinball_components/test/src/components/dino_walls_test.dart create mode 100644 packages/pinball_components/test/src/components/golden/dino-bottom-wall.png create mode 100644 packages/pinball_components/test/src/components/golden/dino-top-wall.png diff --git a/lib/game/components/wall.dart b/lib/game/components/wall.dart index f5d03c80..030edc50 100644 --- a/lib/game/components/wall.dart +++ b/lib/game/components/wall.dart @@ -2,8 +2,8 @@ import 'package:flame/extensions.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:pinball/game/components/components.dart'; -import 'package:pinball_components/pinball_components.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. diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index ee7b7900..edfe7947 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -13,6 +13,8 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.flipper.right.keyName), images.load(components.Assets.images.baseboard.left.keyName), images.load(components.Assets.images.baseboard.right.keyName), + images.load(components.Assets.images.dino.dinoLandTop.keyName), + images.load(components.Assets.images.dino.dinoLandBottom.keyName), images.load(Assets.images.components.background.path), ]); } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index c2bbe8e0..b5162053 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -66,6 +66,13 @@ class PinballGame extends Forge2DGame Future _addGameBoundaries() async { await add(BottomWall()); createBoundaries(this).forEach(add); + unawaited( + addFromBlueprint( + DinoWalls( + position: Vector2(-2.4, 0), + ), + ), + ); } Future _addPlunger() async { diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 370d8fcf..97be7f3e 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -3,6 +3,8 @@ /// FlutterGen /// ***************************************************** +// ignore_for_file: directives_ordering,unnecessary_import + import 'package:flutter/widgets.dart'; class $AssetsImagesGen { @@ -15,6 +17,7 @@ class $AssetsImagesGen { class $AssetsImagesComponentsGen { const $AssetsImagesComponentsGen(); + /// File path: assets/images/components/background.png AssetGenImage get background => const AssetGenImage('assets/images/components/background.png'); } diff --git a/packages/geometry/lib/src/geometry.dart b/packages/geometry/lib/src/geometry.dart index 6975f8cb..edc176e7 100644 --- a/packages/geometry/lib/src/geometry.dart +++ b/packages/geometry/lib/src/geometry.dart @@ -82,7 +82,7 @@ List calculateEllipse({ /// For more information read: https://en.wikipedia.org/wiki/B%C3%A9zier_curve List calculateBezierCurve({ required List controlPoints, - double step = 0.001, + double step = 0.01, }) { assert( 0 <= step && step <= 1, diff --git a/packages/geometry/test/src/geometry_test.dart b/packages/geometry/test/src/geometry_test.dart index 7a49b2b2..e702f043 100644 --- a/packages/geometry/test/src/geometry_test.dart +++ b/packages/geometry/test/src/geometry_test.dart @@ -98,14 +98,14 @@ void main() { ); }); - test('returns by default 1000 points as indicated by step', () { + test('returns by default 100 points as indicated by step', () { final points = calculateBezierCurve( controlPoints: [ Vector2(0, 0), Vector2(10, 10), ], ); - expect(points.length, 1000); + expect(points.length, 100); }); test('returns as many points as indicated by step', () { @@ -114,9 +114,9 @@ void main() { Vector2(0, 0), Vector2(10, 10), ], - step: 0.01, + step: 0.001, ); - expect(points.length, 100); + expect(points.length, 1000); }); }); diff --git a/packages/pinball_components/assets/images/dino/dino-land-bottom.png b/packages/pinball_components/assets/images/dino/dino-land-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..1839dda3a852a83a3230ba24711fd0f043174320 GIT binary patch literal 11297 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
df&;(kjoJGDU!$~7>5tO_DAeHfsIxr>q~>o3rE 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 literal 0 HcmV?d00001 diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index 27a54591..8bd651ed 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -14,7 +14,7 @@ class $AssetsImagesGen { AssetGenImage get ball => const AssetGenImage('assets/images/ball.png'); $AssetsImagesBaseboardGen get baseboard => const $AssetsImagesBaseboardGen(); - + $AssetsImagesDinoGen get dino => const $AssetsImagesDinoGen(); $AssetsImagesFlipperGen get flipper => const $AssetsImagesFlipperGen(); /// File path: assets/images/flutter_sign_post.png @@ -42,6 +42,18 @@ class $AssetsImagesBaseboardGen { const AssetGenImage('assets/images/baseboard/right.png'); } +class $AssetsImagesDinoGen { + const $AssetsImagesDinoGen(); + + /// File path: assets/images/dino/dino-land-bottom.png + AssetGenImage get dinoLandBottom => + const AssetGenImage('assets/images/dino/dino-land-bottom.png'); + + /// File path: assets/images/dino/dino-land-top.png + AssetGenImage get dinoLandTop => + const AssetGenImage('assets/images/dino/dino-land-top.png'); +} + class $AssetsImagesFlipperGen { const $AssetsImagesFlipperGen(); diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index a475f91e..4e38c2c4 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -2,6 +2,7 @@ export 'ball.dart'; export 'baseboard.dart'; export 'board_dimensions.dart'; export 'board_side.dart'; +export 'dino_walls.dart'; export 'fire_effect.dart'; export 'flipper.dart'; export 'flutter_sign_post.dart'; diff --git a/packages/pinball_components/lib/src/components/dino_walls.dart b/packages/pinball_components/lib/src/components/dino_walls.dart new file mode 100644 index 00000000..13f56ff3 --- /dev/null +++ b/packages/pinball_components/lib/src/components/dino_walls.dart @@ -0,0 +1,225 @@ +// ignore_for_file: comment_references, avoid_renaming_method_parameters + +import 'dart:async'; + +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball_components/gen/assets.gen.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; + +/// {@template dinowalls} +/// A [Blueprint] which creates walls for the [ChromeDino]. +/// {@endtemplate} +class DinoWalls extends Forge2DBlueprint { + /// {@macro dinowalls} + DinoWalls({required this.position}); + + /// The [position] where the elements will be created + final Vector2 position; + + @override + void build(_) { + addAll([ + _DinoTopWall()..initialPosition = position, + _DinoBottomWall()..initialPosition = position, + ]); + } +} + +/// {@template dino_top_wall} +/// Wall segment located above [ChromeDino]. +/// {@endtemplate} +class _DinoTopWall extends BodyComponent with InitialPosition { + ///{@macro dino_top_wall} + _DinoTopWall() : super(priority: 2); + + List _createFixtureDefs() { + final fixturesDef = []; + + final topStraightShape = EdgeShape() + ..set( + Vector2(29.5, 35.1), + Vector2(28.4, 35.1), + ); + final topStraightFixtureDef = FixtureDef(topStraightShape); + fixturesDef.add(topStraightFixtureDef); + + final topCurveShape = BezierCurveShape( + controlPoints: [ + topStraightShape.vertex1, + Vector2(17.4, 26.38), + Vector2(25.5, 20.7), + ], + ); + fixturesDef.add(FixtureDef(topCurveShape)); + + final middleCurveShape = BezierCurveShape( + controlPoints: [ + topCurveShape.vertices.last, + Vector2(27.8, 20.1), + Vector2(26.8, 19.5), + ], + ); + fixturesDef.add(FixtureDef(middleCurveShape)); + + final bottomCurveShape = BezierCurveShape( + controlPoints: [ + middleCurveShape.vertices.last, + Vector2(21.15, 16), + Vector2(25.6, 15.2), + ], + ); + fixturesDef.add(FixtureDef(bottomCurveShape)); + + final bottomStraightShape = EdgeShape() + ..set( + bottomCurveShape.vertices.last, + Vector2(31, 14.5), + ); + final bottomStraightFixtureDef = FixtureDef(bottomStraightShape); + fixturesDef.add(bottomStraightFixtureDef); + + return fixturesDef; + } + + @override + Body createBody() { + renderBody = false; + + final bodyDef = BodyDef() + ..userData = this + ..position = initialPosition + ..type = BodyType.static; + + final body = world.createBody(bodyDef); + _createFixtureDefs().forEach( + (fixture) => body.createFixture( + fixture + ..restitution = 0.1 + ..friction = 0, + ), + ); + + return body; + } + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprite(); + } + + Future _loadSprite() async { + final sprite = await gameRef.loadSprite( + Assets.images.dino.dinoLandTop.keyName, + ); + final spriteComponent = SpriteComponent( + sprite: sprite, + size: Vector2(10.6, 27.7), + anchor: Anchor.center, + position: Vector2(27, -28.2), + ); + + await add(spriteComponent); + } +} + +/// {@template dino_bottom_wall} +/// Wall segment located below [ChromeDino]. +/// {@endtemplate} +class _DinoBottomWall extends BodyComponent with InitialPosition { + ///{@macro dino_top_wall} + _DinoBottomWall() : super(priority: 2); + + List _createFixtureDefs() { + final fixturesDef = []; + + final topStraightControlPoints = [ + Vector2(32.4, 8.3), + Vector2(25, 7.7), + ]; + final topStraightShape = EdgeShape() + ..set( + topStraightControlPoints.first, + topStraightControlPoints.last, + ); + final topStraightFixtureDef = FixtureDef(topStraightShape); + fixturesDef.add(topStraightFixtureDef); + + final topLeftCurveControlPoints = [ + topStraightControlPoints.last, + Vector2(21.8, 7), + Vector2(29.5, -13.8), + ]; + final topLeftCurveShape = BezierCurveShape( + controlPoints: topLeftCurveControlPoints, + ); + fixturesDef.add(FixtureDef(topLeftCurveShape)); + + final bottomLeftStraightControlPoints = [ + topLeftCurveControlPoints.last, + Vector2(31.8, -44.1), + ]; + final bottomLeftStraightShape = EdgeShape() + ..set( + bottomLeftStraightControlPoints.first, + bottomLeftStraightControlPoints.last, + ); + final bottomLeftStraightFixtureDef = FixtureDef(bottomLeftStraightShape); + fixturesDef.add(bottomLeftStraightFixtureDef); + + final bottomStraightControlPoints = [ + bottomLeftStraightControlPoints.last, + Vector2(37.8, -44.1), + ]; + final bottomStraightShape = EdgeShape() + ..set( + bottomStraightControlPoints.first, + bottomStraightControlPoints.last, + ); + final bottomStraightFixtureDef = FixtureDef(bottomStraightShape); + fixturesDef.add(bottomStraightFixtureDef); + + return fixturesDef; + } + + @override + Body createBody() { + renderBody = false; + + final bodyDef = BodyDef() + ..userData = this + ..position = initialPosition + ..type = BodyType.static; + + final body = world.createBody(bodyDef); + _createFixtureDefs().forEach( + (fixture) => body.createFixture( + fixture + ..restitution = 0.1 + ..friction = 0, + ), + ); + + return body; + } + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprite(); + } + + Future _loadSprite() async { + final sprite = await gameRef.loadSprite( + Assets.images.dino.dinoLandBottom.keyName, + ); + final spriteComponent = SpriteComponent( + sprite: sprite, + size: Vector2(15.6, 54.8), + anchor: Anchor.center, + )..position = Vector2(31.7, 18); + + await add(spriteComponent); + } +} diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index c0eab284..d1f138d9 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -27,6 +27,7 @@ flutter: assets: - assets/images/ - assets/images/baseboard/ + - assets/images/dino/ - assets/images/flipper/ flutter_gen: diff --git a/packages/pinball_components/test/src/components/dino_walls_test.dart b/packages/pinball_components/test/src/components/dino_walls_test.dart new file mode 100644 index 00000000..af80444b --- /dev/null +++ b/packages/pinball_components/test/src/components/dino_walls_test.dart @@ -0,0 +1,28 @@ +// 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_components/pinball_components.dart'; + +import '../../helpers/helpers.dart'; + +void main() { + group('DinoWalls', () { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(TestGame.new); + + flameTester.test( + 'loads correctly', + (game) async { + final dinoWalls = DinoWalls(position: Vector2.zero()); + await game.addFromBlueprint(dinoWalls); + await game.ready(); + + for (final wall in dinoWalls.components) { + expect(game.contains(wall), isTrue); + } + }, + ); + }); +} diff --git a/packages/pinball_components/test/src/components/golden/dino-bottom-wall.png b/packages/pinball_components/test/src/components/golden/dino-bottom-wall.png new file mode 100644 index 0000000000000000000000000000000000000000..14ae9c0d3daf286a1d288bd2e8e69fec7055a2e5 GIT binary patch literal 39312 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 literal 0 HcmV?d00001 diff --git a/packages/pinball_components/test/src/components/golden/dino-top-wall.png b/packages/pinball_components/test/src/components/golden/dino-top-wall.png new file mode 100644 index 0000000000000000000000000000000000000000..0d434d694322b84c746757eb3d2adda91a5ad6e6 GIT binary patch literal 45600 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 literal 0 HcmV?d00001