当前位置:编程学习 > JAVA >>

在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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,