fix: fixed merge conflicts at sandbox main

pull/166/head
RuiAlonso 4 years ago
commit 86fa769721

@ -13,7 +13,7 @@ on:
jobs: jobs:
build: build:
uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1 uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@b075749771679a5baa4c90d36ad2e8580bbf273b
with: with:
working_directory: packages/pinball_components working_directory: packages/pinball_components
coverage_excludes: "lib/gen/*.dart" coverage_excludes: "lib/gen/*.dart"

@ -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;

@ -0,0 +1,56 @@
import 'dart:async';
import 'package:flame/components.dart';
import 'package:flame/effects.dart';
import 'package:flutter/material.dart';
/// {@template camera_zoom}
/// Applies zoom to the camera of the game where this is added to
/// {@endtemplate}
class CameraZoom extends Effect with HasGameRef {
/// {@macro camera_zoom}
CameraZoom({
required this.value,
}) : super(
EffectController(
duration: 0.4,
curve: Curves.easeOut,
),
);
/// The total zoom value to be applied to the camera
final double value;
late final Tween<double> _tween;
final Completer<void> _completer = Completer();
@override
Future<void> onLoad() async {
_tween = Tween(
begin: gameRef.camera.zoom,
end: value,
);
}
@override
void apply(double progress) {
gameRef.camera.zoom = _tween.transform(progress);
}
/// Returns a [Future] that completes once the zoom is finished
Future<void> get completed {
if (controller.completed) {
return Future.value();
}
return _completer.future;
}
@override
void onRemove() {
_completer.complete();
super.onRemove();
}
}

@ -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.

@ -4,6 +4,7 @@ export 'baseboard.dart';
export 'board_dimensions.dart'; export 'board_dimensions.dart';
export 'board_side.dart'; export 'board_side.dart';
export 'boundaries.dart'; export 'boundaries.dart';
export 'camera_zoom.dart';
export 'chrome_dino.dart'; export 'chrome_dino.dart';
export 'dash_nest_bumper.dart'; export 'dash_nest_bumper.dart';
export 'dino_walls.dart'; export 'dino_walls.dart';

@ -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,7 +14,28 @@ 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;
});
}), }),
); );
} }
} }
mixin Traceable on Forge2DGame {
late final bool trace;
Future<void> traceAllBodies({
Color color = const Color(0xFFFF0000),
}) async {
if (trace) {
await ready();
children
.whereType<BodyComponent>()
.forEach((bodyComponent) => bodyComponent.trace());
}
}
}

@ -24,5 +24,6 @@ void main() {
addSlingshotStories(dashbook); addSlingshotStories(dashbook);
addSparkyBumperStories(dashbook); addSparkyBumperStories(dashbook);
addAlienBumperStories(dashbook); addAlienBumperStories(dashbook);
addZoomStories(dashbook);
runApp(dashbook); runApp(dashbook);
} }

@ -5,10 +5,8 @@ import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/common/common.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 BigDashNestBumperGame extends BasicBallGame { class BigDashNestBumperGame extends BasicBallGame with Traceable {
BigDashNestBumperGame({ BigDashNestBumperGame() : super(color: const Color(0xFF0000FF));
required this.trace,
}) : super(color: const Color(0xFF0000FF));
static const info = ''' static const info = '''
Shows how a BigDashNestBumper is rendered. Shows how a BigDashNestBumper is rendered.
@ -16,8 +14,6 @@ class BigDashNestBumperGame extends BasicBallGame {
Activate the "trace" parameter to overlay the body. Activate the "trace" parameter to overlay the body.
'''; ''';
final bool trace;
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
@ -28,6 +24,6 @@ class BigDashNestBumperGame extends BasicBallGame {
..priority = 1; ..priority = 1;
await add(bigDashNestBumper); await add(bigDashNestBumper);
if (trace) bigDashNestBumper.trace(); await traceAllBodies();
} }
} }

@ -8,9 +8,8 @@ void addDashNestBumperStories(Dashbook dashbook) {
dashbook.storiesOf('Dash Nest Bumpers').add( dashbook.storiesOf('Dash Nest Bumpers').add(
'Big', 'Big',
(context) => GameWidget( (context) => GameWidget(
game: BigDashNestBumperGame( game: BigDashNestBumperGame()
trace: context.boolProperty('Trace', true), ..trace = context.boolProperty('Trace', true),
),
), ),
codeLink: buildSourceLink('dash_nest_bumper/big.dart'), codeLink: buildSourceLink('dash_nest_bumper/big.dart'),
info: BasicBallGame.info, info: BasicBallGame.info,

@ -2,13 +2,21 @@ 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, Traceable {
BasicFlipperGame() : super(color: Colors.blue); FlipperGame() : 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,
@ -38,6 +46,8 @@ class BasicFlipperGame extends BasicBallGame with KeyboardEvents {
leftFlipper, leftFlipper,
rightFlipper, rightFlipper,
]); ]);
await traceAllBodies();
} }
@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,15 @@
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: FlipperGame()..trace = context.boolProperty('Trace', true),
game: BasicFlipperGame(), ),
), codeLink: buildSourceLink('flipper/basic.dart'),
codeLink: buildSourceLink('flipper/basic.dart'), info: FlipperGame.info,
info: BasicFlipperGame.info, );
)
..add(
'Tracing',
(context) => GameWidget(
game: FlipperTracingGame(),
),
codeLink: buildSourceLink('flipper/tracing.dart'),
info: FlipperTracingGame.info,
);
} }

@ -3,10 +3,8 @@ import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/common/common.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 KickerGame extends BasicBallGame { class KickerGame extends BasicBallGame with Traceable {
KickerGame({ KickerGame() : super(color: const Color(0xFFFF0000));
required this.trace,
}) : super(color: const Color(0xFFFF0000));
static const info = ''' static const info = '''
Shows how Kickers are rendered. Shows how Kickers are rendered.
@ -15,8 +13,6 @@ class KickerGame extends BasicBallGame {
- Tap anywhere on the screen to spawn a ball into the game. - Tap anywhere on the screen to spawn a ball into the game.
'''; ''';
final bool trace;
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
@ -31,9 +27,6 @@ class KickerGame extends BasicBallGame {
..initialPosition = Vector2(center.x + (Kicker.size.x * 2), center.y); ..initialPosition = Vector2(center.x + (Kicker.size.x * 2), center.y);
await add(rightKicker); await add(rightKicker);
if (trace) { await traceAllBodies();
leftKicker.trace();
rightKicker.trace();
}
} }
} }

@ -7,9 +7,7 @@ void addKickerStories(Dashbook dashbook) {
dashbook.storiesOf('Kickers').add( dashbook.storiesOf('Kickers').add(
'Basic', 'Basic',
(context) => GameWidget( (context) => GameWidget(
game: KickerGame( game: KickerGame()..trace = context.boolProperty('Trace', true),
trace: context.boolProperty('Trace', true),
),
), ),
codeLink: buildSourceLink('kicker_game/basic.dart'), codeLink: buildSourceLink('kicker_game/basic.dart'),
info: KickerGame.info, info: KickerGame.info,

@ -1,14 +1,10 @@
import 'dart:math' as math;
import 'package:flame/extensions.dart'; import 'package:flame/extensions.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/common/common.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 SlingshotGame extends BasicBallGame { class SlingshotGame extends BasicBallGame with Traceable {
SlingshotGame({ SlingshotGame() : super(color: const Color(0xFFFF0000));
required this.trace,
}) : super(color: const Color(0xFFFF0000));
static const info = ''' static const info = '''
Shows how Slingshots are rendered. Shows how Slingshots are rendered.
@ -17,50 +13,11 @@ class SlingshotGame extends BasicBallGame {
- Tap anywhere on the screen to spawn a ball into the game. - Tap anywhere on the screen to spawn a ball into the game.
'''; ''';
final bool trace;
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
await addFromBlueprint(Slingshots());
final center = screenToWorld(camera.viewport.canvasSize! / 2); camera.followVector2(Vector2.zero());
await traceAllBodies();
final leftUpperSlingshot = Slingshot(
length: 5.66,
angle: -1.5 * (math.pi / 180),
spritePath: Assets.images.slingshot.leftUpper.keyName,
)..initialPosition = center + Vector2(-29, 1.5);
final leftLowerSlingshot = Slingshot(
length: 3.54,
angle: -29.1 * (math.pi / 180),
spritePath: Assets.images.slingshot.leftLower.keyName,
)..initialPosition = center + Vector2(-31, -6.2);
final rightUpperSlingshot = Slingshot(
length: 5.64,
angle: 1 * (math.pi / 180),
spritePath: Assets.images.slingshot.rightUpper.keyName,
)..initialPosition = center + Vector2(22.3, 1.58);
final rightLowerSlingshot = Slingshot(
length: 3.46,
angle: 26.8 * (math.pi / 180),
spritePath: Assets.images.slingshot.rightLower.keyName,
)..initialPosition = center + Vector2(24.7, -6.2);
await addAll([
leftUpperSlingshot,
leftLowerSlingshot,
rightUpperSlingshot,
rightLowerSlingshot,
]);
if (trace) {
leftUpperSlingshot.trace();
leftLowerSlingshot.trace();
rightUpperSlingshot.trace();
rightLowerSlingshot.trace();
}
} }
} }

@ -7,9 +7,7 @@ void addSlingshotStories(Dashbook dashbook) {
dashbook.storiesOf('Slingshots').add( dashbook.storiesOf('Slingshots').add(
'Basic', 'Basic',
(context) => GameWidget( (context) => GameWidget(
game: SlingshotGame( game: SlingshotGame()..trace = context.boolProperty('Trace', true),
trace: context.boolProperty('Trace', true),
),
), ),
codeLink: buildSourceLink('slingshot_game/basic.dart'), codeLink: buildSourceLink('slingshot_game/basic.dart'),
info: SlingshotGame.info, info: SlingshotGame.info,

@ -5,10 +5,8 @@ import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/common/common.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 SparkyBumperGame extends BasicBallGame { class SparkyBumperGame extends BasicBallGame with Traceable {
SparkyBumperGame({ SparkyBumperGame() : super(color: const Color(0xFF0000FF));
required this.trace,
}) : super(color: const Color(0xFF0000FF));
static const info = ''' static const info = '''
Shows how a SparkyBumper is rendered. Shows how a SparkyBumper is rendered.
@ -16,8 +14,6 @@ class SparkyBumperGame extends BasicBallGame {
Activate the "trace" parameter to overlay the body. Activate the "trace" parameter to overlay the body.
'''; ''';
final bool trace;
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
@ -38,10 +34,6 @@ class SparkyBumperGame extends BasicBallGame {
sparkyBumperC, sparkyBumperC,
]); ]);
if (trace) { await traceAllBodies();
sparkyBumperA.trace();
sparkyBumperB.trace();
sparkyBumperC.trace();
}
} }
} }

@ -7,9 +7,7 @@ void addSparkyBumperStories(Dashbook dashbook) {
dashbook.storiesOf('Sparky Bumpers').add( dashbook.storiesOf('Sparky Bumpers').add(
'Basic', 'Basic',
(context) => GameWidget( (context) => GameWidget(
game: SparkyBumperGame( game: SparkyBumperGame()..trace = context.boolProperty('Trace', true),
trace: context.boolProperty('Trace', true),
),
), ),
codeLink: buildSourceLink('sparky_bumper/basic.dart'), codeLink: buildSourceLink('sparky_bumper/basic.dart'),
info: SparkyBumperGame.info, info: SparkyBumperGame.info,

@ -9,3 +9,4 @@ export 'layer/stories.dart';
export 'slingshot/stories.dart'; export 'slingshot/stories.dart';
export 'spaceship/stories.dart'; export 'spaceship/stories.dart';
export 'sparky_bumper/stories.dart'; export 'sparky_bumper/stories.dart';
export 'zoom/stories.dart';

@ -0,0 +1,37 @@
import 'package:flame/components.dart';
import 'package:flame/input.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/common/common.dart';
class BasicCameraZoomGame extends BasicGame with TapDetector {
static const info = '''
Simple game to demonstrate how the CameraZoom can be used.
Tap to zoom in/out
''';
bool zoomApplied = false;
@override
Future<void> onLoad() async {
final sprite = await loadSprite(Assets.images.flutterSignPost.keyName);
await add(
SpriteComponent(
sprite: sprite,
size: Vector2(4, 8),
anchor: Anchor.center,
),
);
camera.followVector2(Vector2.zero());
}
@override
void onTap() {
if (firstChild<CameraZoom>() == null) {
final zoom = CameraZoom(value: zoomApplied ? 30 : 10);
add(zoom);
zoomApplied = !zoomApplied;
}
}
}

@ -0,0 +1,15 @@
import 'package:dashbook/dashbook.dart';
import 'package:flame/game.dart';
import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/zoom/basic_zoom_game.dart';
void addZoomStories(Dashbook dashbook) {
dashbook.storiesOf('CameraZoom').add(
'Basic',
(context) => GameWidget(
game: BasicCameraZoomGame(),
),
codeLink: buildSourceLink('zoom/basic_zoom_game.dart'),
info: BasicCameraZoomGame.info,
);
}

@ -0,0 +1,85 @@
// ignore_for_file: cascade_invocations
import 'package:flame/components.dart';
import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball_components/pinball_components.dart';
import '../../helpers/helpers.dart';
void main() {
group('CameraZoom', () {
final tester = FlameTester(TestGame.new);
tester.testGameWidget(
'renders correctly',
setUp: (game, tester) async {
game.camera.followVector2(Vector2.zero());
game.camera.zoom = 10;
final sprite = await game.loadSprite(
Assets.images.flutterSignPost.keyName,
);
await game.add(
SpriteComponent(
sprite: sprite,
size: Vector2(4, 8),
anchor: Anchor.center,
),
);
await game.add(CameraZoom(value: 40));
},
verify: (game, tester) async {
await expectLater(
find.byGame<TestGame>(),
matchesGoldenFile('golden/camera_zoom/no_zoom.png'),
);
game.update(0.2);
await tester.pump();
await expectLater(
find.byGame<TestGame>(),
matchesGoldenFile('golden/camera_zoom/in_between.png'),
);
game.update(0.4);
await tester.pump();
await expectLater(
find.byGame<TestGame>(),
matchesGoldenFile('golden/camera_zoom/finished.png'),
);
game.update(0.1);
await tester.pump();
expect(game.firstChild<CameraZoom>(), isNull);
},
);
tester.test(
'completes when checked after it is finished',
(game) async {
await game.add(CameraZoom(value: 40));
game.update(10);
final cameraZoom = game.firstChild<CameraZoom>();
final future = cameraZoom!.completed;
expect(future, completes);
},
);
tester.test(
'completes when checked before it is finished',
(game) async {
final zoom = CameraZoom(value: 40);
final future = zoom.completed;
await game.add(zoom);
game.update(10);
game.update(0);
expect(future, completes);
},
);
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Loading…
Cancel
Save