|
|
@ -9,7 +9,7 @@ import 'package:flutter/services.dart';
|
|
|
|
import 'package:pinball/game/game.dart';
|
|
|
|
import 'package:pinball/game/game.dart';
|
|
|
|
|
|
|
|
|
|
|
|
/// {@template flipper_group}
|
|
|
|
/// {@template flipper_group}
|
|
|
|
///
|
|
|
|
/// Adds a [Flipper.right] and a [Flipper.left].
|
|
|
|
/// {@endtemplate}
|
|
|
|
/// {@endtemplate}
|
|
|
|
class FlipperGroup extends PositionComponent with HasGameRef<PinballGame> {
|
|
|
|
class FlipperGroup extends PositionComponent with HasGameRef<PinballGame> {
|
|
|
|
/// @macro {flipper_group}
|
|
|
|
/// @macro {flipper_group}
|
|
|
@ -30,17 +30,6 @@ class FlipperGroup extends PositionComponent with HasGameRef<PinballGame> {
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
);
|
|
|
|
await add(leftFlipper);
|
|
|
|
await add(leftFlipper);
|
|
|
|
final leftFlipperAnchor = FlipperAnchor(flipper: leftFlipper);
|
|
|
|
|
|
|
|
await add(leftFlipperAnchor);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final leftFlipperRevoluteJointDef = FlipperAnchorRevoluteJointDef(
|
|
|
|
|
|
|
|
flipper: leftFlipper,
|
|
|
|
|
|
|
|
anchor: leftFlipperAnchor,
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
// TODO(alestiago): Remove casting once the following is closed:
|
|
|
|
|
|
|
|
// https://github.com/flame-engine/forge2d/issues/36
|
|
|
|
|
|
|
|
final leftFlipperRevoluteJoint =
|
|
|
|
|
|
|
|
gameRef.world.createJoint(leftFlipperRevoluteJointDef) as RevoluteJoint;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final rightFlipper = Flipper.right(
|
|
|
|
final rightFlipper = Flipper.right(
|
|
|
|
position: Vector2(
|
|
|
|
position: Vector2(
|
|
|
@ -49,37 +38,6 @@ class FlipperGroup extends PositionComponent with HasGameRef<PinballGame> {
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
);
|
|
|
|
await add(rightFlipper);
|
|
|
|
await add(rightFlipper);
|
|
|
|
final rightFlipperAnchor = FlipperAnchor(flipper: rightFlipper);
|
|
|
|
|
|
|
|
await add(rightFlipperAnchor);
|
|
|
|
|
|
|
|
final rightFlipperRevoluteJointDef = FlipperAnchorRevoluteJointDef(
|
|
|
|
|
|
|
|
flipper: rightFlipper,
|
|
|
|
|
|
|
|
anchor: rightFlipperAnchor,
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
// TODO(alestiago): Remove casting once the following is closed:
|
|
|
|
|
|
|
|
// https://github.com/flame-engine/forge2d/issues/36
|
|
|
|
|
|
|
|
final rightFlipperRevoluteJoint = gameRef.world
|
|
|
|
|
|
|
|
.createJoint(rightFlipperRevoluteJointDef) as RevoluteJoint;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO(erickzanardo): Clean this once the issue is solved:
|
|
|
|
|
|
|
|
// https://github.com/flame-engine/flame/issues/1417
|
|
|
|
|
|
|
|
// FIXME(erickzanardo): when mounted the initial position is not fully
|
|
|
|
|
|
|
|
// reached.
|
|
|
|
|
|
|
|
unawaited(
|
|
|
|
|
|
|
|
leftFlipper.hasMounted.future.whenComplete(
|
|
|
|
|
|
|
|
() => FlipperAnchorRevoluteJointDef.unlock(
|
|
|
|
|
|
|
|
leftFlipperRevoluteJoint,
|
|
|
|
|
|
|
|
leftFlipper.side,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
unawaited(
|
|
|
|
|
|
|
|
rightFlipper.hasMounted.future.whenComplete(
|
|
|
|
|
|
|
|
() => FlipperAnchorRevoluteJointDef.unlock(
|
|
|
|
|
|
|
|
rightFlipperRevoluteJoint,
|
|
|
|
|
|
|
|
rightFlipper.side,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -152,9 +110,31 @@ class Flipper extends PositionBodyComponent with KeyboardHandler {
|
|
|
|
/// [onKeyEvent] method listens to when one of these keys is pressed.
|
|
|
|
/// [onKeyEvent] method listens to when one of these keys is pressed.
|
|
|
|
final List<LogicalKeyboardKey> _keys;
|
|
|
|
final List<LogicalKeyboardKey> _keys;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
late final RevoluteJoint _joint;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Applies downward linear velocity to the [Flipper], moving it to its
|
|
|
|
|
|
|
|
/// resting position.
|
|
|
|
|
|
|
|
void _moveDown() {
|
|
|
|
|
|
|
|
body.linearVelocity = Vector2(0, -_speed);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Applies upward linear velocity to the [Flipper], moving it to its highest
|
|
|
|
|
|
|
|
/// position.
|
|
|
|
|
|
|
|
void _moveUp() {
|
|
|
|
|
|
|
|
body.linearVelocity = Vector2(0, _speed);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
Future<void> onLoad() async {
|
|
|
|
Future<void> onLoad() async {
|
|
|
|
await super.onLoad();
|
|
|
|
await super.onLoad();
|
|
|
|
|
|
|
|
await Future.wait([
|
|
|
|
|
|
|
|
_loadSprite(),
|
|
|
|
|
|
|
|
_anchorToJoint(),
|
|
|
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Loads the sprite that renders with the [Flipper].
|
|
|
|
|
|
|
|
Future<void> _loadSprite() async {
|
|
|
|
final sprite = await gameRef.loadSprite(spritePath);
|
|
|
|
final sprite = await gameRef.loadSprite(spritePath);
|
|
|
|
positionComponent = SpriteComponent(
|
|
|
|
positionComponent = SpriteComponent(
|
|
|
|
sprite: sprite,
|
|
|
|
sprite: sprite,
|
|
|
@ -166,16 +146,39 @@ class Flipper extends PositionBodyComponent with KeyboardHandler {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Applies downward linear velocity to the [Flipper], moving it to its
|
|
|
|
/// Anchors the [Flipper] to the [RevoluteJoint] that controls its arc motion.
|
|
|
|
/// resting position.
|
|
|
|
Future<void> _anchorToJoint() async {
|
|
|
|
void _moveDown() {
|
|
|
|
final anchor = FlipperAnchor(flipper: this);
|
|
|
|
body.linearVelocity = Vector2(0, -_speed);
|
|
|
|
await add(anchor);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final jointDef = FlipperAnchorRevoluteJointDef(
|
|
|
|
|
|
|
|
flipper: this,
|
|
|
|
|
|
|
|
anchor: anchor,
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
// TODO(alestiago): Remove casting once the following is closed:
|
|
|
|
|
|
|
|
// https://github.com/flame-engine/forge2d/issues/36
|
|
|
|
|
|
|
|
_joint = world.createJoint(jointDef) as RevoluteJoint;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// FIXME(erickzanardo): when mounted the initial position is not fully
|
|
|
|
|
|
|
|
// reached.
|
|
|
|
|
|
|
|
unawaited(
|
|
|
|
|
|
|
|
mounted.whenComplete(
|
|
|
|
|
|
|
|
() => FlipperAnchorRevoluteJointDef.unlock(_joint, side),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Applies upward linear velocity to the [Flipper], moving it to its highest
|
|
|
|
@override
|
|
|
|
/// position.
|
|
|
|
Body createBody() {
|
|
|
|
void _moveUp() {
|
|
|
|
final bodyDef = BodyDef()
|
|
|
|
body.linearVelocity = Vector2(0, _speed);
|
|
|
|
..gravityScale = 0
|
|
|
|
|
|
|
|
..type = BodyType.dynamic
|
|
|
|
|
|
|
|
..position = _position;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final body = world.createBody(bodyDef);
|
|
|
|
|
|
|
|
_createFixtureDefs().forEach(body.createFixture);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return body;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
List<FixtureDef> _createFixtureDefs() {
|
|
|
|
List<FixtureDef> _createFixtureDefs() {
|
|
|
@ -224,30 +227,6 @@ class Flipper extends PositionBodyComponent with KeyboardHandler {
|
|
|
|
return fixtures;
|
|
|
|
return fixtures;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
|
|
Body createBody() {
|
|
|
|
|
|
|
|
final bodyDef = BodyDef()
|
|
|
|
|
|
|
|
..gravityScale = 0
|
|
|
|
|
|
|
|
..type = BodyType.dynamic
|
|
|
|
|
|
|
|
..position = _position;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final body = world.createBody(bodyDef);
|
|
|
|
|
|
|
|
_createFixtureDefs().forEach(body.createFixture);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return body;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO(erickzanardo): Remove this once the issue is solved:
|
|
|
|
|
|
|
|
// https://github.com/flame-engine/flame/issues/1417
|
|
|
|
|
|
|
|
// ignore: public_member_api_docs
|
|
|
|
|
|
|
|
final Completer hasMounted = Completer<void>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
|
|
void onMount() {
|
|
|
|
|
|
|
|
super.onMount();
|
|
|
|
|
|
|
|
hasMounted.complete();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
bool onKeyEvent(
|
|
|
|
bool onKeyEvent(
|
|
|
|
RawKeyEvent event,
|
|
|
|
RawKeyEvent event,
|
|
|
|