[java]
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
import javafx.util.Duration;
import org.jbox2d.collision.AABB;
import org.jbox2d.collision.shapes.CircleShape;
import org.jbox2d.collision.shapes.PolygonShape;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.BodyType;
import org.jbox2d.dynamics.FixtureDef;
import org.jbox2d.dynamics.World;
import org.wing.jfx.physics.test.body.WBody;
import org.wing.jfx.physics.test.body.WBoxBody;
import org.wing.jfx.physics.test.body.WCircleBody;
public class CanvasScreen extends Canvas {
private GraphicsContext gc;
private Timeline mTimeline;
private double duration = 10;
private static final int RATE = 10;
private World world;
private AABB aabb;
private BodyDef bd;
private List
public CanvasScreen(double width, double height) {
super(width, height);
Vec2 gravity = new Vec2(-1.0f, 10.0f);
world = new World(gravity);
Vec2 minV = new Vec2(-100.0f, -100.0f);
Vec2 maxV = new Vec2(100.0f, 100.0f);
aabb = new AABB();
aabb.lowerBound.set(minV);
aabb.upperBound.set(maxV);
world.queryAABB(null, aabb);
bd = new BodyDef();
gc = getGraphicsContext2D();
initObjects();
}
public void init() {
mTimeline = new Timeline();
mTimeline.setCycleCount(Timeline.INDEFINITE);
KeyFrame frame = new KeyFrame(Duration.millis(duration), new EventHandler
@Override
public void handle(ActionEvent event) {
draw(gc);
update();
}
});
mTimeline.getKeyFrames().add(frame);
mTimeline.play();
}
public void initObjects(){
createPolygon(10, 500, (int) getWidth() - 10 * 2, 10, 0.3f, 0.6f, true);
createPolygon(10, 10, 10, 500, 0.3f, 0.6f, true);
createPolygon((int) getWidth() - 10 * 2, 10, 10, 500, 0.3f, 0.6f, true);
float restitution[] = new float[] { 0.9f, 0.9f, 0.9f, 0.9f, 0.75f, 0.9f, 1.0f, 0.6f, 0.8f, 0.4f, 0.9f, 0.9f,
0.9f, 0.9f, 0.75f, 0.9f, 1.0f, 0.6f, 0.8f, 0.4f, 0.9f, 0.9f, 0.9f, 0.9f, 0.75f, 0.9f, 1.0f, 0.6f, 0.8f,
0.4f, 0.9f, 0.9f, 0.9f, };
for (int i = 0; i < restitution.length; i++) {
createCircle(80 + i * 20, 5 * i, 15, 0.3f, restitution[i], false);
}
}
public void draw(GraphicsContext gc) {
gc.clearRect(0, 0, getWidth(), getHeight());
gc.setFill(Color.BLACK);
gc.fillRect(0, 0, getWidth(), getHeight());
for(WBody mBody : bodys){
mBody.draw(gc);
}
}
public void update() {
for(WBody body : bodys){
body.update();
}
world.step(1.0f / 60.0f, 8, 3);
}
/**
* 创建矩形
*/
public void createPolygon(float x, float y, float w, float h, fl