2011-10-10 46 views
1

我在JBox2D有一些问题。我已经创建了一个球和世界,并且尽可能正确地说出了一切,但是当我调用world.step()方法时,它不会使球从重力下落。使动态物体下降JBox2D

这里是我创建对象:

package objects; 

import org.jbox2d.collision.shapes.CircleShape; 
import org.jbox2d.collision.shapes.PolygonShape; 
import org.jbox2d.common.Vec2; 
import org.jbox2d.dynamics.BodyDef; 
import org.jbox2d.dynamics.BodyType; 
import org.jbox2d.dynamics.FixtureDef; 
import org.lwjgl.opengl.GL11; 

import util.GLColor; 
import util.Location; 
import util.Size; 

public class PlayerCircle extends DefaultObject{ 


GLColor c = new GLColor(25,255,255); 



public PlayerCircle(Location l,Size s){ 
    super(l,s); 
    load(l.getX(),l.getY()); 
} 

BodyDef bd = new BodyDef(); 
FixtureDef fd = new FixtureDef(); 
public static CircleShape cd = new CircleShape(); 

public void load(double x, double y){ 


    bd.type = BodyType.DYNAMIC; 
    // bd.position = new Vec2(0.0f, -10.0f); 
    cd.m_radius = s.getRadius()/Main.Main.scaleX; 

    //cd.m_p.set((float)x/Main.Main.scaleX,(float)y/Main.Main.scaleY); 
    bd.position = new Vec2((float)x/Main.Main.scaleX,(float)y/Main.Main.scaleY); 
    fd.friction = .1f; 
    fd.density = 2f; 
    fd.shape = cd; 

    Main.Main.getWorld().createBody(bd).createFixture(fd); 
    // bd.allowSleep = false; 
} 
} 

继承人,其中主循环代码:

public void run() throws LWJGLException, InterruptedException{ 
    Vec2 gravity = new Vec2(2f, -.1f); 
    world = new World(gravity, true); 
    Display.setDisplayMode(new DisplayMode(900,700)); 
    Display.create(); 
    GL11.glMatrixMode(GL11.GL_PROJECTION); 
    GL11.glLoadIdentity(); 
    GL11.glOrtho(0, scaleX, 0, scaleY, 1, -1); 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); 

    level = new Level1(); 
    level.load(); 

    level.start(); 


    float tempStep = 1.0f/60.0f; 
    int VI = 6; 
    int POSI = 2; 
    int a = 0; 

    while(!done){ 
     //System.out.println(world.getContactCount() + " "+world.getGravity().x); 

     world.step(tempStep, VI, POSI); 

     Display.update(); 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); 

     logic(); 

     if (Display.isVisible() || Display.isDirty()) { 
      render(); 
     } 


     if(Display.isCloseRequested()){ 
      done = true; 
     } 
     Thread.sleep(1); 
    } 
} 
} 

测试类

package test; 

import objects.PlayerCircle; 

import org.jbox2d.common.Vec2; 
import org.jbox2d.dynamics.World; 

import util.Location; 
import util.Size; 

public class Test { 
static Vec2 gravity = new Vec2(2f, -.5f); 

static float tempStep = 1.0f/60.0f; 
static int VI = 6; 
static int POSI = 2; 
public static World world = new World(gravity,true); 
public static void main(String args[]){ 

    PlayerCircle pc = new PlayerCircle(new Location(400,5000),new Size(10)); 
    while(true){ 
     world.step(tempStep, VI, POSI); 
     try{Thread.sleep(10);}catch(Exception e){} 
     System.out.println(pc.bd.position.y);  

    } 

} 
} 

从打印结果

7.142857 
7.142857 
7.142857 
7.142857 
7.142857 
7.142857 
7.142857 
7.142857 
7.142857 
7.142857 
+0

你真的会创建一个'PlayerCircle '实例'?上述代码在哪里发生? – Thomas

+0

它被创建在关卡代码(一个单独的类) '公众PlayerCircle播放器=新PlayerCircle(新位置(10,300),新尺寸(20));' –

+0

好吧,那代码叫什么?我假设'World'是一个JBox2D类,所以在创建世界和调用'step(...)'之间的地方是在做什么? – Thomas

回答

0

从Body对象获取y位置,而不是BodyDef对象。

要通过pc.yourBodyVariableNameHere.m_xf.position.y为此,存储由Main.Main.getWorld()返回的Body对象。createBody(BD)和访问它的位置