package org.codecranachan.asteroidpush.content.parts;
import org.codecranachan.asteroidpush.base.simulation.DistanceJointData;
import org.codecranachan.asteroidpush.base.simulation.Material;
import org.codecranachan.asteroidpush.base.simulation.Primitive;
import org.codecranachan.asteroidpush.base.simulation.PrismaticJointData;
import org.codecranachan.asteroidpush.base.workshop.PartFactory;
import org.codecranachan.asteroidpush.base.workshop.assembly.Component;
import org.codecranachan.asteroidpush.base.workshop.assembly.Part;
import org.codecranachan.asteroidpush.base.workshop.assembly.Socket;
import org.codecranachan.asteroidpush.base.workshop.tokenboard.Shape;
import org.codecranachan.asteroidpush.content.behaviors.CollisionBehaviorFactory;
import org.codecranachan.asteroidpush.content.behaviors.DistanceConstraintBehaviorFactory;
import org.codecranachan.asteroidpush.content.behaviors.PrismaticConstraintBehaviorFactory;
import org.jbox2d.common.Vec2;
public class Bumper implements PartFactory {
public String getName() {
return "Bumper";
}
public Part createPart() {
Component base = createBaseComponent();
base.add(createBaseCollision(), 0);
Component bumper = createBumperComponent();
bumper.add(createBumperCollision(), 0);
PrismaticConstraintBehaviorFactory prismatic = createPrismaticJoint();
DistanceConstraintBehaviorFactory distance = createDistanceJoint();
base.add(prismatic, 0);
base.add(distance, 0);
bumper.add(prismatic, 1);
bumper.add(distance, 1);
Part part = new Part(getPartShape());
part.addComponent(base);
part.addComponent(bumper);
return part;
}
private DistanceConstraintBehaviorFactory createDistanceJoint() {
DistanceJointData distanceData = new DistanceJointData();
distanceData.setAnchorA(new Vec2(0f, 0f));
distanceData.setAnchorB(new Vec2(3f, 0f));
distanceData.setDampingRatio(1.0f);
distanceData.setFrequency(12.5f);
distanceData.setLength(3.0f);
DistanceConstraintBehaviorFactory distance = new DistanceConstraintBehaviorFactory(
distanceData);
return distance;
}
private PrismaticConstraintBehaviorFactory createPrismaticJoint() {
PrismaticJointData prismaticData = new PrismaticJointData();
prismaticData.setAnchorA(new Vec2(0f, 0f));
prismaticData.setAnchorB(new Vec2(3f, 0f));
prismaticData.setMaxLength(6.0f);
prismaticData.setMinLength(0.5f);
PrismaticConstraintBehaviorFactory prismatic = new PrismaticConstraintBehaviorFactory(
prismaticData);
return prismatic;
}
private CollisionBehaviorFactory createBumperCollision() {
Primitive bumperShape = new Primitive();
bumperShape.AddVertex(new Vec2(2.5f, -0.5f));
bumperShape.AddVertex(new Vec2(3.5f, -0.5f));
bumperShape.AddVertex(new Vec2(3.5f, 0.5f));
bumperShape.AddVertex(new Vec2(2.5f, 0.5f));
CollisionBehaviorFactory bumperCol = new CollisionBehaviorFactory(
bumperShape, Material.METAL);
return bumperCol;
}
private CollisionBehaviorFactory createBaseCollision() {
Primitive baseShape = new Primitive();
baseShape.AddVertex(new Vec2(-0.5f, -0.5f));
baseShape.AddVertex(new Vec2(0.5f, -0.5f));
baseShape.AddVertex(new Vec2(0.5f, 0.5f));
baseShape.AddVertex(new Vec2(-0.5f, 0.5f));
CollisionBehaviorFactory base = new CollisionBehaviorFactory(baseShape,
Material.METAL);
return base;
}
private Component createBaseComponent() {
Socket baseSocket = new Socket();
baseSocket.addLink(-1, 0);
baseSocket.addLink(0, 1);
baseSocket.addLink(0, -1);
Component base = new Component(baseSocket);
return base;
}
private Component createBumperComponent() {
Component bumper;
Socket bumperSocket = new Socket();
bumperSocket.addLink(7, 0);
bumperSocket.addLink(6, 1);
bumperSocket.addLink(6, -1);
bumper = new Component(bumperSocket);
return bumper;
}
private Shape getPartShape() {
return new Shape("XXXX");
}
}