|
|
|
@ -24,12 +24,19 @@ class SlingShot extends BodyComponent {
|
|
|
|
|
|
|
|
|
|
List<FixtureDef> _createFixtureDefs() {
|
|
|
|
|
final fixtures = <FixtureDef>[];
|
|
|
|
|
// TODO(alestiago): use size from [PositionBodyComponent].
|
|
|
|
|
final size = Vector2(10, 10);
|
|
|
|
|
|
|
|
|
|
final triangleVertices = [
|
|
|
|
|
Vector2(0, 0),
|
|
|
|
|
Vector2(0, -10),
|
|
|
|
|
Vector2(10, -10),
|
|
|
|
|
Vector2(0, -size.y),
|
|
|
|
|
Vector2(size.x, -size.y),
|
|
|
|
|
];
|
|
|
|
|
final triangleCentroid = centroid(triangleVertices);
|
|
|
|
|
for (final vertex in triangleVertices) {
|
|
|
|
|
vertex.setFrom(vertex - triangleCentroid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final triangle = PolygonShape()..set(triangleVertices);
|
|
|
|
|
fixtures.add(FixtureDef(triangle));
|
|
|
|
|
|
|
|
|
@ -44,10 +51,19 @@ class SlingShot extends BodyComponent {
|
|
|
|
|
return fixtures;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// https://en.wikipedia.org/wiki/Centroid
|
|
|
|
|
// TODO(alestiago): use from geometry package.
|
|
|
|
|
static Vector2 centroid(List<Vector2> vertices) {
|
|
|
|
|
final centroid = Vector2.zero();
|
|
|
|
|
for (final vertex in vertices) {
|
|
|
|
|
centroid.add(vertex);
|
|
|
|
|
}
|
|
|
|
|
return centroid / vertices.length.toDouble();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Body createBody() {
|
|
|
|
|
final bodyDef = BodyDef()..position = _position;
|
|
|
|
|
|
|
|
|
|
final body = world.createBody(bodyDef);
|
|
|
|
|
_createFixtureDefs().forEach(body.createFixture);
|
|
|
|
|
|
|
|
|
|