Merge branch 'main' into feat/multipliers

pull/231/head
Rui Miguel Alonso 3 years ago committed by GitHub
commit 3462fb4122
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -18,12 +18,17 @@ class AndroidAcres extends Blueprint {
children: [ children: [
ScoringBehavior(points: 20000), ScoringBehavior(points: 20000),
], ],
)..initialPosition = Vector2(-32.52, -9.1), )..initialPosition = Vector2(-25, 1.3),
AndroidBumper.b( AndroidBumper.b(
children: [ children: [
ScoringBehavior(points: 20000), ScoringBehavior(points: 20000),
], ],
)..initialPosition = Vector2(-22.89, -17.35), )..initialPosition = Vector2(-32.6, -9.2),
AndroidBumper.cow(
children: [
ScoringBehavior(points: 20),
],
)..initialPosition = Vector2(-20.5, -13.8),
], ],
blueprints: [ blueprints: [
SpaceshipRamp(), SpaceshipRamp(),

@ -83,6 +83,8 @@ extension PinballGameAssetsX on PinballGame {
images.load(components.Assets.images.androidBumper.a.dimmed.keyName), images.load(components.Assets.images.androidBumper.a.dimmed.keyName),
images.load(components.Assets.images.androidBumper.b.lit.keyName), images.load(components.Assets.images.androidBumper.b.lit.keyName),
images.load(components.Assets.images.androidBumper.b.dimmed.keyName), images.load(components.Assets.images.androidBumper.b.dimmed.keyName),
images.load(components.Assets.images.androidBumper.cow.lit.keyName),
images.load(components.Assets.images.androidBumper.cow.dimmed.keyName),
images.load(components.Assets.images.sparky.computer.top.keyName), images.load(components.Assets.images.sparky.computer.top.keyName),
images.load(components.Assets.images.sparky.computer.base.keyName), images.load(components.Assets.images.sparky.computer.base.keyName),
images.load(components.Assets.images.sparky.animatronic.keyName), images.load(components.Assets.images.sparky.animatronic.keyName),

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

@ -40,6 +40,8 @@ class $AssetsImagesAndroidBumperGen {
const $AssetsImagesAndroidBumperAGen(); const $AssetsImagesAndroidBumperAGen();
$AssetsImagesAndroidBumperBGen get b => $AssetsImagesAndroidBumperBGen get b =>
const $AssetsImagesAndroidBumperBGen(); const $AssetsImagesAndroidBumperBGen();
$AssetsImagesAndroidBumperCowGen get cow =>
const $AssetsImagesAndroidBumperCowGen();
} }
class $AssetsImagesBackboardGen { class $AssetsImagesBackboardGen {
@ -298,6 +300,18 @@ class $AssetsImagesAndroidBumperBGen {
const AssetGenImage('assets/images/android_bumper/b/lit.png'); const AssetGenImage('assets/images/android_bumper/b/lit.png');
} }
class $AssetsImagesAndroidBumperCowGen {
const $AssetsImagesAndroidBumperCowGen();
/// File path: assets/images/android_bumper/cow/dimmed.png
AssetGenImage get dimmed =>
const AssetGenImage('assets/images/android_bumper/cow/dimmed.png');
/// File path: assets/images/android_bumper/cow/lit.png
AssetGenImage get lit =>
const AssetGenImage('assets/images/android_bumper/cow/lit.png');
}
class $AssetsImagesDashBumperGen { class $AssetsImagesDashBumperGen {
const $AssetsImagesDashBumperGen(); const $AssetsImagesDashBumperGen();

@ -19,6 +19,7 @@ class AndroidBumper extends BodyComponent with InitialPosition {
required double minorRadius, required double minorRadius,
required String litAssetPath, required String litAssetPath,
required String dimmedAssetPath, required String dimmedAssetPath,
required Vector2 spritePosition,
Iterable<Component>? children, Iterable<Component>? children,
required this.bloc, required this.bloc,
}) : _majorRadius = majorRadius, }) : _majorRadius = majorRadius,
@ -32,6 +33,7 @@ class AndroidBumper extends BodyComponent with InitialPosition {
_AndroidBumperSpriteGroupComponent( _AndroidBumperSpriteGroupComponent(
dimmedAssetPath: dimmedAssetPath, dimmedAssetPath: dimmedAssetPath,
litAssetPath: litAssetPath, litAssetPath: litAssetPath,
position: spritePosition,
state: bloc.state, state: bloc.state,
), ),
...?children, ...?children,
@ -46,6 +48,7 @@ class AndroidBumper extends BodyComponent with InitialPosition {
minorRadius: 2.97, minorRadius: 2.97,
litAssetPath: Assets.images.androidBumper.a.lit.keyName, litAssetPath: Assets.images.androidBumper.a.lit.keyName,
dimmedAssetPath: Assets.images.androidBumper.a.dimmed.keyName, dimmedAssetPath: Assets.images.androidBumper.a.dimmed.keyName,
spritePosition: Vector2(0, -0.1),
bloc: AndroidBumperCubit(), bloc: AndroidBumperCubit(),
children: children, children: children,
); );
@ -58,6 +61,20 @@ class AndroidBumper extends BodyComponent with InitialPosition {
minorRadius: 2.79, minorRadius: 2.79,
litAssetPath: Assets.images.androidBumper.b.lit.keyName, litAssetPath: Assets.images.androidBumper.b.lit.keyName,
dimmedAssetPath: Assets.images.androidBumper.b.dimmed.keyName, dimmedAssetPath: Assets.images.androidBumper.b.dimmed.keyName,
spritePosition: Vector2(0, -0.1),
bloc: AndroidBumperCubit(),
children: children,
);
/// {@macro android_bumper}
AndroidBumper.cow({
Iterable<Component>? children,
}) : this._(
majorRadius: 3.4,
minorRadius: 2.9,
litAssetPath: Assets.images.androidBumper.cow.lit.keyName,
dimmedAssetPath: Assets.images.androidBumper.cow.dimmed.keyName,
spritePosition: Vector2(0, -0.68),
bloc: AndroidBumperCubit(), bloc: AndroidBumperCubit(),
children: children, children: children,
); );
@ -113,12 +130,13 @@ class _AndroidBumperSpriteGroupComponent
_AndroidBumperSpriteGroupComponent({ _AndroidBumperSpriteGroupComponent({
required String litAssetPath, required String litAssetPath,
required String dimmedAssetPath, required String dimmedAssetPath,
required Vector2 position,
required AndroidBumperState state, required AndroidBumperState state,
}) : _litAssetPath = litAssetPath, }) : _litAssetPath = litAssetPath,
_dimmedAssetPath = dimmedAssetPath, _dimmedAssetPath = dimmedAssetPath,
super( super(
anchor: Anchor.center, anchor: Anchor.center,
position: Vector2(0, -0.1), position: position,
current: state, current: state,
); );

@ -5,7 +5,7 @@ import 'package:bloc/bloc.dart';
part 'android_bumper_state.dart'; part 'android_bumper_state.dart';
class AndroidBumperCubit extends Cubit<AndroidBumperState> { class AndroidBumperCubit extends Cubit<AndroidBumperState> {
AndroidBumperCubit() : super(AndroidBumperState.dimmed); AndroidBumperCubit() : super(AndroidBumperState.lit);
void onBallContacted() { void onBallContacted() {
emit(AndroidBumperState.dimmed); emit(AndroidBumperState.dimmed);

@ -1,4 +1,5 @@
import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart';
import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_flame/pinball_flame.dart';
/// {@template bumping_behavior} /// {@template bumping_behavior}
@ -11,15 +12,22 @@ class BumpingBehavior extends ContactBehavior {
/// Determines how strong the bump is. /// Determines how strong the bump is.
final double _strength; final double _strength;
/// This is used to recoginze the current state of a contact manifold in world
/// coordinates.
@visibleForTesting
final WorldManifold worldManifold = WorldManifold();
@override @override
void postSolve(Object other, Contact contact, ContactImpulse impulse) { void postSolve(Object other, Contact contact, ContactImpulse impulse) {
super.postSolve(other, contact, impulse); super.postSolve(other, contact, impulse);
if (other is! BodyComponent) return; if (other is! BodyComponent) return;
contact.getWorldManifold(worldManifold);
other.body.applyLinearImpulse( other.body.applyLinearImpulse(
contact.manifold.localPoint worldManifold.normal
..normalize() ..multiply(
..multiply(Vector2.all(other.body.mass * _strength)), Vector2.all(other.body.mass * _strength),
),
); );
} }
} }

@ -66,6 +66,7 @@ flutter:
- assets/images/slingshot/ - assets/images/slingshot/
- assets/images/android_bumper/a/ - assets/images/android_bumper/a/
- assets/images/android_bumper/b/ - assets/images/android_bumper/b/
- assets/images/android_bumper/cow/
- assets/images/sparky/ - assets/images/sparky/
- assets/images/sparky/computer/ - assets/images/sparky/computer/
- assets/images/sparky/bumper/a/ - assets/images/sparky/bumper/a/

@ -0,0 +1,33 @@
import 'dart:async';
import 'package:flame/extensions.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class AndroidBumperCowGame extends BallGame {
AndroidBumperCowGame()
: super(
imagesFileNames: [
Assets.images.androidBumper.cow.lit.keyName,
Assets.images.androidBumper.cow.dimmed.keyName,
],
);
static const description = '''
Shows how a AndroidBumper.cow is rendered.
- Activate the "trace" parameter to overlay the body.
''';
@override
Future<void> onLoad() async {
await super.onLoad();
camera.followVector2(Vector2.zero());
await add(
AndroidBumper.cow()..priority = 1,
);
await traceAllBodies();
}
}

@ -2,6 +2,7 @@ import 'package:dashbook/dashbook.dart';
import 'package:sandbox/common/common.dart'; import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/android_acres/android_bumper_a_game.dart'; import 'package:sandbox/stories/android_acres/android_bumper_a_game.dart';
import 'package:sandbox/stories/android_acres/android_bumper_b_game.dart'; import 'package:sandbox/stories/android_acres/android_bumper_b_game.dart';
import 'package:sandbox/stories/android_acres/android_bumper_cow_game.dart';
import 'package:sandbox/stories/android_acres/spaceship_game.dart'; import 'package:sandbox/stories/android_acres/spaceship_game.dart';
import 'package:sandbox/stories/android_acres/spaceship_rail_game.dart'; import 'package:sandbox/stories/android_acres/spaceship_rail_game.dart';
import 'package:sandbox/stories/android_acres/spaceship_ramp_game.dart'; import 'package:sandbox/stories/android_acres/spaceship_ramp_game.dart';
@ -18,6 +19,11 @@ void addAndroidAcresStories(Dashbook dashbook) {
description: AndroidBumperBGame.description, description: AndroidBumperBGame.description,
gameBuilder: (_) => AndroidBumperBGame(), gameBuilder: (_) => AndroidBumperBGame(),
) )
..addGame(
title: 'Android Bumper Cow',
description: AndroidBumperCowGame.description,
gameBuilder: (_) => AndroidBumperCowGame(),
)
..addGame( ..addGame(
title: 'Spaceship', title: 'Spaceship',
description: SpaceshipGame.description, description: SpaceshipGame.description,

@ -17,6 +17,8 @@ void main() {
Assets.images.androidBumper.a.dimmed.keyName, Assets.images.androidBumper.a.dimmed.keyName,
Assets.images.androidBumper.b.lit.keyName, Assets.images.androidBumper.b.lit.keyName,
Assets.images.androidBumper.b.dimmed.keyName, Assets.images.androidBumper.b.dimmed.keyName,
Assets.images.androidBumper.cow.lit.keyName,
Assets.images.androidBumper.cow.dimmed.keyName,
]; ];
final flameTester = FlameTester(() => TestGame(assets)); final flameTester = FlameTester(() => TestGame(assets));
@ -33,6 +35,12 @@ void main() {
expect(game.contains(androidBumper), isTrue); expect(game.contains(androidBumper), isTrue);
}); });
flameTester.test('"cow" loads correctly', (game) async {
final androidBumper = AndroidBumper.cow();
await game.ensureAdd(androidBumper);
expect(game.contains(androidBumper), isTrue);
});
// TODO(alestiago): Consider refactoring once the following is merged: // TODO(alestiago): Consider refactoring once the following is merged:
// https://github.com/flame-engine/flame/pull/1538 // https://github.com/flame-engine/flame/pull/1538
// ignore: public_member_api_docs // ignore: public_member_api_docs

@ -7,22 +7,16 @@ import 'package:mocktail/mocktail.dart';
import 'package:pinball_components/src/components/bumping_behavior.dart'; import 'package:pinball_components/src/components/bumping_behavior.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
import 'layer_test.dart';
class MockContactImpulse extends Mock implements ContactImpulse {} class _MockContact extends Mock implements Contact {}
class MockManifold extends Mock implements Manifold {} class _MockContactImpulse extends Mock implements ContactImpulse {}
class TestHeavyBodyComponent extends BodyComponent { class _TestBodyComponent extends BodyComponent {
@override @override
Body createBody() { Body createBody() => world.createBody(
final shape = CircleShape(); BodyDef(type: BodyType.dynamic),
return world.createBody( )..createFixtureFromShape(CircleShape(), 1);
BodyDef(
type: BodyType.dynamic,
),
)..createFixtureFromShape(shape, 20);
}
} }
void main() { void main() {
@ -32,7 +26,7 @@ void main() {
group('BumpingBehavior', () { group('BumpingBehavior', () {
flameTester.test('can be added', (game) async { flameTester.test('can be added', (game) async {
final behavior = BumpingBehavior(strength: 0); final behavior = BumpingBehavior(strength: 0);
final component = TestBodyComponent(); final component = _TestBodyComponent();
await component.add(behavior); await component.add(behavior);
await game.ensureAdd(component); await game.ensureAdd(component);
}); });
@ -40,16 +34,18 @@ void main() {
flameTester.testGameWidget( flameTester.testGameWidget(
'the bump is greater when the strengh is greater', 'the bump is greater when the strengh is greater',
setUp: (game, tester) async { setUp: (game, tester) async {
final component1 = TestBodyComponent(); final component1 = _TestBodyComponent();
final behavior1 = BumpingBehavior(strength: 1); final behavior1 = BumpingBehavior(strength: 1)
..worldManifold.normal.setFrom(Vector2.all(1));
await component1.add(behavior1); await component1.add(behavior1);
final component2 = TestBodyComponent(); final component2 = _TestBodyComponent();
final behavior2 = BumpingBehavior(strength: 2); final behavior2 = BumpingBehavior(strength: 2)
..worldManifold.normal.setFrom(Vector2.all(1));
await component2.add(behavior2); await component2.add(behavior2);
final dummy1 = TestHeavyBodyComponent(); final dummy1 = _TestBodyComponent();
final dummy2 = TestHeavyBodyComponent(); final dummy2 = _TestBodyComponent();
await game.ensureAddAll([ await game.ensureAddAll([
component1, component1,
@ -58,14 +54,8 @@ void main() {
dummy2, dummy2,
]); ]);
expect(dummy1.body.inverseMass, greaterThan(0)); final contact = _MockContact();
expect(dummy2.body.inverseMass, greaterThan(0)); final contactImpulse = _MockContactImpulse();
final contact = MockContact();
final manifold = MockManifold();
final contactImpulse = MockContactImpulse();
when(() => manifold.localPoint).thenReturn(Vector2.all(1));
when(() => contact.manifold).thenReturn(manifold);
behavior1.postSolve(dummy1, contact, contactImpulse); behavior1.postSolve(dummy1, contact, contactImpulse);
behavior2.postSolve(dummy2, contact, contactImpulse); behavior2.postSolve(dummy2, contact, contactImpulse);

@ -27,6 +27,8 @@ void main() {
Assets.images.androidBumper.a.dimmed.keyName, Assets.images.androidBumper.a.dimmed.keyName,
Assets.images.androidBumper.b.lit.keyName, Assets.images.androidBumper.b.lit.keyName,
Assets.images.androidBumper.b.dimmed.keyName, Assets.images.androidBumper.b.dimmed.keyName,
Assets.images.androidBumper.cow.lit.keyName,
Assets.images.androidBumper.cow.dimmed.keyName,
]; ];
final flameTester = FlameTester( final flameTester = FlameTester(
() => EmptyPinballTestGame(assets: assets), () => EmptyPinballTestGame(assets: assets),
@ -73,7 +75,7 @@ void main() {
); );
flameTester.test( flameTester.test(
'two AndroidBumper', 'three AndroidBumper',
(game) async { (game) async {
final androidZone = AndroidAcres(); final androidZone = AndroidAcres();
await game.addFromBlueprint(androidZone); await game.addFromBlueprint(androidZone);
@ -81,7 +83,7 @@ void main() {
expect( expect(
game.descendants().whereType<AndroidBumper>().length, game.descendants().whereType<AndroidBumper>().length,
equals(2), equals(3),
); );
}, },
); );

@ -19,6 +19,8 @@ void main() {
Assets.images.androidBumper.a.dimmed.keyName, Assets.images.androidBumper.a.dimmed.keyName,
Assets.images.androidBumper.b.lit.keyName, Assets.images.androidBumper.b.lit.keyName,
Assets.images.androidBumper.b.dimmed.keyName, Assets.images.androidBumper.b.dimmed.keyName,
Assets.images.androidBumper.cow.lit.keyName,
Assets.images.androidBumper.cow.dimmed.keyName,
Assets.images.backboard.backboardScores.keyName, Assets.images.backboard.backboardScores.keyName,
Assets.images.backboard.backboardGameOver.keyName, Assets.images.backboard.backboardGameOver.keyName,
Assets.images.backboard.display.keyName, Assets.images.backboard.display.keyName,

Loading…
Cancel
Save