저는이 문제에 정말로 도움이 될 수 있습니다. 나는 단순한 게임에서 블록을 땅으로 만들려고 노력하고있다. 그리고 다른 블록이 그 위에 떨어지면 조금 튀어 오르지 만 그 첫 번째 블록에서 떨어지도록 상자를 왼쪽이나 오른쪽으로 움직일 수 있어야한다. 누구든지 이걸 좀 도와 주실 래요?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;
}
결과가 무엇인지 설명해 주시겠습니까? 그 중 하나는 Body 대신 Sprite를 이동시키고 Position은 render 메소드에서 다시 resettet을 얻는 것입니다. 그리고 항상 groundsprite의 위치를 업데이트하지 않아도됩니다. 한 번만 생성자에서 수행하십시오. – Draz
답장을 보내 주셔서 감사합니다. 첫 번째 상자가 다른 상자보다 먼저 시작되어 다른 상자 위에 중력과 땅으로 인해 떨어지지 만 붙어있어 움직일 수 없습니다. –
그래서 코드를 다음과 같이 수정했습니다. 스프라이트 대신 몸체를 움직여보십시오. 여전히 작동하지 않으며 동작이 모두 싱크가 맞지 않습니다. 중력이 뒤 바뀌어 몸과 스프라이트가 서로 정렬되지 않습니다. 롤, 내가 뭘 잘못하고 있는거야? –