在JavaFX中使用物理引擎JBox2D
周末突然想到了,游戏引擎里自然是需要一个物理引擎的,于是研究了一下JBox2D(至于为什么是JBox2D,也只是因为觉得JBox2D的可移植性更好,是否采用其他的物理引擎等以后再说)。
由于本人开发的JavaFX的游戏引擎WJFXGame目前在赶工中,里面的物理引擎的例子发出来也不容易学习。所以我又重新写了个。
其实很简单,JBox2D的物理操作和图形渲染是分开的,我们只需要负责处理图形渲染的部分即可。
示例地址: 点击
我们在这里使用的是官网下载的最新版的JBox2D,如下图所示:
首先,我们新建一个JBox2D中的刚体与JavaFX里面的图形结合的一个类WBody。
[java]
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Paint;
import org.jbox2d.dynamics.Body;
public abstract class WBody{
protected Body mBody;
protected Paint mColor;
protected final static int RATE = 30;
protected double x,y,width,height;
public Body getBody() {
return mBody;
}
public void setBody(Body mBody) {
this.mBody = mBody;
}
public Paint getColor() {
return mColor;
}
public void setColor(Paint mColor) {
this.mColor = mColor;
}
public abstract void draw(GraphicsContext gc);
public abstract void update();
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public void setLocation(double x,double y){
setX(x);
setY(y);
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
}
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Paint;
import org.jbox2d.dynamics.Body;
public abstract class WBody{
protected Body mBody;
protected Paint mColor;
protected final static int RATE = 30;
protected double x,y,width,height;
public Body getBody() {
return mBody;
}
public void setBody(Body mBody) {
this.mBody = mBody;
}
public Paint getColor() {
return mColor;
}
public void setColor(Paint mColor) {
this.mColor = mColor;
}
public abstract void draw(GraphicsContext gc);
public abstract void update();
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public void setLocation(double x,double y){
setX(x);
setY(y);
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
}
这个类中,包含了一个刚体body,和一系列位置大小等属性的设置。为了简单,这里都是用的普通的属性,没有使用可绑定的属性(在WJFXGame中,我都是使用的JavaFX的可绑定的属性)。
RATE是屏幕与世界的比例。通常这个比例越大,由于重力速度相同,在屏幕里看到的会运动的更快。
然后我们创建一个圆的WBody,叫WCircleBody。
[java]
import org.jbox2d.dynamics.Body;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Paint;
public class WCircleBody extends WBody {
protected DoubleProperty radius;
public WCircleBody(Body body, double radius, Paint color){
this.mBody = body;
this.radius = new SimpleDoubleProperty(radius);
this.mColor = color;
}
@Override
public void draw(GraphicsContext gc) {
gc.save();
gc.setFill(mColor);
gc.fillOval(getX(), getY(), getRaidus() * 2, getRaidus() * 2);
gc.restore();
}
@Override
public void update() {
setX(mBody.getPosition().x * RATE - getRaidus());
setY(mBody.getPosition().y * RATE - getRaidus());
}
public double getWidth(){
return 2 * getRaidus();
}
public double getHeight(){
return 2 * getRaidus();
 
补充:软件开发 , Java ,