2015-12-14 2 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. –