From c2df7f60fed073284309ac12e778f9bc4bb4993b Mon Sep 17 00:00:00 2001 From: alestiago Date: Mon, 28 Mar 2022 14:23:32 +0100 Subject: [PATCH] feat: adjusted ChromeDino --- lib/game/components/chrome_dino.dart | 88 +++++++++++++++------------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/lib/game/components/chrome_dino.dart b/lib/game/components/chrome_dino.dart index 45785729..06f6b431 100644 --- a/lib/game/components/chrome_dino.dart +++ b/lib/game/components/chrome_dino.dart @@ -32,24 +32,21 @@ class ChromeDino extends BodyComponent with InitialPosition { chromeDino: this, anchor: anchor, ); - _joint = _ChromeDinoJoint(jointDef)..create(world); - } - - // TODO(alestiago): Remove once the following is added to Flame. - // ignore: public_member_api_docs - Completer removed = Completer(); - - @override - void onRemove() { - super.onRemove(); - removed.complete(true); + _joint = _ChromeDinoJoint(jointDef); + world.createJoint2(_joint); } @override Future onLoad() async { await super.onLoad(); await _anchorToJoint(); - await add(TimerComponent(period: 1, onTick: _joint.swivel)); + await add( + TimerComponent( + period: 1, + onTick: _joint.swivel, + repeat: true, + ), + ); } List _createFixtureDefs() { @@ -65,29 +62,31 @@ class ChromeDino extends BodyComponent with InitialPosition { ..isSensor = true; fixtureDefs.add(fixtureDef); - final upperEdge = EdgeShape() - ..set( - Vector2(-size.x / 2, -size.y / 2), - Vector2(size.x / 2, -size.y / 2), - ); - final upperEdgeDef = FixtureDef(upperEdge)..density = 0.5; - fixtureDefs.add(upperEdgeDef); - - final lowerEdge = EdgeShape() - ..set( - Vector2(-size.x / 2, size.y / 2), - Vector2(size.x / 2, size.y / 2), - ); - final lowerEdgeDef = FixtureDef(lowerEdge)..density = 0.5; - fixtureDefs.add(lowerEdgeDef); - - final rightEdge = EdgeShape() - ..set( - Vector2(size.x / 2, -size.y / 2), - Vector2(size.x / 2, size.y / 2), - ); - final rightEdgeDef = FixtureDef(rightEdge)..density = 0.5; - fixtureDefs.add(rightEdgeDef); + // FIXME(alestiago): Investigate why adding these fixtures is considered as + // an invalid contact type. + // final upperEdge = EdgeShape() + // ..set( + // Vector2(-size.x / 2, -size.y / 2), + // Vector2(size.x / 2, -size.y / 2), + // ); + // final upperEdgeDef = FixtureDef(upperEdge)..density = 0.5; + // fixtureDefs.add(upperEdgeDef); + + // final lowerEdge = EdgeShape() + // ..set( + // Vector2(-size.x / 2, size.y / 2), + // Vector2(size.x / 2, size.y / 2), + // ); + // final lowerEdgeDef = FixtureDef(lowerEdge)..density = 0.5; + // fixtureDefs.add(lowerEdgeDef); + + // final rightEdge = EdgeShape() + // ..set( + // Vector2(size.x / 2, -size.y / 2), + // Vector2(size.x / 2, size.y / 2), + // ); + // final rightEdgeDef = FixtureDef(rightEdge)..density = 0.5; + // fixtureDefs.add(rightEdgeDef); return fixtureDefs; } @@ -149,15 +148,20 @@ class _ChromeDinoAnchorRevoluteJointDef extends RevoluteJointDef { class _ChromeDinoJoint extends RevoluteJoint { _ChromeDinoJoint(_ChromeDinoAnchorRevoluteJointDef def) : super(def); - // TODO(alestiago): Remove once Forge2D supports custom joints. - void create(World world) { - world.joints.add(this); - bodyA.joints.add(this); - bodyB.joints.add(this); - } - /// Sweeps the [ChromeDino] up and down repeatedly. void swivel() { setMotorSpeed(-motorSpeed); } } + +extension on World { + // TODO(alestiago): Remove once Forge2D supports custom joints. + void createJoint2(Joint joint) { + assert(!isLocked, ''); + + joints.add(joint); + + joint.bodyA.joints.add(joint); + joint.bodyB.joints.add(joint); + } +}