2014-09-26 2 views
0

В настоящее время я работаю над катапультой с box2d, но у меня возникла проблема относительно вращения руки катапульты.Catapult Рука вращения - libgdx и box2d

Позвольте мне объяснить немного о моей катапульты:

У меня есть 2 объекта. * Рычаг катапульты - Динамический корпус * База катапульты - Статический корпус

Я хочу, чтобы рычаг катапульты вращался вперед и назад в определенном диапазоне. Вот изображение моей катапульты: http://i.gyazo.com/7ce4dfa87b2083a0eb62df7c4acd3e47.png

Теперь я пытался «связать их» с помощью шарниров, но это не сработало. Сначала я хочу, чтобы рука немного наклонилась влево. У меня есть свой объект Game World, который содержит объект мира Box2d и все игровые объекты. Более того, у меня есть объект, который называется Game Renderer, который заботится о рендеринге в игре. Вот то, что я пытался до сих пор в моем объекте Game World:

package com.david.gameworld; 

import com.badlogic.gdx.math.Vector2; 
import com.badlogic.gdx.physics.box2d.World; 
import com.badlogic.gdx.physics.box2d.joints.RevoluteJointDef; 
import com.david.objects.CatapultArm; 
import com.david.objects.CatapultBase; 

public class GameWorld{ 

    private World b2dWorld; 
    private CatapultArm arm; 
    private CatapultBase base; 
    private RevoluteJointDef jointDef; 
    public GameWorld() { 
     // Initialize The Box2d World 
     b2dWorld = new World(new Vector2(0,0),true); 
     initializeObjects(); 
    } 
    public CatapultArm getArm() { 
     return arm; 
    } 
    public CatapultBase getBase() { 
     return base; 
    } 
    public World getBox2DWorld() { 
     return b2dWorld; 
    } 
    public void updateWorld(float delta) { 
     b2dWorld.step(1/delta, 8, 5); 
    } 
    private void initializeObjects() { 
     // Initialize The Objects(Catapult, Base) 
     arm = new CatapultArm(b2dWorld); 
     base = new CatapultBase(b2dWorld); 
     jointDef = new RevoluteJointDef(); 
     jointDef.initialize(arm.getBody(), base.getBody(), new Vector2(120,62)); 
     jointDef.enableMotor = true; 
     jointDef.enableLimit = true; 
     jointDef.motorSpeed = -1260; 
     jointDef.lowerAngle = (float) Math.toRadians(90); 
     jointDef.upperAngle = (float) Math.toRadians(75);; 
     jointDef.maxMotorTorque = 4800; 
     b2dWorld.createJoint(jointDef); 
    } 
} 

CatapultArm и CatapultBase как объекты в моей игре, которая содержит все конфигурации тел (расположение, тип и т.д.).

Вот коды:

CatapultBase.java

package com.david.objects; 

import com.badlogic.gdx.physics.box2d.BodyDef; 
import com.badlogic.gdx.physics.box2d.World; 
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; 

public class CatapultBase extends ObjectInWorld{ 

    public CatapultBase(World world) { 
     super(world); 
     initiate(); 
    } 
    @Override 
    protected void initiate() { 
     //The Body 
     bodyDef = new BodyDef(); 
     bodyDef.type = BodyType.StaticBody; 
     bodyDef.position.set(140f, 62f); 
     body = world.createBody(bodyDef); 
    } 
} 

CatapultArm.java

package com.david.objects; 

import com.badlogic.gdx.physics.box2d.BodyDef; 
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; 
import com.badlogic.gdx.physics.box2d.World; 

public class CatapultArm extends ObjectInWorld{ 

    public CatapultArm(World world) { 
     super(world); 
     initiate(); 
    } 

    @Override 
    protected void initiate() { 
     //The Body 
     bodyDef = new BodyDef(); 
     bodyDef.type = BodyType.DynamicBody; 
     bodyDef.position.set(154f, 62f); 
     body = world.createBody(bodyDef); 
    } 
} 

ObjectInWorld.java

package com.david.objects; 

import com.badlogic.gdx.physics.box2d.Body; 
import com.badlogic.gdx.physics.box2d.BodyDef; 
import com.badlogic.gdx.physics.box2d.World; 

public abstract class ObjectInWorld { 

    protected BodyDef bodyDef; 
    protected Body body; 
    protected World world; 
    protected ObjectInWorld(World world) { 
     this.world = world; 
    } 

    protected void initiate() { 

    } 
    public float getX() { 
     return body.getPosition().x; 
    } 
    public float getY() { 
     return body.getPosition().y; 
    } 
    public Body getBody() { 
     return body; 
    } 
} 

Как я могу "контактный" катапульт основание, чтобы оно хорошо вращалось?

+0

Пожалуйста, определите, что «не работает». – iforce2d

+0

Предположим, что он слегка наклонился влево из-за установленных мной пределов (от 9 до 75 градусов), но это не так. Я думаю, что у меня проблема с использованием координат. –

+0

Кто-нибудь? ......... –

ответ

0

Ваши тела не имеют на них никаких светильников. По крайней мере, в исходной версии C++ это может привести к тому, что они не будут иметь плотность и, следовательно, нет массы, поэтому они будут рассматриваться как фиксированное вращение.