在JavaFX中使用物理引擎JBox2D (四)

2014-11-24 11:33:11 · 作者: · 浏览: 30
继承Canvas,来负责所有的绘制和更新操作。

[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 bodys = new CopyOnWriteArrayList<>();
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();

init();
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