2014-04-14 8 views
0

본문 점프와 다른 여러 가지 사항을 만들기 위해 다음 코드를 작성했지만 문제는 본문이 특정 제한에 점프하고 플레이어 본체 만 중력에 의해 영향을받지 않는다는 것입니다. 그것이 있어야하는 방법은 그래서 렌더링 방법 player.setLinearVelocity()의 사용은 선 속도를 설정하는 몸의 움직임을 방해했다LibGdx 본문 점프하기

public class Shoot implements ApplicationListener { 
    private OrthographicCamera camera; 
    private World world; 
    private Box2DDebugRenderer renderer; 
    private short x, y; 
    private float g; 
    private SpriteBatch batch; 
    private ChainShape groundshape; 
    private BodyDef bdef; 
    private FixtureDef fdef; 
    private Body player; 
    private PolygonShape pshape; 
    private CircleShape cshape; 
    private Vector2 v; 
    private ArrayList<Body> d; 
    private ArrayList<Body> bullet; 
    private Sprite bsprite; 
    private boolean right = true; 
    private Body enemy; 
    private byte l = 3; 

    @Override 
    public void create() { 
     d = new ArrayList<Body>(); 
     bullet = new ArrayList<Body>(); 
     dimensions(); 
     camera(); 
     renderer(); 
     world(); 
     batch(); 
     input(); 
     ground(); 
     player(); 
     enemy(); 
     collisions(); 
     bricks(4, -6); 
     sprites(); 

    } 

    @Override 
    public void dispose() { 
     batch.dispose(); 
     world.dispose(); 
     renderer.dispose(); 
     pshape.dispose(); 
     cshape.dispose(); 

    } 

    @Override 
    public void render() { 
     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT); 
     world.step(1/60f, 8, 3); 
     batch.setProjectionMatrix(camera.combined); 
     batch.begin(); 
     for (int i = 0; i < bullet.size(); i++) { 
      bsprite.setPosition(
        bullet.get(i).getPosition().x - bsprite.getWidth()/2f, 
        bullet.get(i).getPosition().y - bsprite.getHeight()/2f); 
      if (bullet.get(i).getLinearVelocity().y == 200) 
       bsprite.rotate90(false); 
      bsprite.draw(batch); 
     } 
     batch.end(); 
     for (int i = 0; i < d.size(); i++) { 
      world.destroyBody(d.get(i)); 
      d.remove(i); 
      i -= 1; 
     } 
     player.setLinearVelocity(v); 

     camera.position.x = player.getPosition().x; 
     camera.update(); 
     renderer.render(world, camera.combined); 

    } 

    @Override 
    public void resize(int width, int height) { 
     camera.viewportWidth = width/25f; 
     camera.viewportHeight = height/25f; 
     camera.update(); 
    } 

    @Override 
    public void pause() { 
    } 

    @Override 
    public void resume() { 
    } 

    private void world() { 
     world = new World(new Vector2(0, -9.81f), true); 

    } 

    private void dimensions() { 
     x = (short) Gdx.graphics.getWidth(); 
     y = (short) Gdx.graphics.getHeight(); 
     g = (float) ((y * 14/720f) * (6/7f)); 
    } 

    private void renderer() { 
     renderer = new Box2DDebugRenderer(); 
    } 

    private void camera() { 
     camera = new OrthographicCamera(x/25f, y/25f); 

    } 

    private void batch() { 
     batch = new SpriteBatch(); 
    } 

    private void input() { 
     Gdx.input.setInputProcessor(new InputProcessor() { 

      @Override 
      public boolean touchUp(int screenX, int screenY, int pointer, 
        int button) { 
       return false; 
      } 

      @Override 
      public boolean touchDragged(int screenX, int screenY, int pointer) { 
       return false; 
      } 

      @Override 
      public boolean touchDown(int screenX, int screenY, int pointer, 
        int button) { 

       bullet(); 
       return false; 
      } 

      @Override 
      public boolean scrolled(int amount) { 
       return false; 
      } 

      @Override 
      public boolean mouseMoved(int screenX, int screenY) { 
       return false; 
      } 

      @Override 
      public boolean keyUp(int keycode) { 
       if (keycode == Keys.D || keycode == Keys.A) { 
        v.x = 0; 
       } 
       return false; 
      } 

      @Override 
      public boolean keyTyped(char character) { 
       return false; 
      } 

      @Override 
      public boolean keyDown(int keycode) { 
       if (keycode == Keys.ESCAPE) { 
        Gdx.app.exit(); 
       } 
       if (keycode == Keys.D) { 
        v.x = 15; 
        right = true; 
       } 
       if (keycode == Keys.A) { 
        v.x = -15f; 
        right = false; 
       } 
       if (keycode == Keys.SPACE) { 
        player.applyLinearImpulse(new Vector2(0, 50000), 
          player.getLocalCenter(), true); 
       } 
       return false; 
      } 
     }); 
    } 

    private void ground() { 
     bdef = new BodyDef(); 
     bdef.type = BodyType.StaticBody; 
     bdef.allowSleep = true; 
     groundshape = new ChainShape(); 
     groundshape.createChain(new Vector2[] { new Vector2(-x, -g), 
       new Vector2(x, -g) }); 
     fdef = new FixtureDef(); 
     fdef.shape = groundshape; 
     fdef.restitution = 0f; 
     fdef.friction = 0f; 
     fdef.density = 0.5f; 
     world.createBody(bdef).createFixture(fdef); 
     groundshape.dispose(); 
    } 

    private void player() { 
     v = new Vector2(0, 0); 
     bdef.type = BodyType.DynamicBody; 
     bdef.allowSleep = true; 
     bdef.fixedRotation = true; 
     bdef.gravityScale = 100; 
     bdef.position.x = 0f; 
     bdef.position.y = -g + 2f; 
     pshape = new PolygonShape(); 
     pshape.setAsBox(1, 2); 
     fdef.shape = pshape; 
     fdef.friction = 0f; 
     fdef.restitution = 0f; 
     fdef.density = 1f; 
     player = world.createBody(bdef); 
     player.createFixture(fdef); 
     cshape = new CircleShape(); 
     cshape.setPosition(new Vector2(0, 3.1f)); 
     cshape.setRadius(1f); 
     fdef.shape = cshape; 
     player.createFixture(fdef); 
    } 

    private void bricks(float x, float y) { 
     bdef.type = BodyType.StaticBody; 
     bdef.allowSleep = true; 
     bdef.position.x = x; 
     bdef.position.y = y; 
     fdef.density = 0.5f; 
     fdef.restitution = 0f; 
     pshape.setAsBox(3, 1); 
     fdef.shape = pshape; 
     fdef.friction = 0f; 
     world.createBody(bdef).createFixture(fdef); 

    } 

    private void collisions() { 
     world.setContactListener(new ContactListener() { 

      @Override 
      public void preSolve(Contact contact, Manifold oldManifold) { 

      } 

      @Override 
      public void postSolve(Contact contact, ContactImpulse impulse) { 
       if (contact.getFixtureA().getShape().getType() == cshape 
         .getType() 
         || contact.getFixtureB().getShape().getType() == cshape 
           .getType()) { 
        v.y = 0; 
       } 
       if (contact.getFixtureA().getBody().isBullet()) { 
        d.add(contact.getFixtureA().getBody()); 
        bullet.remove(bullet.indexOf(contact.getFixtureA() 
          .getBody())); 
       } 
       if (contact.getFixtureB().getBody().isBullet()) { 
        d.add(contact.getFixtureB().getBody()); 
        bullet.remove(bullet.indexOf(contact.getFixtureB() 
          .getBody())); 
       } 
       if ((contact.getFixtureA().getBody().equals(enemy) && contact 
         .getFixtureB().getBody().isBullet()) 
         || contact.getFixtureB().getBody().equals(enemy) 
         && contact.getFixtureA().getBody().isBullet()) { 
        enemy.setLinearVelocity(0, 0); 
        l--; 
        if (l == 0) { 
         d.add(enemy); 
        } 
       } 
      } 

      @Override 
      public void endContact(Contact contact) { 

      } 

      @Override 
      public void beginContact(Contact contact) { 

      } 
     }); 
    } 

    private void bullet() { 
     bdef.type = BodyType.DynamicBody; 
     bdef.allowSleep = true; 
     bdef.bullet = true; 
     bdef.fixedRotation = true; 
     bdef.gravityScale = 0; 
     pshape.setAsBox(0.25f, 0.15f); 
     if (right && !Gdx.input.isKeyPressed(Keys.W)) { 
      bdef.position.x = player.getPosition().x + 1.6f; 
      bdef.position.y = player.getPosition().y + 1f; 

     } else if (!right && !Gdx.input.isKeyPressed(Keys.W)) { 
      bdef.position.x = player.getPosition().x - 1.6f; 
      bdef.position.y = player.getPosition().y + 1f; 

     } else if (Gdx.input.isKeyPressed(Keys.W)) { 
      bdef.position.x = player.getPosition().x; 
      bdef.position.y = player.getPosition().y + 4.5f; 
      pshape.setAsBox(0.15f, 0.25f); 

     } 
     fdef.density = 0.4f; 
     fdef.shape = pshape; 
     fdef.restitution = 0f; 
     fdef.friction = 0f; 
     bullet.add(world.createBody(bdef)); 
     bullet.get(bullet.size() - 1).createFixture(fdef); 
     if (right && !Gdx.input.isKeyPressed(Keys.W)) { 
      bullet.get(bullet.size() - 1).setLinearVelocity(50, 0); 
     } else if (!right && !Gdx.input.isKeyPressed(Keys.W)) { 
      bullet.get(bullet.size() - 1).setLinearVelocity(-50, 0); 

     } else if (Gdx.input.isKeyPressed(Keys.W)) { 
      bullet.get(bullet.size() - 1).setLinearVelocity(0, 50); 

     } 

    } 

    private void sprites() { 
     bsprite = new Sprite(new Texture("data/bullet.jpg")); 
     bsprite.setOrigin(bsprite.getWidth()/2f, bsprite.getHeight()/2f); 
     bsprite.rotate(0); 
     bsprite.setSize(0.5f, 0.30f); 
    } 

    private void enemy() { 
     bdef.type = BodyType.DynamicBody; 
     bdef.allowSleep = true; 
     bdef.fixedRotation = true; 
     bdef.gravityScale = 100; 
     bdef.position.x = 7f; 
     bdef.position.y = -g + 2f; 
     pshape = new PolygonShape(); 
     pshape.setAsBox(1, 2); 
     fdef.shape = pshape; 
     fdef.friction = 0f; 
     fdef.restitution = 0f; 
     fdef.density = 1f; 
     enemy = world.createBody(bdef); 
     enemy.createFixture(fdef); 
     cshape = new CircleShape(); 
     cshape.setPosition(new Vector2(0, 3)); 
     cshape.setRadius(1f); 
     fdef.shape = cshape; 
     enemy.createFixture(fdef); 
    } 

} 
+1

이 코드는 읽기가 어렵습니다 ... 중요한 부분을 조금 줄일 수 있습니까? – noone

+0

@noone 이제는 줄어 듭니다. –

+0

제거 된 가져 오기 외에도 아무것도 변경되지 않았습니다. 400 줄의 문서화되지 않은 코드 만 게시하면 아무도이 코드를 사용하지 않습니다. – noone

답변

0

점프하는 솔루션과 중력을주십시오 100 중력 규모 증가 y 방향 0 항상

+0

@springrbua 대답입니다. 임펄스를 적용하자마자 render() 메서드의 setLinearVelocity() 메서드가 모든 방향으로 속도를 0으로 설정합니다. –

+0

아, 죄송합니다. 나는 이것을 잘못 이해했다. 그것은 또 다른 문제 인 것처럼 들렸습니다. ^^ 죄송합니다! – Springrbua