2016-05-25 10 views
1

私はJavaで小さなゲームを作り始めました。衝突や重力の形をしていますが、実際の人生のように速度が上がらないのです。この重力をより現実的にするために改善したいと思います。また、フロアに衝突ブロックがあり、フロアから歩くと、その高さに留まり落ちません。Java 2D Platformerの重力改善

以下

は私のプレーヤーのクラスです:ウィンドウにすべてを描画処理する別のクラスで

import java.awt.Color; 
    import java.awt.Graphics2D; 
    import java.awt.Rectangle; 

    public class Player { 
     private int x, y, width, height, lx, ly, dx, dy; 
     private final int FallSpeed = 2; 
     private final long JumpingTime = 8; 
     public boolean jumping = false, falling = true; 

     public Player(int x, int y, int width, int height) { 
      this.x = x; 
      this.y = y; 
      this.width = width; 
      this.height = height; 
      lx = x; 
      ly = y; 
      dx = x; 
      dy = y; 
      new Thread(new gravityThread()).start(); // Make user fall in case they are in the air 
     } 

     public void setX(int x) { 
      this.x = x; 
      lx = x; 
      dx = x; 
     } 

     public void setY(int y) { 
      this.y = y; 
      ly = y; 
      dy = y; 
     } 

     public int getX() { 
      return x; 
     } 

     public int getY() { 
      return y; 
     } 

     public int getWidth() { 
      return width; 
     } 

     public int getHeight() { 
      return height; 
     } 

     public Rectangle getBounds() { 
      return new Rectangle(x, y, width, height); 
     } 

     public void update() { 

     } 

     public void move(int ax, int ay) { 
      dx += ax; 
      dy += ay; 
      checkCollisions(); 
     } 

     public void checkCollisions() { 
      if (collided()) { 
       falling = false; 
       dx = lx; 
       dy = ly; 
      } 
      x = dx; 
      y = dy; 
      lx = x; 
      ly = y; 
     } 

     public boolean collided() { 
      Rectangle desired = new Rectangle(dx, dy, width, height); 
      for (Rectangle r : CollisionManager.collisions) if (r.intersects(desired)) return true; 
      return false; 
     } 

     public void jump() { 
      falling = false; 
      jumping = true; 
      new Thread(new gravityThread()).start(); 
     } 

     public void render(Graphics2D g2d) { 
      g2d.setColor(Color.black); 
      g2d.fill(getBounds()); 
     } 

     private class gravityThread implements Runnable { 

      int i = 0; 

      @Override 
      public void run() { 
       while(jumping) { 
        try { 
         i++; 
         Thread.sleep(JumpingTime); 
         move(0, -FallSpeed); 
         if (i == 40) { 
          jumping = false; 
          falling = true; 
         } 
        } catch (Exception e) { 
         e.printStackTrace(); 
         System.exit(0); 
        } 
       } 
       while(falling) { 
        try { 
         Thread.sleep(JumpingTime); 
         move(0, FallSpeed); 
        } catch (Exception e) { 
         e.printStackTrace(); 
         System.exit(0); 
        } 
       } 
      } 
     } 
    } 

、私はこのスニペットを持つプレイヤーの動きを制御します。

public void onUpdate() { 
      if (this.screenFactory.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_A)) 
       player.move(-WalkSpeed, 0); 
      if (this.screenFactory.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_D)) 
       player.move(WalkSpeed, 0); 

      if (this.screenFactory.getGame().getKeyboardListener().isKeyPressed(KeyEvent.VK_SPACE)) { 
       if (!player.jumping && !player.falling) 
        player.jump(); 
      } 

      if (player.getY() >= screenHeight - player.getHeight()) { 
       player.setY(screenHeight - player.getHeight()); 
       player.falling = false; 
      } 
      if (player.getY() <= 0) 
       player.setY(0); 
      if (player.getX() >= screenWidth - player.getWidth()) 
       player.setX(screenWidth - player.getWidth()); 
      if (player.getX() <= 0) 
       player.setX(0); 
    } 
+0

なぜ特別なスレッドで重力を処理するのですか?理由はないと思う。 'onUpdate'メソッドで重力を計算することができます。 – vojta

+0

私はそれを自分のスレッドで処理して、ユーザーは空中で移動でき、まだonUpdateメソッドで移動できるのでしょうか? – Jono

+0

物理学を追加するには、物理​​学を理解する必要があります。あなたがそれらを理解していない場合、どのように現実的な物理学を適用することができると思いますか?物理学のスピード、加速などについて学び、現実的な落ち込みを加えることができます。 –

答えて

1
  • グラム力は9.81でありますm /s²
  • あなたの "描画更新速度"を得るには、これは現実的で、少なくとも毎秒30回更新する必要があります。 NG)
  • 長さのあなたの定義を取得し、これはM

あるCupleは、各フレームと現在の速度vとaccelleration(g力)Aに応じて位置オブジェクト。 何かが落ちる長いが、より速く、それは...

編集を落ちる:/立下りより現実的なジャンプしながら横向きの動きを作るために、あなたは罪で作業する必要があります()、COS()。