feat: plunger asset (#145)

* feat: added plunger asset and move

* feat: fixed plunger assets and position

* fix: set limits to plunger compression correctly

* chore: unused import

* fix: placed plunger correctly

* test: refactor test game

* refactor: changed spawnBall initialPosition

* chore: plunger golden test
pull/162/head
Rui Miguel Alonso 4 years ago committed by GitHub
parent 1a8f534ece
commit d798fdf9fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -1,8 +1,8 @@
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/services.dart'; import 'package:flutter/services.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball/gen/assets.gen.dart';
import 'package:pinball_components/pinball_components.dart' hide Assets;
/// {@template plunger} /// {@template plunger}
/// [Plunger] serves as a spring, that shoots the ball on the right side of the /// [Plunger] serves as a spring, that shoots the ball on the right side of the
@ -14,10 +14,9 @@ class Plunger extends BodyComponent with KeyboardHandler, InitialPosition {
/// {@macro plunger} /// {@macro plunger}
Plunger({ Plunger({
required this.compressionDistance, required this.compressionDistance,
}) : super( // TODO(ruimiguel): set to priority +1 over LaunchRamp once all priorities
// TODO(allisonryan0002): remove paint after asset is added. // are fixed.
paint: Paint()..color = const Color.fromARGB(255, 241, 8, 8), }) : super(priority: 0);
);
/// Distance the plunger can lower. /// Distance the plunger can lower.
final double compressionDistance; final double compressionDistance;
@ -88,13 +87,36 @@ class Plunger extends BodyComponent with KeyboardHandler, InitialPosition {
plunger: this, plunger: this,
anchor: anchor, anchor: anchor,
); );
world.createJoint(PrismaticJoint(jointDef));
world.createJoint(
PrismaticJoint(jointDef)..setLimits(-compressionDistance, 0),
);
} }
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
await _anchorToJoint(); await _anchorToJoint();
renderBody = false;
await _loadSprite();
}
Future<void> _loadSprite() async {
final sprite = await gameRef.loadSprite(
Assets.images.components.plunger.path,
);
await add(
SpriteComponent(
sprite: sprite,
size: Vector2(5.5, 40),
anchor: Anchor.center,
position: Vector2(2, 19),
angle: -0.033,
),
);
} }
} }
@ -111,6 +133,16 @@ class PlungerAnchor extends JointAnchor {
plunger.body.position.y - plunger.compressionDistance, plunger.body.position.y - plunger.compressionDistance,
); );
} }
@override
Body createBody() {
final shape = CircleShape()..radius = 0.5;
final fixtureDef = FixtureDef(shape);
final bodyDef = BodyDef()
..position = initialPosition
..type = BodyType.static;
return world.createBody(bodyDef)..createFixture(fixtureDef);
}
} }
/// {@template plunger_anchor_prismatic_joint_def} /// {@template plunger_anchor_prismatic_joint_def}

@ -2,7 +2,6 @@
import 'dart:async'; import 'dart:async';
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame/extensions.dart';
import 'package:flame/input.dart'; import 'package:flame/input.dart';
import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_bloc/flame_bloc.dart';
import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_forge2d/flame_forge2d.dart';
@ -72,8 +71,7 @@ class PinballGame extends Forge2DGame
Future<void> _addPlunger() async { Future<void> _addPlunger() async {
final plunger = Plunger(compressionDistance: 29) final plunger = Plunger(compressionDistance: 29)
..initialPosition = ..initialPosition = Vector2(38, -19);
BoardDimensions.bounds.center.toVector2() + Vector2(41.5, -49);
await add(plunger); await add(plunger);
} }
@ -90,17 +88,9 @@ class PinballGame extends Forge2DGame
Future<void> spawnBall() async { Future<void> spawnBall() async {
// TODO(alestiago): Remove once this logic is moved to controller. // TODO(alestiago): Remove once this logic is moved to controller.
var plunger = firstChild<Plunger>();
if (plunger == null) {
await add(plunger = Plunger(compressionDistance: 1));
}
final ball = ControlledBall.launch( final ball = ControlledBall.launch(
theme: theme, theme: theme,
)..initialPosition = Vector2( )..initialPosition = Vector2(38, -19 + Ball.size.y);
plunger.body.position.x,
plunger.body.position.y + Ball.size.y,
);
await add(ball); await add(ball);
} }
} }

@ -17,6 +17,10 @@ class $AssetsImagesComponentsGen {
AssetGenImage get background => AssetGenImage get background =>
const AssetGenImage('assets/images/components/background.png'); const AssetGenImage('assets/images/components/background.png');
/// File path: assets/images/components/plunger.png
AssetGenImage get plunger =>
const AssetGenImage('assets/images/components/plunger.png');
} }
class Assets { class Assets {

@ -12,11 +12,32 @@ import '../../helpers/helpers.dart';
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(Forge2DGame.new); final flameTester = FlameTester(TestGame.new);
group('Plunger', () { group('Plunger', () {
const compressionDistance = 0.0; const compressionDistance = 0.0;
flameTester.testGameWidget(
'renders correctly',
setUp: (game, tester) async {
await game.add(
Plunger(
compressionDistance: compressionDistance,
),
);
await game.ready();
game.camera.followVector2(Vector2.zero());
game.camera.zoom = 4.1;
},
// TODO(ruimiguel): enable test when workflows are fixed.
// verify: (game, tester) async {
// await expectLater(
// find.byGame<Forge2DGame>(),
// matchesGoldenFile('golden/plunger.png'),
// );
// },
);
flameTester.test( flameTester.test(
'loads correctly', 'loads correctly',
(game) async { (game) async {

Loading…
Cancel
Save