feat: spaceship entrance ramp (#126)

* feat: added spaceship entrance ramp assets

* refactor: modified ramp to fit on curves

* fix: fixed priorities and positions on ramp

* refactor: placed jetpack ramp

* fix: modified rampopening for priority changes

* fix: launcher ramp ball priority

* fix: fixed positions and priority

* chore: removed unused import

* refactor: priority on jetpack ramp

* refactor: removed position and changed sprite load method
pull/130/head
Rui Miguel Alonso 4 years ago committed by GitHub
parent 5e2ab9bf7b
commit 21cc04facc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@ -2,45 +2,52 @@
import 'dart:math' as math;
import 'package:flame/extensions.dart';
import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball/gen/assets.gen.dart';
import 'package:pinball_components/pinball_components.dart' hide Assets;
/// A [Blueprint] which creates the [JetpackRamp].
class Jetpack extends Forge2DBlueprint {
/// {@macro spaceship}
Jetpack();
static const int ballPriorityInsideRamp = 4;
@override
void build(_) {
final position = Vector2(
BoardDimensions.bounds.left + 40.5,
BoardDimensions.bounds.top - 31.5,
);
addAllContactCallback([
RampOpeningBallContactCallback<_JetpackRampOpening>(),
]);
final rightOpening = _JetpackRampOpening(
// TODO(ruimiguel): set Board priority when defined.
outsidePriority: 1,
rotation: math.pi,
)
..initialPosition = position + Vector2(12.9, -20)
..initialPosition = Vector2(1.7, 19)
..layer = Layer.opening;
final leftOpening = _JetpackRampOpening(
outsideLayer: Layer.spaceship,
outsidePriority: Spaceship.ballPriorityWhenOnSpaceship,
rotation: math.pi,
)
..initialPosition = position + Vector2(-2.5, -20)
..initialPosition = Vector2(-13.7, 19)
..layer = Layer.jetpack;
final jetpackRamp = JetpackRamp()
..initialPosition = position + Vector2(5, -20.2)
..layer = Layer.jetpack;
final jetpackRamp = JetpackRamp();
final jetpackRampWallFg = _JetpackRampForegroundRailing();
final baseRight = _JetpackBase()..initialPosition = Vector2(1.7, 20);
addAll([
rightOpening,
leftOpening,
baseRight,
jetpackRamp,
jetpackRampWallFg,
]);
}
}
@ -49,42 +56,45 @@ class Jetpack extends Forge2DBlueprint {
/// Represents the upper left blue ramp of the [Board].
/// {@endtemplate}
class JetpackRamp extends BodyComponent with InitialPosition, Layered {
JetpackRamp() : super(priority: 2) {
JetpackRamp() : super(priority: Jetpack.ballPriorityInsideRamp - 1) {
layer = Layer.jetpack;
paint = Paint()
..color = const Color.fromARGB(255, 8, 218, 241)
..style = PaintingStyle.stroke;
}
/// Radius of the external arc.
static const _externalRadius = 18.0;
/// Width between walls of the ramp.
static const width = 5.0;
List<FixtureDef> _createFixtureDefs() {
final fixturesDef = <FixtureDef>[];
final externalCurveShape = ArcShape(
center: initialPosition,
arcRadius: _externalRadius,
angle: math.pi,
rotation: math.pi,
final outerLeftCurveShape = BezierCurveShape(
controlPoints: [
Vector2(-30.95, 38),
Vector2(-32.5, 71.25),
Vector2(-14.2, 71.25),
],
);
final externalFixtureDef = FixtureDef(externalCurveShape);
fixturesDef.add(externalFixtureDef);
final internalCurveShape = externalCurveShape.copyWith(
arcRadius: _externalRadius - width,
final outerLeftCurveFixtureDef = FixtureDef(outerLeftCurveShape);
fixturesDef.add(outerLeftCurveFixtureDef);
final outerRightCurveShape = BezierCurveShape(
controlPoints: [
outerLeftCurveShape.vertices.last,
Vector2(4.7, 71.25),
Vector2(6.3, 40),
],
);
final internalFixtureDef = FixtureDef(internalCurveShape);
fixturesDef.add(internalFixtureDef);
final outerRightCurveFixtureDef = FixtureDef(outerRightCurveShape);
fixturesDef.add(outerRightCurveFixtureDef);
return fixturesDef;
}
@override
Body createBody() {
renderBody = false;
final bodyDef = BodyDef()
..userData = this
..position = initialPosition;
@ -94,6 +104,140 @@ class JetpackRamp extends BodyComponent with InitialPosition, Layered {
return body;
}
@override
Future<void> onLoad() async {
await super.onLoad();
await _loadSprites();
}
Future<void> _loadSprites() async {
final spriteRamp = await gameRef.loadSprite(
Assets.images.components.spaceshipRamp.path,
);
final spriteRampComponent = SpriteComponent(
sprite: spriteRamp,
size: Vector2(38.1, 33.8),
anchor: Anchor.center,
position: Vector2(-12.2, -53.5),
);
final spriteRailingBg = await gameRef.loadSprite(
Assets.images.components.spaceshipRailingBg.path,
);
final spriteRailingBgComponent = SpriteComponent(
sprite: spriteRailingBg,
size: Vector2(38.3, 35.1),
anchor: Anchor.center,
position: spriteRampComponent.position + Vector2(0, -1),
);
await addAll([
spriteRailingBgComponent,
spriteRampComponent,
]);
}
}
class _JetpackRampForegroundRailing extends BodyComponent
with InitialPosition, Layered {
_JetpackRampForegroundRailing()
: super(priority: Jetpack.ballPriorityInsideRamp + 1) {
layer = Layer.jetpack;
}
List<FixtureDef> _createFixtureDefs() {
final fixturesDef = <FixtureDef>[];
final innerLeftCurveShape = BezierCurveShape(
controlPoints: [
Vector2(-24.5, 38),
Vector2(-26.3, 64),
Vector2(-13.8, 64.5),
],
);
final innerLeftCurveFixtureDef = FixtureDef(innerLeftCurveShape);
fixturesDef.add(innerLeftCurveFixtureDef);
final innerRightCurveShape = BezierCurveShape(
controlPoints: [
innerLeftCurveShape.vertices.last,
Vector2(-1, 64.5),
Vector2(0.1, 39.5),
],
);
final innerRightCurveFixtureDef = FixtureDef(innerRightCurveShape);
fixturesDef.add(innerRightCurveFixtureDef);
return fixturesDef;
}
@override
Body createBody() {
renderBody = false;
final bodyDef = BodyDef()
..userData = this
..position = initialPosition;
final body = world.createBody(bodyDef);
_createFixtureDefs().forEach(body.createFixture);
return body;
}
@override
Future<void> onLoad() async {
await super.onLoad();
await _loadSprites();
}
Future<void> _loadSprites() async {
final spriteRailingFg = await gameRef.loadSprite(
Assets.images.components.spaceshipRailingFg.path,
);
final spriteRailingFgComponent = SpriteComponent(
sprite: spriteRailingFg,
size: Vector2(26.1, 28.3),
anchor: Anchor.center,
position: Vector2(-12.2, -52.5),
);
await add(spriteRailingFgComponent);
}
}
class _JetpackBase extends BodyComponent with InitialPosition, Layered {
_JetpackBase() {
layer = Layer.board;
}
@override
Body createBody() {
renderBody = false;
const baseWidth = 6;
final baseShape = BezierCurveShape(
controlPoints: [
Vector2(initialPosition.x - baseWidth / 2, initialPosition.y),
Vector2(initialPosition.x - baseWidth / 2, initialPosition.y) +
Vector2(2, 2),
Vector2(initialPosition.x + baseWidth / 2, initialPosition.y) +
Vector2(-2, 2),
Vector2(initialPosition.x + baseWidth / 2, initialPosition.y)
],
);
final fixtureDef = FixtureDef(baseShape);
final bodyDef = BodyDef()
..userData = this
..position = initialPosition;
return world.createBody(bodyDef)..createFixture(fixtureDef);
}
}
/// {@template jetpack_ramp_opening}
@ -104,12 +248,15 @@ class _JetpackRampOpening extends RampOpening {
/// {@macro jetpack_ramp_opening}
_JetpackRampOpening({
Layer? outsideLayer,
int? outsidePriority,
required double rotation,
}) : _rotation = rotation,
super(
insideLayer: Layer.jetpack,
outsideLayer: outsideLayer,
orientation: RampOrientation.down,
insidePriority: Jetpack.ballPriorityInsideRamp,
outsidePriority: outsidePriority,
);
final double _rotation;
@ -117,11 +264,14 @@ class _JetpackRampOpening extends RampOpening {
static final Vector2 _size = Vector2(JetpackRamp.width / 4, .1);
@override
Shape get shape => PolygonShape()
Shape get shape {
renderBody = false;
return PolygonShape()
..setAsBox(
_size.x,
_size.y,
initialPosition,
_rotation,
);
}
}

@ -124,6 +124,7 @@ class _LauncherRampOpening extends RampOpening {
super(
insideLayer: Layer.launcher,
orientation: RampOrientation.down,
insidePriority: 3,
);
final double _rotation;

@ -191,6 +191,7 @@ class SpaceshipExitRailEnd extends RampOpening {
: super(
insideLayer: Layer.spaceshipExitRail,
orientation: RampOrientation.down,
insidePriority: 3,
) {
renderBody = false;
layer = Layer.spaceshipExitRail;

@ -22,6 +22,9 @@ extension PinballGameAssetsX on PinballGame {
images.load(components.Assets.images.dashBumper.main.active.keyName),
images.load(components.Assets.images.dashBumper.main.inactive.keyName),
images.load(Assets.images.components.background.path),
images.load(Assets.images.components.spaceshipRamp.path),
images.load(Assets.images.components.spaceshipRailingBg.path),
images.load(Assets.images.components.spaceshipRailingFg.path),
images.load(Assets.images.components.spaceshipDropTube.path),
]);
}

@ -92,7 +92,9 @@ class PinballGame extends Forge2DGame
}
Future<void> _addPaths() async {
unawaited(addFromBlueprint(Jetpack()));
unawaited(
addFromBlueprint(Jetpack()),
);
unawaited(addFromBlueprint(Launcher()));
}

@ -24,6 +24,18 @@ class $AssetsImagesComponentsGen {
/// File path: assets/images/components/spaceship-drop-tube.png
AssetGenImage get spaceshipDropTube =>
const AssetGenImage('assets/images/components/spaceship-drop-tube.png');
/// File path: assets/images/components/spaceship_railing_bg.png
AssetGenImage get spaceshipRailingBg =>
const AssetGenImage('assets/images/components/spaceship_railing_bg.png');
/// File path: assets/images/components/spaceship_railing_fg.png
AssetGenImage get spaceshipRailingFg =>
const AssetGenImage('assets/images/components/spaceship_railing_fg.png');
/// File path: assets/images/components/spaceship_ramp.png
AssetGenImage get spaceshipRamp =>
const AssetGenImage('assets/images/components/spaceship_ramp.png');
}
class Assets {

@ -185,8 +185,9 @@ class SpaceshipHole extends RampOpening {
: super(
insideLayer: Layer.spaceship,
outsideLayer: outsideLayer,
outsidePriority: outsidePriority,
orientation: RampOrientation.up,
insidePriority: 4,
outsidePriority: outsidePriority,
) {
renderBody = false;
layer = Layer.spaceship;

Loading…
Cancel
Save