From da9440ac6a50a1b4f08475a1487a5625a9178209 Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Thu, 31 Mar 2022 20:52:26 +0200 Subject: [PATCH] feat: added dino bottom wall --- assets/images/components/dino-land-bottom.png | Bin 0 -> 11297 bytes lib/game/components/components.dart | 1 + lib/game/components/dino_wall.dart | 214 ++++++++++++++++++ lib/game/components/wall.dart | 112 --------- lib/game/game_assets.dart | 2 + lib/game/pinball_game.dart | 7 +- lib/gen/assets.gen.dart | 4 + 7 files changed, 226 insertions(+), 114 deletions(-) create mode 100644 assets/images/components/dino-land-bottom.png create mode 100644 lib/game/components/dino_wall.dart diff --git a/assets/images/components/dino-land-bottom.png b/assets/images/components/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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 _createFixtureDefs() { + final fixturesDef = []; + + final topStraightControlPoints = [ + Vector2(29.5, 35.1), + Vector2(28.4, 35.1), + ]; + final topStraightShape = EdgeShape() + ..set( + topStraightControlPoints.first, + topStraightControlPoints.last, + ); + final topStraightFixtureDef = FixtureDef(topStraightShape); + fixturesDef.add(topStraightFixtureDef); + + final topCurveControlPoints = [ + topStraightControlPoints.last, + Vector2(17.4, 26.38), + Vector2(25.5, 20.7), + ]; + final topCurveShape = BezierCurveShape( + controlPoints: topCurveControlPoints, + ); + fixturesDef.add(FixtureDef(topCurveShape)); + + final middleCurveControlPoints = [ + topCurveControlPoints.last, + Vector2(27.8, 20.1), + Vector2(26.8, 19.5), + ]; + final middleCurveShape = BezierCurveShape( + controlPoints: middleCurveControlPoints, + ); + fixturesDef.add(FixtureDef(middleCurveShape)); + + final bottomCurveControlPoints = [ + middleCurveControlPoints.last, + Vector2(21.15, 16), + Vector2(25.6, 15.2), + ]; + final bottomCurveShape = BezierCurveShape( + controlPoints: bottomCurveControlPoints, + ); + fixturesDef.add(FixtureDef(bottomCurveShape)); + + final bottomStraightControlPoints = [ + bottomCurveControlPoints.last, + Vector2(31, 14.5), + ]; + 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 _loadBackground(); + } + + Future _loadBackground() async { + final sprite = await gameRef.loadSprite( + Assets.images.components.dinoLandTop.path, + ); + 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 located below dino, at the right of the board. +/// {@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 _loadBackground(); + } + + Future _loadBackground() async { + final sprite = await gameRef.loadSprite( + Assets.images.components.dinoLandBottom.path, + ); + 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/lib/game/components/wall.dart b/lib/game/components/wall.dart index 6f19ca56..030edc50 100644 --- a/lib/game/components/wall.dart +++ b/lib/game/components/wall.dart @@ -1,12 +1,8 @@ // ignore_for_file: avoid_renaming_method_parameters -import 'dart:math' as math; -import 'package:flame/components.dart'; import 'package:flame/extensions.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:flutter/material.dart'; import 'package:pinball/game/game.dart'; -import 'package:pinball/gen/assets.gen.dart'; import 'package:pinball_components/pinball_components.dart' hide Assets; /// {@template wall} @@ -84,111 +80,3 @@ class BottomWallBallContactCallback extends ContactCallback { ball.children.whereType().first.lost(); } } - -/// {@template dino_top_wall} -/// Wall located above dino, at the right of the board. -/// {@endtemplate} -class DinoTopWall extends BodyComponent with InitialPosition { - ///{@macro dino_top_wall} - DinoTopWall() : super(priority: 2); - - List _createFixtureDefs() { - final fixturesDef = []; - - final topStraightControlPoints = [ - Vector2(29.5, 35.1), - Vector2(28.4, 35.1), - ]; - final topStraightShape = EdgeShape() - ..set( - topStraightControlPoints.first, - topStraightControlPoints.last, - ); - final topStraightFixtureDef = FixtureDef(topStraightShape); - fixturesDef.add(topStraightFixtureDef); - - final topCurveControlPoints = [ - topStraightControlPoints.last, - Vector2(17.4, 26.38), - Vector2(25.5, 20.7), - ]; - final topCurveShape = BezierCurveShape( - controlPoints: topCurveControlPoints, - ); - fixturesDef.add(FixtureDef(topCurveShape)); - - final middleCurveControlPoints = [ - topCurveControlPoints.last, - Vector2(27.8, 20.1), - Vector2(26.8, 19.5), - ]; - final middleCurveShape = BezierCurveShape( - controlPoints: middleCurveControlPoints, - ); - fixturesDef.add(FixtureDef(middleCurveShape)); - - final bottomCurveControlPoints = [ - middleCurveControlPoints.last, - Vector2(21.15, 16), - Vector2(25.6, 15.2), - ]; - final bottomCurveShape = BezierCurveShape( - controlPoints: bottomCurveControlPoints, - ); - fixturesDef.add(FixtureDef(bottomCurveShape)); - - final bottomStraightControlPoints = [ - bottomCurveControlPoints.last, - Vector2(31, 14.5), - ]; - 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 _loadBackground(); - } - - Future _loadBackground() async { - final sprite = await gameRef.loadSprite( - Assets.images.components.dinoLandTop.path, - ); - final spriteComponent = SpriteComponent( - sprite: sprite, - size: Vector2(10.6, 27.7), - anchor: Anchor.center, - )..position = Vector2(27, -28.2); - - await add(spriteComponent); - } -} diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index ee7b7900..f89a999c 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -14,6 +14,8 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.baseboard.left.keyName), images.load(components.Assets.images.baseboard.right.keyName), images.load(Assets.images.components.background.path), + images.load(Assets.images.components.dinoLandTop.path), + images.load(Assets.images.components.dinoLandBottom.path), ]); } } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 3e5ad5dc..1f36a8d3 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -69,6 +69,9 @@ class PinballGame extends Forge2DGame await add( DinoTopWall()..initialPosition = Vector2(-2.4, 0), ); + await add( + DinoBottomWall()..initialPosition = Vector2(-2.4, 0), + ); } Future _addPlunger() async { @@ -111,7 +114,7 @@ class DebugPinballGame extends PinballGame with TapDetector { @override Future onLoad() async { await super.onLoad(); - await _loadBackground(); + //await _loadBackground(); } // TODO(alestiago): Move to PinballGame once we have the real background @@ -125,7 +128,7 @@ class DebugPinballGame extends PinballGame with TapDetector { size: Vector2(120, 160), anchor: Anchor.center, ) - ..position = Vector2(0, -15) + ..position = Vector2(0, -7.8) ..priority = -1; await add(spriteComponent); diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 8ba5344e..42dc62ea 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -21,6 +21,10 @@ class $AssetsImagesComponentsGen { AssetGenImage get background => const AssetGenImage('assets/images/components/background.png'); + /// File path: assets/images/components/dino-land-bottom.png + AssetGenImage get dinoLandBottom => + const AssetGenImage('assets/images/components/dino-land-bottom.png'); + /// File path: assets/images/components/dino-land-top.png AssetGenImage get dinoLandTop => const AssetGenImage('assets/images/components/dino-land-top.png');