2015-12-14 26 views
1

大家晚上好。 我在請求你的幫助!我正在發現Box2D,但我已經在努力處理幾件事情:JBox2D爲什麼重力會倒轉?

我的重力被顛倒了,我不明白爲什麼。 而我的第二個問題是,我無法設法以調試方式繪製它。 我不得不手動繪製它才能看到一些東西。

這裏是一個代碼示例玩!

package tests; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

import engine.jbox2d.collision.shapes.CircleShape; 
import engine.jbox2d.collision.shapes.PolygonShape; 
import engine.jbox2d.common.Vec2; 
import engine.jbox2d.dynamics.Body; 
import engine.jbox2d.dynamics.BodyDef; 
import engine.jbox2d.dynamics.BodyType; 
import engine.jbox2d.dynamics.FixtureDef; 
import engine.jbox2d.dynamics.World; 

public class JBox2DTest extends JPanel 
{ 
    private static final long serialVersionUID = 7173873195721096625L; 

    // model 
    private World   world; 
    private Ball    ball; 

    public JBox2DTest() 
    { 
     // Création du monde 
     world = new World(new Vec2(0.0f, -9.81f)); 

     // Création d'un sol 
     new Ground(world); 

     // Création d'une balle 
     this.ball = new Ball(world); 

     //Création de la frame 
     JFrame frame = new JFrame(); 
     frame.setSize(800, 600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(this); 
     frame.setVisible(true); 

     //Loop 
     Timer simulationTimer = new Timer(10, new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       world.step(1.0f/60.0f, 6, 2); 
       repaint(); 
      } 
     }); 
     simulationTimer.start(); 
    } 

    public void paint(Graphics g) 
    { 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, this.getWidth(), this.getHeight()); 
     ball.draw((Graphics2D) g); 
    } 

    public static void main(String[] args) 
    { 
     new JBox2DTest(); 
    } 
} 

class Ground 
{ 
    Body body; 

    public Ground(World world) 
    { 
     BodyDef groundBodyDef = new BodyDef(); 
     groundBodyDef.position.set(0.0f, -10.0f); 
     body = world.createBody(groundBodyDef); 
     PolygonShape groundBox = new PolygonShape(); 
     groundBox.setAsBox(800.0f, 10); 
     body.createFixture(groundBox, 0.0f); 
    } 
} 

class Ball 
{ 
    private Body body; 

    public Ball(World world) 
    { 
     BodyDef bodyDef = new BodyDef(); 
     bodyDef.type = BodyType.DYNAMIC; // Sujet aux forces 
     bodyDef.position.set(800/2, 600/2); 
     this.body = world.createBody(bodyDef); 
     CircleShape dynamicCirle = new CircleShape(); 
     dynamicCirle.setRadius(10f); 
     FixtureDef fixtureDef = new FixtureDef(); 
     fixtureDef.shape = dynamicCirle; 
     fixtureDef.density = 1.0f; 
     fixtureDef.friction = 0.3f; 
     fixtureDef.restitution = 0.3f; 
     body.createFixture(fixtureDef); 
    } 

    public void draw(Graphics2D g2d) 
    { 
     g2d.setColor(Color.RED); 

     Vec2 ballPos = body.getPosition(); 
     float ballRadius = body.getFixtureList().getShape().getRadius(); 

     g2d.drawOval(
      (int) (ballPos.x - ballRadius), 
      (int) (ballPos.y - ballRadius), 
      (int) (ballRadius * 2), 
      (int) (ballRadius * 2) 
     ); 
    } 
} 

非常感謝您的幫助! 最好的問候, Alann

+0

你應該儘量一次只問一個問題。其他一切都會混淆Q/A網站的結構。關於重力:OpenGL和許多遊戲引擎使用右手座標系:X點向右,Y點向上(Z點指向觀察者,在2D情況下)。所以你需要一個沿*負* Y軸指向的力來模擬拉*下*的重力。 – Marco13

+0

你說得對,我會編輯我的問題來尊重這條規則。 感謝您的信息。另外,我能夠進行調試工作。 –

回答

0

它顯然取決於你正在使用的Box2D的實施。重力可能得到扭轉你的版本:

world = new World(new Vec2(0.0f, -9.81f)); 

應該沒有負:

world = new World(new Vec2(0.0f, 9.81f)); 
+0

對,即使它對我來說聽起來不合邏輯,我知道了:p。 –