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

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

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

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

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

@ -4,7 +4,11 @@ import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/common/common.dart';
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 = '''
Shows how a Ball works.
@ -13,11 +17,16 @@ class BasicBallGame extends BasicGame with TapDetector, Traceable {
''';
final Color color;
final int ballPriority;
final Layer ballLayer;
@override
void onTapUp(TapUpInfo info) {
add(
Ball(baseColor: color)..initialPosition = info.eventPosition.game,
Ball(baseColor: color)
..initialPosition = info.eventPosition.game
..layer = ballLayer
..priority = ballPriority,
);
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 'flipper/stories.dart';
export 'flutter_forest/stories.dart';
export 'launch_ramp/stories.dart';
export 'layer/stories.dart';
export 'slingshot/stories.dart';
export 'spaceship/stories.dart';
export 'spaceship_rail/stories.dart';
export 'spaceship_ramp/stories.dart';
export 'sparky_bumper/stories.dart';
export 'zoom/stories.dart';

Loading…
Cancel
Save