mirror of https://github.com/flutter/pinball.git
fix: flying ball when entering SpaceshipRamp (#380)
parent
e20c231f51
commit
0534e2dd84
@ -1,10 +1,11 @@
|
||||
library pinball_flame;
|
||||
|
||||
export 'src/behaviors/behaviors.dart';
|
||||
export 'src/canvas/canvas.dart';
|
||||
export 'src/component_controller.dart';
|
||||
export 'src/contact_behavior.dart';
|
||||
export 'src/flame_provider.dart';
|
||||
export 'src/keyboard_input_controller.dart';
|
||||
export 'src/layer.dart';
|
||||
export 'src/parent_is_a.dart';
|
||||
export 'src/pinball_forge2d_game.dart';
|
||||
export 'src/sprite_animation.dart';
|
||||
|
@ -0,0 +1,3 @@
|
||||
export 'contact_behavior.dart';
|
||||
export 'layer_contact_behavior.dart';
|
||||
export 'z_index_contact_behavior.dart';
|
@ -0,0 +1,20 @@
|
||||
import 'package:flame_forge2d/flame_forge2d.dart';
|
||||
import 'package:pinball_flame/pinball_flame.dart';
|
||||
|
||||
/// {@template layer_contact_behavior}
|
||||
/// Switches the [Layer] of any [Layered] body that contacts with it.
|
||||
/// {@endtemplate}
|
||||
class LayerContactBehavior extends ContactBehavior<BodyComponent> {
|
||||
/// {@macro layer_contact_behavior}
|
||||
LayerContactBehavior({required Layer layer}) : _layer = layer;
|
||||
|
||||
final Layer _layer;
|
||||
|
||||
@override
|
||||
void beginContact(Object other, Contact contact) {
|
||||
super.beginContact(other, contact);
|
||||
if (other is! Layered) return;
|
||||
if (other.layer == _layer) return;
|
||||
other.layer = _layer;
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
import 'package:flame_forge2d/flame_forge2d.dart';
|
||||
import 'package:pinball_flame/pinball_flame.dart';
|
||||
|
||||
/// {@template layer_contact_behavior}
|
||||
/// Switches the z-index of any [ZIndex] body that contacts with it.
|
||||
/// {@endtemplate}
|
||||
class ZIndexContactBehavior extends ContactBehavior<BodyComponent> {
|
||||
/// {@macro layer_contact_behavior}
|
||||
ZIndexContactBehavior({required int zIndex}) : _zIndex = zIndex;
|
||||
|
||||
final int _zIndex;
|
||||
|
||||
@override
|
||||
void beginContact(Object other, Contact contact) {
|
||||
super.beginContact(other, contact);
|
||||
if (other is! ZIndex) return;
|
||||
if (other.zIndex == _zIndex) return;
|
||||
other.zIndex = _zIndex;
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
// 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:mocktail/mocktail.dart';
|
||||
import 'package:pinball_flame/pinball_flame.dart';
|
||||
|
||||
class _TestBodyComponent extends BodyComponent {
|
||||
@override
|
||||
Body createBody() {
|
||||
final shape = CircleShape()..radius = 1;
|
||||
return world.createBody(BodyDef())..createFixtureFromShape(shape);
|
||||
}
|
||||
}
|
||||
|
||||
class _TestLayeredBodyComponent extends _TestBodyComponent with Layered {
|
||||
_TestLayeredBodyComponent({required Layer layer}) {
|
||||
layer = layer;
|
||||
}
|
||||
}
|
||||
|
||||
class _MockContact extends Mock implements Contact {}
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
final flameTester = FlameTester(Forge2DGame.new);
|
||||
|
||||
group('LayerContactBehavior', () {
|
||||
test('can be instantiated', () {
|
||||
expect(
|
||||
LayerContactBehavior(layer: Layer.all),
|
||||
isA<LayerContactBehavior>(),
|
||||
);
|
||||
});
|
||||
|
||||
flameTester.test('can be loaded', (game) async {
|
||||
final behavior = LayerContactBehavior(layer: Layer.all);
|
||||
final parent = _TestBodyComponent();
|
||||
await game.ensureAdd(parent);
|
||||
await parent.ensureAdd(behavior);
|
||||
expect(parent.children, contains(behavior));
|
||||
});
|
||||
|
||||
flameTester.test('beginContact changes layer', (game) async {
|
||||
const oldLayer = Layer.all;
|
||||
const newLayer = Layer.board;
|
||||
final behavior = LayerContactBehavior(layer: newLayer);
|
||||
final parent = _TestBodyComponent();
|
||||
await game.ensureAdd(parent);
|
||||
await parent.ensureAdd(behavior);
|
||||
|
||||
final component = _TestLayeredBodyComponent(layer: oldLayer);
|
||||
|
||||
behavior.beginContact(component, _MockContact());
|
||||
|
||||
expect(component.layer, newLayer);
|
||||
});
|
||||
});
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
// 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:mocktail/mocktail.dart';
|
||||
import 'package:pinball_flame/pinball_flame.dart';
|
||||
|
||||
class _TestBodyComponent extends BodyComponent {
|
||||
@override
|
||||
Body createBody() {
|
||||
final shape = CircleShape()..radius = 1;
|
||||
return world.createBody(BodyDef())..createFixtureFromShape(shape);
|
||||
}
|
||||
}
|
||||
|
||||
class _TestZIndexBodyComponent extends _TestBodyComponent with ZIndex {
|
||||
_TestZIndexBodyComponent({required int zIndex}) {
|
||||
zIndex = zIndex;
|
||||
}
|
||||
}
|
||||
|
||||
class _MockContact extends Mock implements Contact {}
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
final flameTester = FlameTester(Forge2DGame.new);
|
||||
|
||||
group('ZIndexContactBehavior', () {
|
||||
test('can be instantiated', () {
|
||||
expect(
|
||||
ZIndexContactBehavior(zIndex: 0),
|
||||
isA<ZIndexContactBehavior>(),
|
||||
);
|
||||
});
|
||||
|
||||
flameTester.test('can be loaded', (game) async {
|
||||
final behavior = ZIndexContactBehavior(zIndex: 0);
|
||||
final parent = _TestBodyComponent();
|
||||
await game.ensureAdd(parent);
|
||||
await parent.ensureAdd(behavior);
|
||||
expect(parent.children, contains(behavior));
|
||||
});
|
||||
|
||||
flameTester.test('beginContact changes zIndex', (game) async {
|
||||
const oldIndex = 0;
|
||||
const newIndex = 1;
|
||||
final behavior = ZIndexContactBehavior(zIndex: newIndex);
|
||||
final parent = _TestBodyComponent();
|
||||
await game.ensureAdd(parent);
|
||||
await parent.ensureAdd(behavior);
|
||||
|
||||
final component = _TestZIndexBodyComponent(zIndex: oldIndex);
|
||||
|
||||
behavior.beginContact(component, _MockContact());
|
||||
|
||||
expect(component.zIndex, newIndex);
|
||||
});
|
||||
});
|
||||
}
|
Loading…
Reference in new issue