From 19bad30f86eee6bade8de91922eec131c5f67212 Mon Sep 17 00:00:00 2001 From: alestiago Date: Thu, 10 Mar 2022 11:06:08 +0000 Subject: [PATCH] feat: implemented basic SlingShot --- lib/game/components/sling_shot.dart | 51 +++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/lib/game/components/sling_shot.dart b/lib/game/components/sling_shot.dart index 155ff8a9..35dc2057 100644 --- a/lib/game/components/sling_shot.dart +++ b/lib/game/components/sling_shot.dart @@ -1,9 +1,56 @@ import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball/game/game.dart'; +/// {@template sling_shot} +/// Triangular [BodyType.static] body that propels the [Ball] toward the +/// opposite side. +/// +/// [SlingShot]s are usually positioned above each [Flipper]. +/// {@endtemplate sling_shot} class SlingShot extends BodyComponent { + /// @{macro sling_shot} + SlingShot({ + required Vector2 position, + }) : _position = position { + // TODO(alestiago): Use sprite instead of color when provided. + paint = Paint() + ..color = const Color(0xFF00FF00) + ..style = PaintingStyle.fill; + } + + /// The initial position of the [SlingShot] body. + final Vector2 _position; + + List _createFixtureDefs() { + final fixtures = []; + + final triangleVertices = [ + Vector2(0, 0), + Vector2(0, -10), + Vector2(10, -10), + ]; + final triangle = PolygonShape()..set(triangleVertices); + fixtures.add(FixtureDef(triangle)); + + final kickerVertices = [ + triangleVertices.first, + triangleVertices.last, + ]; + final kicker = PolygonShape()..set(kickerVertices); + final kickerFixtureDef = FixtureDef(kicker)..restitution = 2.0; + fixtures.add(kickerFixtureDef); + + return fixtures; + } + @override Body createBody() { - // TODO: implement createBody - throw UnimplementedError(); + final bodyDef = BodyDef()..position = _position; + + final body = world.createBody(bodyDef); + _createFixtureDefs().forEach(body.createFixture); + + return body; } }