feat: Flipper joint adjustment (#159)

* feat(sandbox): removed FlipperTracingGame

* feat: adjusted flipper anchor

* refacto: adjusted anchoring points

* refactor: removed unused import

* refactor: renamed FlipperGame
pull/162/head
Alejandro Santiago 4 years ago committed by GitHub
parent daebb0b749
commit d86ef40cb9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -129,8 +129,8 @@ class PlungerAnchor extends JointAnchor {
required Plunger plunger, required Plunger plunger,
}) { }) {
initialPosition = Vector2( initialPosition = Vector2(
plunger.body.position.x, 0,
plunger.body.position.y - plunger.compressionDistance, -plunger.compressionDistance,
); );
} }
@ -161,7 +161,7 @@ class PlungerAnchorPrismaticJointDef extends PrismaticJointDef {
initialize( initialize(
plunger.body, plunger.body,
anchor.body, anchor.body,
anchor.body.position, plunger.body.position + anchor.body.position,
Vector2(18.6, BoardDimensions.bounds.height), Vector2(18.6, BoardDimensions.bounds.height),
); );
enableLimit = true; enableLimit = true;

@ -23,7 +23,7 @@ class ChromeDino extends BodyComponent with InitialPosition {
/// Anchors the [ChromeDino] to the [RevoluteJoint] that controls its arc /// Anchors the [ChromeDino] to the [RevoluteJoint] that controls its arc
/// motion. /// motion.
Future<_ChromeDinoJoint> _anchorToJoint() async { Future<_ChromeDinoJoint> _anchorToJoint() async {
final anchor = _ChromeDinoAnchor(chromeDino: this); final anchor = _ChromeDinoAnchor();
await add(anchor); await add(anchor);
final jointDef = _ChromeDinoAnchorRevoluteJointDef( final jointDef = _ChromeDinoAnchorRevoluteJointDef(
@ -110,12 +110,10 @@ class ChromeDino extends BodyComponent with InitialPosition {
/// {@endtemplate} /// {@endtemplate}
class _ChromeDinoAnchor extends JointAnchor { class _ChromeDinoAnchor extends JointAnchor {
/// {@macro flipper_anchor} /// {@macro flipper_anchor}
_ChromeDinoAnchor({ _ChromeDinoAnchor() {
required ChromeDino chromeDino,
}) {
initialPosition = Vector2( initialPosition = Vector2(
chromeDino.body.position.x + ChromeDino.size.x / 2, ChromeDino.size.x / 2,
chromeDino.body.position.y, 0,
); );
} }
} }
@ -132,7 +130,7 @@ class _ChromeDinoAnchorRevoluteJointDef extends RevoluteJointDef {
initialize( initialize(
chromeDino.body, chromeDino.body,
anchor.body, anchor.body,
anchor.body.position, chromeDino.body.position + anchor.body.position,
); );
enableLimit = true; enableLimit = true;
// TODO(alestiago): Apply design angle value. // TODO(alestiago): Apply design angle value.

@ -159,8 +159,9 @@ class _FlipperAnchor extends JointAnchor {
required Flipper flipper, required Flipper flipper,
}) { }) {
initialPosition = Vector2( initialPosition = Vector2(
flipper.body.position.x + ((Flipper.size.x * flipper.side.direction) / 2), (Flipper.size.x * flipper.side.direction) / 2 -
flipper.body.position.y, (1.65 * flipper.side.direction),
0.15,
); );
} }
} }
@ -178,7 +179,7 @@ class _FlipperAnchorRevoluteJointDef extends RevoluteJointDef {
initialize( initialize(
flipper.body, flipper.body,
anchor.body, anchor.body,
anchor.body.position, flipper.body.position + anchor.body.position,
); );
} }

@ -12,7 +12,7 @@ import 'package:pinball_components/pinball_components.dart';
/// initialize( /// initialize(
/// dynamicBody.body, /// dynamicBody.body,
/// anchor.body, /// anchor.body,
/// anchor.body.position, /// dynabmicBody.body + anchor.body.position,
/// ); /// );
/// ``` /// ```
/// {@endtemplate} /// {@endtemplate}

@ -3,6 +3,7 @@ import 'dart:async';
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pinball_components/pinball_components.dart';
extension BodyTrace on BodyComponent { extension BodyTrace on BodyComponent {
void trace({Color color = const Color(0xFFFF0000)}) { void trace({Color color = const Color(0xFFFF0000)}) {
@ -13,6 +14,12 @@ extension BodyTrace on BodyComponent {
mounted.whenComplete(() { mounted.whenComplete(() {
final sprite = children.whereType<SpriteComponent>().first; final sprite = children.whereType<SpriteComponent>().first;
sprite.paint.color = sprite.paint.color.withOpacity(0.5); sprite.paint.color = sprite.paint.color.withOpacity(0.5);
descendants().whereType<JointAnchor>().forEach((anchor) {
final fixtureDef = FixtureDef(CircleShape()..radius = 0.5);
anchor.body.createFixture(fixtureDef);
anchor.renderBody = true;
});
}), }),
); );
} }

@ -2,13 +2,23 @@ import 'package:flame/input.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart'; import 'package:sandbox/stories/ball/basic_ball_game.dart';
class BasicFlipperGame extends BasicBallGame with KeyboardEvents { class FlipperGame extends BasicBallGame with KeyboardEvents {
BasicFlipperGame() : super(color: Colors.blue); FlipperGame({
required this.trace,
}) : super(color: Colors.blue);
static const info = 'Shows how a Flipper works.'; static const info = '''
Shows how Flippers are rendered.
- Activate the "trace" parameter to overlay the body.
- Tap anywhere on the screen to spawn a ball into the game.
- Press left arrow key or "A" to move the left flipper.
- Press right arrow key or "D" to move the right flipper.
''';
static const _leftFlipperKeys = [ static const _leftFlipperKeys = [
LogicalKeyboardKey.arrowLeft, LogicalKeyboardKey.arrowLeft,
@ -20,6 +30,8 @@ class BasicFlipperGame extends BasicBallGame with KeyboardEvents {
LogicalKeyboardKey.keyD, LogicalKeyboardKey.keyD,
]; ];
final bool trace;
late Flipper leftFlipper; late Flipper leftFlipper;
late Flipper rightFlipper; late Flipper rightFlipper;
@ -38,6 +50,11 @@ class BasicFlipperGame extends BasicBallGame with KeyboardEvents {
leftFlipper, leftFlipper,
rightFlipper, rightFlipper,
]); ]);
if (trace) {
leftFlipper.trace();
rightFlipper.trace();
}
} }
@override @override

@ -1,26 +0,0 @@
import 'dart:async';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/flipper/basic_flipper_game.dart';
class FlipperTracingGame extends BasicFlipperGame {
static const info = '''
Basic example of how the Flipper body overlays the sprite.
''';
@override
Future<void> onLoad() async {
await super.onLoad();
leftFlipper.trace();
leftFlipper.body.joints.whereType<RevoluteJoint>().forEach(
(joint) => joint.setLimits(0, 0),
);
rightFlipper.trace();
rightFlipper.body.joints.whereType<RevoluteJoint>().forEach(
(joint) => joint.setLimits(0, 0),
);
}
}

@ -1,25 +1,17 @@
import 'package:dashbook/dashbook.dart'; import 'package:dashbook/dashbook.dart';
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:sandbox/common/common.dart'; import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/flipper/basic_flipper_game.dart'; import 'package:sandbox/stories/flipper/flipper_game.dart';
import 'package:sandbox/stories/flipper/flipper_tracing_game.dart';
void addFlipperStories(Dashbook dashbook) { void addFlipperStories(Dashbook dashbook) {
dashbook.storiesOf('Flipper') dashbook.storiesOf('Flipper').add(
..add(
'Basic', 'Basic',
(context) => GameWidget( (context) => GameWidget(
game: BasicFlipperGame(), game: FlipperGame(
trace: context.boolProperty('Trace', true),
), ),
codeLink: buildSourceLink('flipper/basic.dart'),
info: BasicFlipperGame.info,
)
..add(
'Tracing',
(context) => GameWidget(
game: FlipperTracingGame(),
), ),
codeLink: buildSourceLink('flipper/tracing.dart'), codeLink: buildSourceLink('flipper/basic.dart'),
info: FlipperTracingGame.info, info: FlipperGame.info,
); );
} }

Loading…
Cancel
Save