feat: ramps sandbox (#168)

* feat: added LaunchRamp story

* feat: added SpaceshipRail story

* feat: added SpaceshipRamp story

* feat: added new stories for ramps to dashbook

* refactor: added priority and layer to Ball for BasicBallGame

* refactor: changed renderBody to allow tracing on ramps

* refactor: moved renderBody

* fix: bug on spaceshiprail exit never reached

* fix: spaceshiprail exit and basecamp ball blocked

* refactor: set spaceship foreground priority at super
pull/177/head
Rui Miguel Alonso 2 years ago committed by GitHub
parent 69a88441a6
commit d32192a4e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -11,6 +11,9 @@ import 'package:pinball_components/pinball_components.dart';
/// [_LaunchRampForegroundRailing]. /// [_LaunchRampForegroundRailing].
/// {@endtemplate} /// {@endtemplate}
class LaunchRamp extends Forge2DBlueprint { class LaunchRamp extends Forge2DBlueprint {
/// Base priority for [Ball] while inside [LaunchRamp].
static const ballPriorityInsideRamp = 0;
@override @override
void build(_) { void build(_) {
addAllContactCallback([ addAllContactCallback([
@ -40,7 +43,10 @@ class LaunchRamp extends Forge2DBlueprint {
/// {@endtemplate} /// {@endtemplate}
class _LaunchRampBase extends BodyComponent with InitialPosition, Layered { class _LaunchRampBase extends BodyComponent with InitialPosition, Layered {
/// {@macro launch_ramp_base} /// {@macro launch_ramp_base}
_LaunchRampBase() : super(priority: -1) { _LaunchRampBase()
: super(
priority: LaunchRamp.ballPriorityInsideRamp - 1,
) {
layer = Layer.launcher; layer = Layer.launcher;
} }
@ -143,7 +149,10 @@ class _LaunchRampBaseSpriteComponent extends SpriteComponent with HasGameRef {
class _LaunchRampForegroundRailing extends BodyComponent class _LaunchRampForegroundRailing extends BodyComponent
with InitialPosition, Layered { with InitialPosition, Layered {
/// {@macro launch_ramp_foreground_railing} /// {@macro launch_ramp_foreground_railing}
_LaunchRampForegroundRailing() : super(priority: 1) { _LaunchRampForegroundRailing()
: super(
priority: LaunchRamp.ballPriorityInsideRamp + 1,
) {
layer = Layer.launcher; layer = Layer.launcher;
} }
@ -227,7 +236,7 @@ class _LaunchRampExit extends RampOpening {
super( super(
insideLayer: Layer.launcher, insideLayer: Layer.launcher,
orientation: RampOrientation.down, orientation: RampOrientation.down,
insidePriority: 3, insidePriority: LaunchRamp.ballPriorityInsideRamp,
); );
final double _rotation; final double _rotation;

@ -37,7 +37,7 @@ class Spaceship extends Forge2DBlueprint {
AndroidHead()..initialPosition = position, AndroidHead()..initialPosition = position,
SpaceshipHole( SpaceshipHole(
outsideLayer: Layer.spaceshipExitRail, outsideLayer: Layer.spaceshipExitRail,
outsidePriority: SpaceshipRail.ballPriorityWhenOnSpaceshipRail, outsidePriority: SpaceshipRail.ballPriorityInsideRail,
)..initialPosition = position - Vector2(5.2, 4.8), )..initialPosition = position - Vector2(5.2, 4.8),
SpaceshipHole()..initialPosition = position - Vector2(-7.2, 0.8), SpaceshipHole()..initialPosition = position - Vector2(-7.2, 0.8),
SpaceshipWall()..initialPosition = position, SpaceshipWall()..initialPosition = position,

@ -14,8 +14,8 @@ class SpaceshipRail extends Forge2DBlueprint {
/// {@macro spaceship_rail} /// {@macro spaceship_rail}
SpaceshipRail(); SpaceshipRail();
/// Base priority for ball while be in [_SpaceshipRailRamp]. /// Base priority for [Ball] while inside [SpaceshipRail].
static const ballPriorityWhenOnSpaceshipRail = 2; static const ballPriorityInsideRail = 2;
@override @override
void build(_) { void build(_) {
@ -45,9 +45,8 @@ class SpaceshipRail extends Forge2DBlueprint {
class _SpaceshipRailRamp extends BodyComponent with InitialPosition, Layered { class _SpaceshipRailRamp extends BodyComponent with InitialPosition, Layered {
_SpaceshipRailRamp() _SpaceshipRailRamp()
: super( : super(
priority: SpaceshipRail.ballPriorityWhenOnSpaceshipRail - 1, priority: SpaceshipRail.ballPriorityInsideRail - 1,
) { ) {
renderBody = false;
layer = Layer.spaceshipExitRail; layer = Layer.spaceshipExitRail;
} }
@ -139,6 +138,8 @@ class _SpaceshipRailRamp extends BodyComponent with InitialPosition, Layered {
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
renderBody = false;
await add(_SpaceshipRailRampSpriteComponent()); await add(_SpaceshipRailRampSpriteComponent());
} }
} }
@ -161,11 +162,7 @@ class _SpaceshipRailRampSpriteComponent extends SpriteComponent
class _SpaceshipRailForeground extends SpriteComponent with HasGameRef { class _SpaceshipRailForeground extends SpriteComponent with HasGameRef {
_SpaceshipRailForeground() _SpaceshipRailForeground()
: super( : super(priority: SpaceshipRail.ballPriorityInsideRail + 1);
anchor: Anchor.center,
position: Vector2(-28.5, 19.7),
priority: SpaceshipRail.ballPriorityWhenOnSpaceshipRail + 1,
);
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
@ -176,6 +173,8 @@ class _SpaceshipRailForeground extends SpriteComponent with HasGameRef {
); );
this.sprite = sprite; this.sprite = sprite;
size = sprite.originalSize / 10; size = sprite.originalSize / 10;
anchor = Anchor.center;
position = Vector2(-28.5, 19.7);
} }
} }
@ -183,7 +182,7 @@ class _SpaceshipRailForeground extends SpriteComponent with HasGameRef {
class _SpaceshipRailBase extends BodyComponent with InitialPosition, Layered { class _SpaceshipRailBase extends BodyComponent with InitialPosition, Layered {
_SpaceshipRailBase({required this.radius}) _SpaceshipRailBase({required this.radius})
: super( : super(
priority: SpaceshipRail.ballPriorityWhenOnSpaceshipRail + 1, priority: SpaceshipRail.ballPriorityInsideRail + 1,
) { ) {
renderBody = false; renderBody = false;
layer = Layer.board; layer = Layer.board;
@ -213,9 +212,9 @@ class SpaceshipRailExit extends RampOpening {
/// {@macro spaceship_rail_exit} /// {@macro spaceship_rail_exit}
SpaceshipRailExit() SpaceshipRailExit()
: super( : super(
insideLayer: Layer.spaceshipExitRail,
orientation: RampOrientation.down, orientation: RampOrientation.down,
insidePriority: 3, insideLayer: Layer.spaceshipExitRail,
insidePriority: SpaceshipRail.ballPriorityInsideRail,
) { ) {
renderBody = false; renderBody = false;
layer = Layer.spaceshipExitRail; layer = Layer.spaceshipExitRail;
@ -224,10 +223,10 @@ class SpaceshipRailExit extends RampOpening {
@override @override
Shape get shape { Shape get shape {
return ArcShape( return ArcShape(
center: Vector2(-28, -19), center: Vector2(-29, -19),
arcRadius: 2.5, arcRadius: 2.5,
angle: math.pi * 0.4, angle: math.pi * 0.4,
rotation: -0.16, rotation: 0.26,
); );
} }
} }

@ -184,8 +184,6 @@ class _SpaceshipRampForegroundRailing extends BodyComponent
@override @override
Body createBody() { Body createBody() {
renderBody = false;
final bodyDef = BodyDef() final bodyDef = BodyDef()
..userData = this ..userData = this
..position = initialPosition; ..position = initialPosition;
@ -199,11 +197,13 @@ class _SpaceshipRampForegroundRailing extends BodyComponent
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
await add(_SpaceshipRampForegroundRalingSpriteComponent()); renderBody = false;
await add(_SpaceshipRampForegroundRailingSpriteComponent());
} }
} }
class _SpaceshipRampForegroundRalingSpriteComponent extends SpriteComponent class _SpaceshipRampForegroundRailingSpriteComponent extends SpriteComponent
with HasGameRef { with HasGameRef {
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
@ -221,13 +221,12 @@ class _SpaceshipRampForegroundRalingSpriteComponent extends SpriteComponent
/// Represents the ground right base of the [SpaceshipRamp]. /// Represents the ground right base of the [SpaceshipRamp].
class _SpaceshipRampBase extends BodyComponent with InitialPosition, Layered { class _SpaceshipRampBase extends BodyComponent with InitialPosition, Layered {
_SpaceshipRampBase() { _SpaceshipRampBase() {
renderBody = false;
layer = Layer.board; layer = Layer.board;
} }
@override @override
Body createBody() { Body createBody() {
renderBody = false;
const baseWidth = 6; const baseWidth = 6;
final baseShape = BezierCurveShape( final baseShape = BezierCurveShape(
controlPoints: [ controlPoints: [
@ -266,7 +265,9 @@ class _SpaceshipRampOpening extends RampOpening {
orientation: RampOrientation.down, orientation: RampOrientation.down,
insidePriority: SpaceshipRamp.ballPriorityInsideRamp, insidePriority: SpaceshipRamp.ballPriorityInsideRamp,
outsidePriority: outsidePriority, outsidePriority: outsidePriority,
); ) {
renderBody = false;
}
final double _rotation; final double _rotation;
@ -274,7 +275,6 @@ class _SpaceshipRampOpening extends RampOpening {
@override @override
Shape get shape { Shape get shape {
renderBody = false;
return PolygonShape() return PolygonShape()
..setAsBox( ..setAsBox(
_size.x, _size.x,

@ -25,5 +25,8 @@ void main() {
addSparkyBumperStories(dashbook); addSparkyBumperStories(dashbook);
addZoomStories(dashbook); addZoomStories(dashbook);
addBoundariesStories(dashbook); addBoundariesStories(dashbook);
addSpaceshipRampStories(dashbook);
addSpaceshipRailStories(dashbook);
addLaunchRampStories(dashbook);
runApp(dashbook); runApp(dashbook);
} }

@ -4,7 +4,11 @@ import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/common/common.dart'; import 'package:sandbox/common/common.dart';
class BasicBallGame extends BasicGame with TapDetector, Traceable { class BasicBallGame extends BasicGame with TapDetector, Traceable {
BasicBallGame({required this.color}); BasicBallGame({
required this.color,
this.ballPriority = 0,
this.ballLayer = Layer.all,
});
static const info = ''' static const info = '''
Shows how a Ball works. Shows how a Ball works.
@ -13,11 +17,16 @@ class BasicBallGame extends BasicGame with TapDetector, Traceable {
'''; ''';
final Color color; final Color color;
final int ballPriority;
final Layer ballLayer;
@override @override
void onTapUp(TapUpInfo info) { void onTapUp(TapUpInfo info) {
add( add(
Ball(baseColor: color)..initialPosition = info.eventPosition.game, Ball(baseColor: color)
..initialPosition = info.eventPosition.game
..layer = ballLayer
..priority = ballPriority,
); );
traceAllBodies(); traceAllBodies();
} }

@ -0,0 +1,36 @@
import 'dart:async';
import 'package:flame/input.dart';
import 'package:flutter/material.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class LaunchRampGame extends BasicBallGame {
LaunchRampGame()
: super(
color: Colors.blue,
ballPriority: LaunchRamp.ballPriorityInsideRamp,
ballLayer: Layer.launcher,
);
static const info = '''
Shows how LaunchRamp are rendered.
- Activate the "trace" parameter to overlay the body.
- Tap anywhere on the screen to spawn a ball into the game.
''';
@override
Future<void> onLoad() async {
await super.onLoad();
camera
..followVector2(Vector2(0, 0))
..zoom = 7.5;
final launchRamp = LaunchRamp();
unawaited(addFromBlueprint(launchRamp));
await traceAllBodies();
}
}

@ -0,0 +1,15 @@
import 'package:dashbook/dashbook.dart';
import 'package:flame/game.dart';
import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/launch_ramp/launch_ramp_game.dart';
void addLaunchRampStories(Dashbook dashbook) {
dashbook.storiesOf('LaunchRamp').add(
'Basic',
(context) => GameWidget(
game: LaunchRampGame()..trace = context.boolProperty('Trace', true),
),
codeLink: buildSourceLink('launch_ramp/basic.dart'),
info: LaunchRampGame.info,
);
}

@ -0,0 +1,34 @@
import 'dart:async';
import 'package:flame/input.dart';
import 'package:flutter/material.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class SpaceshipRailGame extends BasicBallGame {
SpaceshipRailGame()
: super(
color: Colors.blue,
ballPriority: SpaceshipRail.ballPriorityInsideRail,
ballLayer: Layer.spaceshipExitRail,
);
static const info = '''
Shows how SpaceshipRail are rendered.
- Activate the "trace" parameter to overlay the body.
- Tap anywhere on the screen to spawn a ball into the game.
''';
@override
Future<void> onLoad() async {
await super.onLoad();
camera.followVector2(Vector2(-30, -10));
final spaceshipRail = SpaceshipRail();
unawaited(addFromBlueprint(spaceshipRail));
await traceAllBodies();
}
}

@ -0,0 +1,16 @@
import 'package:dashbook/dashbook.dart';
import 'package:flame/game.dart';
import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/spaceship_rail/spaceship_rail_game.dart';
void addSpaceshipRailStories(Dashbook dashbook) {
dashbook.storiesOf('SpaceshipRail').add(
'Basic',
(context) => GameWidget(
game: SpaceshipRailGame()
..trace = context.boolProperty('Trace', true),
),
codeLink: buildSourceLink('spaceship_rail/basic.dart'),
info: SpaceshipRailGame.info,
);
}

@ -0,0 +1,34 @@
import 'dart:async';
import 'package:flame/input.dart';
import 'package:flutter/material.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class SpaceshipRampGame extends BasicBallGame {
SpaceshipRampGame()
: super(
color: Colors.blue,
ballPriority: SpaceshipRamp.ballPriorityInsideRamp,
ballLayer: Layer.spaceshipEntranceRamp,
);
static const info = '''
Shows how SpaceshipRamp are rendered.
- Activate the "trace" parameter to overlay the body.
- Tap anywhere on the screen to spawn a ball into the game.
''';
@override
Future<void> onLoad() async {
await super.onLoad();
camera.followVector2(Vector2(-10, -20));
final spaceshipRamp = SpaceshipRamp();
unawaited(addFromBlueprint(spaceshipRamp));
await traceAllBodies();
}
}

@ -0,0 +1,16 @@
import 'package:dashbook/dashbook.dart';
import 'package:flame/game.dart';
import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/spaceship_ramp/spaceship_ramp_game.dart';
void addSpaceshipRampStories(Dashbook dashbook) {
dashbook.storiesOf('SpaceshipRamp').add(
'Basic',
(context) => GameWidget(
game: SpaceshipRampGame()
..trace = context.boolProperty('Trace', true),
),
codeLink: buildSourceLink('spaceship_ramp/basic.dart'),
info: SpaceshipRampGame.info,
);
}

@ -5,8 +5,11 @@ export 'chrome_dino/stories.dart';
export 'effects/stories.dart'; export 'effects/stories.dart';
export 'flipper/stories.dart'; export 'flipper/stories.dart';
export 'flutter_forest/stories.dart'; export 'flutter_forest/stories.dart';
export 'launch_ramp/stories.dart';
export 'layer/stories.dart'; export 'layer/stories.dart';
export 'slingshot/stories.dart'; export 'slingshot/stories.dart';
export 'spaceship/stories.dart'; export 'spaceship/stories.dart';
export 'spaceship_rail/stories.dart';
export 'spaceship_ramp/stories.dart';
export 'sparky_bumper/stories.dart'; export 'sparky_bumper/stories.dart';
export 'zoom/stories.dart'; export 'zoom/stories.dart';

Loading…
Cancel
Save