내 게임에 3 개의 시체, 위에서 떨어지는 공 동적 몸체, 땅에 정적 인 땅과 역동적 인 몸체가 있습니다. 볼이 땅과 직접 충돌 할 때 또는 운동기구가 무거운 중력 아래에서 벌금,하지만 공을 먼저 지상에서 동적 본문과 충돌 후 땅에 반송, 이상한 일이 스프라이트 나뭇잎 시체가 발생하고 화면에서 날아갑니다. 나는 이것을 이해하기 위해 Box2DDebugRenderer를 사용했다. 내 바닥 코드는 여기 if (ground! = null) world.destroyBody (ground);스프라이트 이미지는 Libgdx의 고정 접지 본체와 충돌 한 후 동적 본체를 벗어납니다.
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.StaticBody;
FixtureDef fixtureDef = new FixtureDef();
PolygonShape shape = new PolygonShape();
shape.setAsBox(camera.viewportWidth, 5);
fixtureDef.shape = shape;
fixtureDef.friction=0.2f;
fixtureDef.filter.categoryBits = WORLD_ENTITY;
fixtureDef.filter.maskBits = PHYSICS_ENTITY;
ground = world.createBody(bodyDef);
ground.createFixture(fixtureDef);
ground.setTransform(0, 0, 0);
shape.dispose();'
private Body createBody(String name, float x, float y, float rotation) {
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
Body body = playerPhysics.createBody(name, world, bodyDef, SCALE, SCALE);
body.setTransform(x, y, rotation);
body.setLinearDamping(50f);
body.setGravityScale(0);
body.setFixedRotation(true);
return body;
}
이 메서드
을 만들 접촉 처리하는 방법을@Override
public void render() {
Gdx.gl.glClearColor(0.57f, 0.77f, 0.85f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stepWorld();
viewport.apply();
elapsedTime+=Gdx.graphics.getDeltaTime();
position =playerBody.getPosition();
float width =player.getRegionWidth()*SCALE;
float height=player.getRegionHeight()*SCALE;
batch.begin();
if (Gdx.input.isKeyPressed(Input.Keys.SPACE))
batch.draw(headerAnimation.getKeyFrame(elapsedTime,true),position.x,position.y,width,height);
else drawSprite("2",position.x,position.y);
for (Body body : ballBodies) {
body.applyTorque(torque, false);
ball.setRotation((float) Math.toDegrees(body.getAngle()));
batch.draw(ball, body.getPosition().x-ball.getWidth()/2,body.getPosition().y-ball.getWidth()/2, ball.getOriginX()
, ball.getOriginY(), ball.getWidth(), ball.getHeight(), ball.getScaleX(), ball.
getScaleY(), ball.getRotation());
}
if (TimeUtils.millis() - lastDropTime > 3000) dropBall();
Iterator<Body> iterator = ballBodies.iterator();
while (iterator.hasNext()) {
Body body = iterator.next();
if (body.getPosition().y<=7&&body.getLinearVelocity().len()<0.4f&&
body.getAngularVelocity()<0.4f) {
world.destroyBody(body);
iterator.remove();
}
}
batch.end();
debugRenderer.render(world, camera.combined);
}
코드를 렌더링의 나 지상
에 몸 몸에게public Body dropBall() {
Body body;
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.DynamicBody;
bodyDef.position.set(MathUtils.random(0,50),50);
body = world.createBody(bodyDef);
ballBodies.add(body);
CircleShape circleShape = new CircleShape();
circleShape.setPosition(new Vector2(0, 0));
circleShape.setRadius(25*SCALE);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = circleShape;
fixtureDef.density = 0.1f;
fixtureDef.restitution = 0.7f;
fixtureDef.filter.categoryBits = PHYSICS_ENTITY;
fixtureDef.filter.maskBits = WORLD_ENTITY;
body.createFixture(fixtureDef);
circleShape.dispose();
lastDropTime = TimeUtils.millis();
return body;
}
내 코드 떨어지는 내 코드
public void beginContact(Contact contact) {
if((contact.getFixtureA().getBody() == ballBody) &&
(contact.getFixtureB().getBody()==playerBody)
|| (contact.getFixtureA().getBody() == playerBody
&& contact.getFixtureB().getBody()==ballBody)) {
ballBody.applyForceToCenter(20f,20f,true);
}
if((contact.getFixtureA().getBody() == ballBody) &&
(contact.getFixtureB().getBody()==ground)
|| (contact.getFixtureA().getBody() == ground
&& contact.getFixtureB().getBody()==ballBody)) {
ballBody.applyForceToCenter(0,50f,true);
}
}
두 번째 충돌, 즉 접지에 문제가 있습니다. PLZ 이걸 해결하라고 말해?
가 왜'ballBody.applyForceToCenter (20F, 20F, TRUE)'를 사용 DOU 도움이 될 수있는 당신의 몸의 각 코드 줄을 추가? 'beginContact()'메소드 전체를 주석 처리/삭제하십시오. 공 몸체의 복원은 튀는 소리를 처리해야합니다. –
응답 주셔서 감사합니다, 나는 이미 시도하고 모든 연락처 수신기 부분을 제거, 문제가 동일합니다, 스프라이트는 두 번째 연락처 – Kharak