refactor: adjust physics and add tests

pull/285/head
Allison Ryan 3 years ago
parent 8991d8bb9d
commit fd110feef3

@ -12,8 +12,8 @@ class Launcher extends Component {
: super(
children: [
LaunchRamp(),
ControlledPlunger(compressionDistance: 10.5)
..initialPosition = Vector2(41.1, 43),
ControlledPlunger(compressionDistance: 9.2)
..initialPosition = Vector2(41.2, 43.7),
RocketSpriteComponent()..position = Vector2(43, 62.3),
],
);

@ -29,7 +29,7 @@ class SparkyScorch extends Component {
ScoringBehavior(points: 20000),
],
)..initialPosition = Vector2(-3.3, -52.55),
SparkyComputerSensor()..initialPosition = Vector2(-13, -49.8),
SparkyComputerSensor()..initialPosition = Vector2(-13, -49.9),
SparkyAnimatronic()..position = Vector2(-13.8, -58.2),
SparkyComputer(),
],
@ -53,7 +53,13 @@ class SparkyComputerSensor extends BodyComponent
@override
Body createBody() {
final shape = CircleShape()..radius = 0.1;
final shape = PolygonShape()
..setAsBox(
1,
0.1,
Vector2.zero(),
-0.18,
);
final fixtureDef = FixtureDef(shape, isSensor: true);
final bodyDef = BodyDef(
position: initialPosition,

@ -23,7 +23,7 @@ class PinballGame extends Forge2DGame
PinballGame({
required this.characterTheme,
required this.audio,
}) : super(gravity: Vector2(0, 35)) {
}) : super(gravity: Vector2(0, 30)) {
images.prefix = '';
controller = _GameBallsController(this);
}

@ -68,7 +68,10 @@ class AndroidBumper extends BodyComponent with InitialPosition, ZIndex {
dimmedAssetPath: Assets.images.android.bumper.b.dimmed.keyName,
spritePosition: Vector2(0, -0.1),
bloc: AndroidBumperCubit(),
children: children,
children: [
...?children,
BumpingBehavior(strength: 20),
],
);
/// {@macro android_bumper}

@ -7,6 +7,7 @@ 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;
import 'package:pinball_components/src/components/bumping_behavior.dart';
import 'package:pinball_flame/pinball_flame.dart';
class AndroidSpaceship extends Component {
@ -141,14 +142,9 @@ class _AndroidHead extends BodyComponent with InitialPosition, Layered, ZIndex {
majorRadius: 3.1,
minorRadius: 2,
)..rotate(1.4);
// TODO(allisonryan0002): use bumping behavior.
final fixtureDef = FixtureDef(
shape,
restitution: 0.1,
);
final bodyDef = BodyDef(position: initialPosition);
return world.createBody(bodyDef)..createFixture(fixtureDef);
return world.createBody(bodyDef)..createFixtureFromShape(shape);
}
}

@ -116,7 +116,7 @@ class Ball<T extends Forge2DGame> extends BodyComponent<T>
math.pow(defaultGravity, 2) - math.pow(positionalXForce, 2),
);
body.gravityOverride = Vector2(-positionalXForce, positionalYForce);
body.gravityOverride = Vector2(positionalXForce, positionalYForce);
}
}

@ -36,7 +36,7 @@ class Kicker extends BodyComponent with InitialPosition {
}) : _side = side,
super(
children: [
BumpingBehavior(strength: 15)..applyTo(['bouncy_edge']),
BumpingBehavior(strength: 20)..applyTo(['bouncy_edge']),
KickerBallContactBehavior()..applyTo(['bouncy_edge']),
KickerBlinkingBehavior(),
_KickerSpriteGroupComponent(

@ -79,7 +79,7 @@ class Plunger extends BodyComponent with InitialPosition, Layered, ZIndex {
/// The velocity's magnitude depends on how far the [Plunger] has been pulled
/// from its original [initialPosition].
void release() {
final velocity = (initialPosition.y - body.position.y) * 20;
final velocity = (initialPosition.y - body.position.y) * 11;
body.linearVelocity = Vector2(0, velocity);
_spriteComponent.release();
}

@ -29,7 +29,7 @@ class Slingshots extends Component with ZIndex {
}
/// {@template slingshot}
/// Elastic bumper that bounces the [Ball] off of its straight sides.
/// Elastic bumper that bounces the [Ball] off of its sides.
/// {@endtemplate}
class Slingshot extends BodyComponent with InitialPosition {
/// {@macro slingshot}
@ -42,7 +42,7 @@ class Slingshot extends BodyComponent with InitialPosition {
super(
children: [
_SlinghsotSpriteComponent(spritePath, angle: angle),
BumpingBehavior(strength: 10),
BumpingBehavior(strength: 20),
],
renderBody: false,
);
@ -56,37 +56,27 @@ class Slingshot extends BodyComponent with InitialPosition {
final topCircleShape = CircleShape()..radius = circleRadius;
topCircleShape.position.setValues(0, -_length / 2);
final topCircleFixtureDef = FixtureDef(topCircleShape);
final bottomCircleShape = CircleShape()..radius = circleRadius;
bottomCircleShape.position.setValues(0, _length / 2);
final bottomCircleFixtureDef = FixtureDef(bottomCircleShape);
final leftEdgeShape = EdgeShape()
..set(
Vector2(circleRadius, _length / 2),
Vector2(circleRadius, -_length / 2),
);
final leftEdgeShapeFixtureDef = FixtureDef(
leftEdgeShape,
restitution: 5,
);
final rightEdgeShape = EdgeShape()
..set(
Vector2(-circleRadius, _length / 2),
Vector2(-circleRadius, -_length / 2),
);
final rightEdgeShapeFixtureDef = FixtureDef(
rightEdgeShape,
restitution: 5,
);
return [
topCircleFixtureDef,
bottomCircleFixtureDef,
leftEdgeShapeFixtureDef,
rightEdgeShapeFixtureDef,
FixtureDef(topCircleShape),
FixtureDef(bottomCircleShape),
FixtureDef(leftEdgeShape),
FixtureDef(rightEdgeShape),
];
}

@ -23,7 +23,7 @@ abstract class ZIndexes {
// TODO(allisonryan0002): fix this magic zindex. Could bump all priorities so
// there are no negatives.
static const boardBackground = 3 * _below + _base;
static const boardBackground = 5 * _below + _base;
static const decal = _above + boardBackground;
@ -61,7 +61,7 @@ abstract class ZIndexes {
// Flutter Forest
static const flutterForest = _above + launchRampForegroundRailing;
static const flutterForest = _above + ballOnBoard;
// Sparky Scorch

@ -7,6 +7,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/android_bumper/behaviors/behaviors.dart';
import 'package:pinball_components/src/components/bumping_behavior.dart';
import '../../../helpers/helpers.dart';
@ -81,6 +82,15 @@ void main() {
isNotNull,
);
});
flameTester.test('a BumpingBehavior', (game) async {
final androidBumper = AndroidBumper.a();
await game.ensureAdd(androidBumper);
expect(
androidBumper.children.whereType<BumpingBehavior>().single,
isNotNull,
);
});
});
});
}

@ -6,6 +6,7 @@ import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/bumping_behavior.dart';
import 'package:pinball_components/src/components/dash_nest_bumper/behaviors/behaviors.dart';
import '../../../helpers/helpers.dart';
@ -83,6 +84,15 @@ void main() {
isNotNull,
);
});
flameTester.test('a BumpingBehavior', (game) async {
final dashNestBumper = DashNestBumper.a();
await game.ensureAdd(dashNestBumper);
expect(
dashNestBumper.children.whereType<BumpingBehavior>().single,
isNotNull,
);
});
});
});
}

@ -4,6 +4,7 @@ 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 'package:pinball_components/src/components/bumping_behavior.dart';
import '../../helpers/helpers.dart';
@ -14,8 +15,6 @@ void main() {
Assets.images.slingshot.lower.keyName,
];
final flameTester = FlameTester(() => TestGame(assets));
const length = 2.0;
const angle = 0.0;
flameTester.test('loads correctly', (game) async {
final component = Slingshots();
@ -40,68 +39,12 @@ void main() {
},
);
flameTester.test(
'loads correctly',
(game) async {
final slingshot = Slingshot(
length: length,
angle: angle,
spritePath: assets.first,
);
await game.ensureAdd(slingshot);
expect(game.contains(slingshot), isTrue);
},
);
flameTester.test(
'body is static',
(game) async {
final slingshot = Slingshot(
length: length,
angle: angle,
spritePath: assets.first,
);
await game.ensureAdd(slingshot);
expect(slingshot.body.bodyType, equals(BodyType.static));
},
);
flameTester.test(
'has restitution',
(game) async {
final slingshot = Slingshot(
length: length,
angle: angle,
spritePath: assets.first,
);
await game.ensureAdd(slingshot);
final totalRestitution = slingshot.body.fixtures.fold<double>(
0,
(total, fixture) => total + fixture.restitution,
);
expect(totalRestitution, greaterThan(0));
},
);
flameTester.test(
'has no friction',
(game) async {
final slingshot = Slingshot(
length: length,
angle: angle,
spritePath: assets.first,
);
await game.ensureAdd(slingshot);
final totalFriction = slingshot.body.fixtures.fold<double>(
0,
(total, fixture) => total + fixture.friction,
);
expect(totalFriction, equals(0));
},
);
flameTester.test('adds BumpingBehavior', (game) async {
final slingshots = Slingshots();
await game.ensureAdd(slingshots);
for (final slingshot in slingshots.children) {
expect(slingshot.firstChild<BumpingBehavior>(), isNotNull);
}
});
});
}

@ -6,6 +6,7 @@ import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/bumping_behavior.dart';
import 'package:pinball_components/src/components/sparky_bumper/behaviors/behaviors.dart';
import '../../../helpers/helpers.dart';
@ -81,6 +82,15 @@ void main() {
isNotNull,
);
});
flameTester.test('a BumpingBehavior', (game) async {
final sparkyBumper = SparkyBumper.a();
await game.ensureAdd(sparkyBumper);
expect(
sparkyBumper.children.whereType<BumpingBehavior>().single,
isNotNull,
);
});
});
});
}

Loading…
Cancel
Save