2013-07-01 5 views
1

Я пытаюсь создать простую теннисную игру. У каждой стороны есть стена. Есть также коробка и мяч. У моей окружающей среды нет гравитации. Коробка и мяч не имеют никакой скорости. Когда коробка связывается с шаром (я перемещаю его с помощью мыши с разной скоростью), он (мяч) просто меняет свое положение и не продолжает двигаться, и иногда эти объекты не сталкиваются друг с другом:Box2D (LibGDX) - странное поведение мяча

enter image description here

Я хочу, чтобы ящик мог ударить по мячу разными углами и силой.

enter image description here

Как я могу это сделать? Что я должен изменить в свойствах мяча и коробки?

Фрагмент кода ниже:

public void createBall(Vector2 position, Vector2 velocity, float angle, Object userData){ 
    // First we create a body definition 
    BodyDef bodyDef = new BodyDef(); 
    // We set our body to dynamic, for something like ground which doesnt move we would set it to StaticBody 
    bodyDef.type = BodyType.DynamicBody; 
    // Set our body's starting position in the world 
    bodyDef.position.set(position); 

    // Create our body in the world using our body definition 
    Body body = world.createBody(bodyDef); 

    body.setUserData(userData); 
    // Create a circle shape and set its radius to 6 
    CircleShape circle = new CircleShape(); 
    circle.setRadius(10f); 

    PolygonShape poly = new PolygonShape();  
    poly.setAsBox(12, 12); 

    // Create a fixture definition to apply our shape to 
    FixtureDef fixtureDef = new FixtureDef(); 
    fixtureDef.shape = circle; 
    fixtureDef.density = 0.0f; 
    fixtureDef.friction = 0.2f; 
    fixtureDef.restitution = 1f; // Make it bounce a little bit 
    fixtureDef.isSensor=false; 

    // Create our fixture and attach it to the body 
    Fixture f = body.createFixture(fixtureDef); 
    f.setUserData("ball");  
    circle.dispose(); 
} 

    private Body createBox(World world, float width, float height, float density) { 
     BodyDef def = new BodyDef(); 
     def.type = BodyType.KinematicBody; 
     Body box = world.createBody(def); 

     PolygonShape poly = new PolygonShape(); 
     poly.setAsBox(width/2, height/2); 

     FixtureDef fixtureDef = new FixtureDef(); 
     fixtureDef.shape = poly; 
     fixtureDef.density = 0.0f; 
     fixtureDef.friction = 0.3f; 
     fixtureDef.restitution = 0.1f; // Make it bounce a little bit 
     fixtureDef.isSensor=false; 

     // Create our fixture and attach it to the body 
     Fixture f = box.createFixture(fixtureDef); 
     f.setUserData("platform"); 
     poly.dispose(); 

     return box; 
    } 
     public void createWall(World world, Vector2 position, float hx, float hy){ 
    // Create our body definition 
    BodyDef groundBodyDef =new BodyDef(); 
    // Set its world position 
    groundBodyDef.position.set(position); 
     groundBodyDef.type=BodyType.StaticBody; 
    // Create a body from the defintion and add it to the world 
    Body groundBody = world.createBody(groundBodyDef); 

    // Create a polygon shape 
    PolygonShape groundBox = new PolygonShape(); 
    // Set the polygon shape as a box which is twice the size of our view port and 20 high 
    // (setAsBox takes half-width and half-height as arguments) 
    groundBox.setAsBox(hx, hy); 
    // Create a fixture from our polygon shape and add it to our ground body 
    groundBody.createFixture(groundBox, 0.0f); 
    // Clean up after ourselves 
    groundBox.dispose(); 
} 

ответ

3

Вы перемещаете свою коробку, меняя ее положение. Но важной частью разрешения столкновения является скорость. И скорость вашей коробки всегда равна нулю (из точки зрения box2d). Таким образом, вы испытываете странное разрешение столкновений

+0

Как это сделать, если я хочу использовать мышь для перемещения? Какие функции я должен использовать? – Nolesh

+0

@Ares: взгляните на b2MouseJoint. Вы можете комбинировать его с фиксированным вращением тела. Также вы можете как-то рассчитать скорость платформы, а не ее позицию от мыши. – Andrew

+0

Не могли бы вы поделиться ссылкой, пожалуйста? – Nolesh

0

Box2D не любит тела, какие приборы имеет плотность 0. Обычная, моделирование выполняет так или иначе, но поведение не является правильным. Например, попробуйте значение 0,3.

Проблема с перекрытием может быть решена установкой флага b2BodyDef :: bullet. Там описание от Box2D ссылки:

BOOL b2BodyDef :: пуля

Является ли это быстро движущееся тело, которое должно быть предотвращено туннелирования через других движущихся тел? Обратите внимание, что все тела предотвращаются туннелированием через кинематические и статические тела. Этот параметр рассматривается только в динамических телах.

Предупреждение: Вы должны использовать этот флаг экономно, так как он увеличивает время обработки.

+0

Что означает плотность? – Nolesh

+0

К сожалению, это не работает. Такое же поведение. – Nolesh

1

Я думаю, что ширина и высота экрана слишком велики ... если это случай, попробуйте использовать ширину и высоту мира ... 20x12 единиц .. не 800x480 что-то.

+2

это помогло мне однажды –

+0

Вы имеете в виду, что я должен установить ширину и высоту «Орфографической камеры» на 20 и 12 единиц соответственно? – Nolesh

+0

да попробуйте ... и все объекты соответственно ... как для 800/40 = 20 и 480/40 = 12 ... так что все ваши объекты ширина и высота должны быть разделены на 40 ... Попробуйте это стоит a shot –

Смежные вопросы