diff --git a/lib/game/components/score_effect_controller.dart b/lib/game/components/score_effect_controller.dart index 7fafd4b5..f9fe9349 100644 --- a/lib/game/components/score_effect_controller.dart +++ b/lib/game/components/score_effect_controller.dart @@ -37,7 +37,7 @@ class ScoreEffectController extends ComponentController text: newScore.toString(), position: Vector2( _noise(), - _noise() + (-BoardDimensions.bounds.topCenter.dy + 10), + _noise() + (BoardDimensions.bounds.topCenter.dy + 10), ), ), ); diff --git a/packages/pinball_components/lib/src/components/ball.dart b/packages/pinball_components/lib/src/components/ball.dart index 9adefd3a..726e474f 100644 --- a/packages/pinball_components/lib/src/components/ball.dart +++ b/packages/pinball_components/lib/src/components/ball.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:math' as math; import 'dart:ui'; import 'package:flame/components.dart'; @@ -107,7 +108,8 @@ class Ball extends BodyComponent unawaited(gameRef.add(effect)); } - _rescale(); + _rescaleSize(); + _setPositionalGravity(); } /// Applies a boost on this [Ball]. @@ -116,19 +118,36 @@ class Ball extends BodyComponent _boostTimer = _boostDuration; } - void _rescale() { + void _rescaleSize() { final boardHeight = BoardDimensions.bounds.height; - const maxShrinkAmount = BoardDimensions.perspectiveShrinkFactor; + const maxShrinkValue = BoardDimensions.perspectiveShrinkFactor; - final adjustedYPosition = -body.position.y + (boardHeight / 2); + final standardizedYPosition = body.position.y + (boardHeight / 2); - final scaleFactor = ((boardHeight - adjustedYPosition) / - BoardDimensions.shrinkAdjustedHeight) + - maxShrinkAmount; + final scaleFactor = maxShrinkValue + + ((standardizedYPosition / boardHeight) * (1 - maxShrinkValue)); body.fixtures.first.shape.radius = (size.x / 2) * scaleFactor; _spriteComponent.scale = Vector2.all(scaleFactor); } + + void _setPositionalGravity() { + final defaultGravity = gameRef.world.gravity.y; + final maxXDeviationFromCenter = BoardDimensions.bounds.width / 2; + const maxXGravityPercentage = + (1 - BoardDimensions.perspectiveShrinkFactor) / 2; + final xDeviationFromCenter = body.position.x; + + final positionalXForce = ((xDeviationFromCenter / maxXDeviationFromCenter) * + maxXGravityPercentage) * + defaultGravity; + + final positionalYForce = math.sqrt( + math.pow(defaultGravity, 2) - math.pow(positionalXForce, 2), + ); + + body.gravityOverride = Vector2(positionalXForce, positionalYForce); + } } class _BallSpriteComponent extends SpriteComponent with HasGameRef { diff --git a/packages/pinball_components/lib/src/components/board_dimensions.dart b/packages/pinball_components/lib/src/components/board_dimensions.dart index 83e3e29f..3d547996 100644 --- a/packages/pinball_components/lib/src/components/board_dimensions.dart +++ b/packages/pinball_components/lib/src/components/board_dimensions.dart @@ -22,8 +22,4 @@ class BoardDimensions { /// Factor the board shrinks by from the closest point to the farthest. static const perspectiveShrinkFactor = 0.63; - - /// Board height based on the [perspectiveShrinkFactor]. - static final shrinkAdjustedHeight = - (1 / (1 - perspectiveShrinkFactor)) * size.y; } diff --git a/packages/pinball_components/test/src/components/board_dimensions_test.dart b/packages/pinball_components/test/src/components/board_dimensions_test.dart index afd4a2d8..2529cac1 100644 --- a/packages/pinball_components/test/src/components/board_dimensions_test.dart +++ b/packages/pinball_components/test/src/components/board_dimensions_test.dart @@ -19,9 +19,5 @@ void main() { test('has perspectiveShrinkFactor', () { expect(BoardDimensions.perspectiveShrinkFactor, equals(0.63)); }); - - test('has shrinkAdjustedHeight', () { - expect(BoardDimensions.shrinkAdjustedHeight, isNotNull); - }); }); }