2016-08-24 1 views
0

저는이 문제에 정말로 도움이 될 수 있습니다. 나는 단순한 게임에서 블록을 땅으로 만들려고 노력하고있다. 그리고 다른 블록이 그 위에 떨어지면 조금 튀어 오르지 만 그 첫 번째 블록에서 떨어지도록 상자를 왼쪽이나 오른쪽으로 움직일 수 있어야한다. 누구든지 이걸 좀 도와 주실 래요?Java LibGDX는 물리학 자 본체와 중력을 사용할 수 없습니다.

PoprostuRonin과 dermetfan의 YouTube 비디오 덕분에 관심있는 사람이라면 찾고 있던 결과를 얻을 수있었습니다. 프로젝트에서 아래 코드를 시도해보고 스프라이트 텍스처 만 변경할 수 있습니다.

private Box2DDebugRenderer debugRenderer; 
private OrthographicCamera camera; 
private float spriteSpeed = 500000; 
private World world; 
private Sprite playersprite; 
private Sprite groundsprite; 
private Body playerBody; 
private Body groundbody; 
private Vector2 movement = new Vector2(); 
private Array<Body> tmpBodies = new Array<Body>(); 

public TestState(GameStateManager gsm) { 
    super(gsm); 

    Gdx.input.setInputProcessor(this); 

    batch = new SpriteBatch(); 

    debugRenderer = new Box2DDebugRenderer(); 
    camera = new OrthographicCamera(); 

    // Sprites 
    playersprite = new Sprite(new Texture("badlogic.jpg")); 
    groundsprite = new Sprite(new Texture("ground-tiles-01.gif")); 

    // World 
    world = new World(new Vector2(0, -9.8f), true); 

    // Player Sprite 
    // Body definition 
    BodyDef bodyDef = new BodyDef(); 
    bodyDef.type = BodyType.DynamicBody; 
    bodyDef.position.set(0, 200); //1m 

    PolygonShape shape = new PolygonShape(); 
    shape.setAsBox(10, 10); 

    // Fixture definition 
    FixtureDef fixtureDef = new FixtureDef(); 
    fixtureDef.shape = shape; 
    fixtureDef.density = 2.5f; //2.5kg 
    fixtureDef.friction = 0; //0-1 
    fixtureDef.restitution = .75f; //0-1 

    playerBody = world.createBody(bodyDef); 
    playerBody.createFixture(fixtureDef); 
    playerBody.setUserData(playersprite); 
    playersprite.setSize(20, 20); 
    playersprite.setOrigin(playersprite.getWidth()/2, playersprite.getHeight()/2); 
    shape.dispose(); 

    // Ground Sprite 
    // Body definition 
    BodyDef groundbodyDef = new BodyDef(); 
    groundbodyDef.type = BodyType.StaticBody; 
    groundbodyDef.position.set(0, 0); //1m 

    PolygonShape groundshape = new PolygonShape(); 
    groundshape.setAsBox(groundsprite.getHeight()/2, groundsprite.getWidth()/2); 

    // Fixture definition 
    FixtureDef groundfixtureDef = new FixtureDef(); 
    groundfixtureDef.shape = groundshape; 
    groundfixtureDef.density = 100; //2.5kg 
    groundfixtureDef.friction = .25f; //0-1 
    groundfixtureDef.restitution = 0; //0-1 

    groundbody = world.createBody(groundbodyDef); 
    groundbody.createFixture(groundfixtureDef); 
    groundbody.setUserData(groundsprite); 
    groundsprite.setSize(groundsprite.getHeight(), groundsprite.getWidth()); 
    groundsprite.setOrigin(groundsprite.getWidth()/2, groundsprite.getHeight()/2); 

    groundshape.dispose(); 
} 

@Override 
public void update(float delta) { 
    camera.viewportWidth = Gdx.graphics.getWidth(); 
    camera.viewportHeight = Gdx.graphics.getHeight(); 
} 

@Override 
public void render() { 
    Gdx.gl.glClearColor(50/255f, 213/255f, 237/255f, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    debugRenderer.render(world, camera.combined); 
    batch.setProjectionMatrix(camera.combined); 
    world.step(Gdx.graphics.getDeltaTime(), 6, 2); 

    playerBody.applyForceToCenter(movement, true); 

    batch.begin(); 
    world.getBodies(tmpBodies); 
    for (Body body : tmpBodies){ 
     if (body.getUserData() != null && body.getUserData() instanceof Sprite) { 
      Sprite sprite = (Sprite) body.getUserData(); 
      sprite.setPosition(body.getPosition().x - sprite.getWidth()/2, body.getPosition().y - sprite.getHeight()/2); 
      sprite.setRotation(body.getAngle() * MathUtils.radiansToDegrees); 
      sprite.draw(batch); 
     } 
    } 
    batch.end(); 

    camera.position.set(playerBody.getPosition().x, playerBody.getPosition().y, 0); 
    camera.update(); 

} 

@Override 
public void dispose() { 
    world.dispose(); 
    playersprite.getTexture().dispose(); 
    groundsprite.getTexture().dispose(); 
} 

@Override 
public boolean keyDown(int keycode) { 
    switch (keycode) { 
    case Keys.DPAD_LEFT: 
     movement.x = -spriteSpeed; 
     break; 
    case Keys.DPAD_RIGHT: 
     movement.x = spriteSpeed; 
     break; 
    case Keys.DPAD_UP: 
     movement.y = spriteSpeed; 
     break; 
    case Keys.DPAD_DOWN: 
     movement.y = -spriteSpeed; 
    } 
    return true; 
} 

@Override 
public boolean keyUp(int keycode) { 
    switch (keycode) { 
    case Keys.DPAD_LEFT: 
    case Keys.DPAD_RIGHT: 
     movement.x = 0; 
     break; 
    case Keys.DPAD_UP: 
    case Keys.DPAD_DOWN: 
     movement.y = 0; 
    } 
    return true; 
} 
+0

결과가 무엇인지 설명해 주시겠습니까? 그 중 하나는 Body 대신 Sprite를 이동시키고 Position은 render 메소드에서 다시 resettet을 얻는 것입니다. 그리고 항상 groundsprite의 위치를 ​​업데이트하지 않아도됩니다. 한 번만 생성자에서 수행하십시오. – Draz

+0

답장을 보내 주셔서 감사합니다. 첫 번째 상자가 다른 상자보다 먼저 시작되어 다른 상자 위에 중력과 땅으로 인해 떨어지지 만 붙어있어 움직일 수 없습니다. –

+0

그래서 코드를 다음과 같이 수정했습니다. 스프라이트 대신 몸체를 움직여보십시오. 여전히 작동하지 않으며 동작이 모두 싱크가 맞지 않습니다. 중력이 뒤 바뀌어 몸과 스프라이트가 서로 정렬되지 않습니다. 롤, 내가 뭘 잘못하고 있는거야? –

답변

1

코드는 유효하지만 숫자는 문제가 아닙니다.

몸무게가 크므로 20480kg입니다. 당신이 그것을 요청 때문에 중력 반전 :

world = new World(new Vector2(0, -1000f), true); 

-1000를, 그 아래 0 그래서 덜 제어에 의해 원인 개체 (당신의 "행성"지구에 9.8 1000) 반전과 큰 숫자입니다.

변경 값은 :

float spriteSpeed = 60000; 
... 
world = new World(new Vector2(0, 9.8F), true); 
... 
fixtureDef.density = 1; 
fixtureDef2.density = 1; 

당신은 몸이 (그것도 날 수) 제어 지금 것을 알 수 있습니다. 이 숫자로 연습하고 무엇을하고 있는지 아이디어를 가지기위한 몇 가지 기본 물리 규칙을 익히십시오.

스프라이트와 본문 위치는으로 동기화되지만 제대로 정렬되지 않습니다. 이 코드를 사용하여 몸체와 텍스처를 정렬하는 첫 번째 단계를 수행하십시오.

sprite.setCenter(body.getPosition().x, body.getPosition().y); 
groundsprite.setCenter(ground.getPosition().x, ground.getPosition().y); 

그러나

groundsprite.setOriginCenter(); 
sprite.setOriginCenter(); 

groundsprite.setRotation(ground.getAngle() * MathUtils.radDeg); 
sprite.setRotation(body.getAngle() * MathUtils.radDeg); 

개체가 하나의 텍스처이며, 우리는 단순히 중심을 정렬 할 수있는이 간단하지만 객체가 더 복잡한 코드가 필요 해짐에 따라 변경 될 회전에 대해.

+0

고맙습니다 귀하의 권장 사항을 검토하겠습니다. –

관련 문제