2017-03-08 11 views
0

私はJavaで最初のゲームを作ろうとしています。私は自分のキャンバスと、動くことができる小さなサークルプレーヤーを持っています。左矢印キーを押すと、文字が上に移動し、左に移動します。私が右を押すと、文字は下に移動し、右に移動します。上矢印と下矢印は何もしません。私は自分の変数が混乱しているのを見て確認したが、私はそうは思わなかった。 左または右の矢印キーを押すと文字が斜めに移動する

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferedImage; 

public class GamePanel extends JPanel implements Runnable, KeyListener{ 

    // Fields 
    public static int WIDTH = 600; 
    public static int HEIGHT = 600; 

    private Thread thread; 
    private boolean running; 

    private BufferedImage image; 
    private Graphics2D g; 

    private int FPS = 30; 
    private double averageFPS; 

    private Player player; 

    // Constructor 
    public GamePanel() { 
     super(); 
     setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     setFocusable(true); 
     requestFocus(); 
    } 

    // Functions 
    public void addNotify() { 
     super.addNotify(); 
     if (thread == null) { 
      thread = new Thread(this); 
      thread.start(); 
     } 
     addKeyListener(this); 
    } 

    public void run() { 
     running = true; 

     image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
     g = (Graphics2D) image.getGraphics(); 

     player = new Player(); 

     long startTime; 
     long URDTimeMillis; 
     long waitTime; 
     long totalTime = 0; 

     int frameCount = 0; 
     int maxFrameCount = 30; 

     long targetTime = 1000/FPS; 

     // Game Frame Limiter and Timer 
     while (running) { 

      startTime = System.nanoTime(); 

      gameUpdate(); 
      gameRender(); 
      gameDraw(); 

      URDTimeMillis = (System.nanoTime() - startTime)/1000000; 

      waitTime = targetTime - URDTimeMillis; 

      try { 
       Thread.sleep(waitTime); 
      } catch (Exception ignored){ 

     } 

     totalTime += System.nanoTime() - startTime; 
     frameCount ++; 
     if (frameCount == maxFrameCount) { 
       averageFPS = 1000.0/((totalTime/frameCount)/1000000); 
       frameCount = 0; 
       totalTime = 0; 
      } 
     } 
    } 

    private void gameUpdate() { 

     player.update(); 

    } 

    private void gameRender() { 

     g.setColor(Color.WHITE); 
     g.fillRect(0, 0, WIDTH, HEIGHT); 
     g.setColor(Color.BLACK); 
     g.drawString("FPS: " + averageFPS, 10, 10); 

     player.draw(g); 

    } 

    private void gameDraw() { 
     Graphics g2 = this.getGraphics(); 
     g2.drawImage(image, 0, 0, null); 
     g2.dispose(); 
    } 

    public void keyTyped(KeyEvent key){ 

    } 

    public void keyPressed(KeyEvent key){ 

     int keyCode = key.getKeyCode(); 
     if (keyCode == KeyEvent.VK_LEFT){ 
      player.setLeft(true); 
     } 
     if (keyCode == KeyEvent.VK_RIGHT){ 
      player.setRight(true); 
     } 
     if (keyCode == KeyEvent.VK_UP){ 
      player.setUp(true); 
     } 
     if (keyCode == KeyEvent.VK_DOWN){ 
      player.setDown(true); 
     } 

    } 

    public void keyReleased(KeyEvent key){ 

     int keyCode = key.getKeyCode(); 
     if (keyCode == KeyEvent.VK_LEFT){ 
      player.setLeft(false); 
     } 
     if (keyCode == KeyEvent.VK_RIGHT){ 
      player.setRight(false); 
     } 
     if (keyCode == KeyEvent.VK_UP){ 
      player.setUp(false); 
     } 
     if (keyCode == KeyEvent.VK_DOWN){ 
      player.setDown(false); 
     } 

    } 

} 

そして、これが私のPlayer.java

です:私は誰がなぜ、どこが間違っていた私を見ることができますので、もし、それがはるかに便利

マイGame.javaはこれですとなり、これに非常に新しいですプレイヤーのDrawメソッドで

import java.awt.*; 

public class Player { 

    // Fields 
    private int x; 
    private int y; 
    private int r; 

    private int dx; 
    private int dy; 
    private int speed; 

    private boolean left; 
    private boolean right; 
    private boolean up; 
    private boolean down; 

    private int lives; 
    private Color color1; 
    private Color color2; 

    // Construtor 
    public Player(){ 

     x = GamePanel.WIDTH /2; 
     y = GamePanel.HEIGHT /2; 
     r = 5; 

     dx = 0; 
     dy = 0; 
     speed = 5; 

     lives = 3; 
     color1 = Color.WHITE; 
     color2 = Color.BLACK; 

    } 

    // Functions 
    public void setLeft(boolean b){left = b;} 
    public void setRight(boolean b){right = b;} 
    public void setUp(boolean b){up = b;} 
    public void setDown(boolean b){down = b;} 

    public void update(){ 

     if (left){ 
      dx = -speed; 
     } 
     if (right){ 
      dx = speed; 
     } 
     if (up){ 
      dy = speed; 
     } 
     if (down){ 
      dy = -speed; 
     } 

     x += dx; 
     y += dy; 

     if (x < r){ 
      x = r; 
     } 
     if (y < r){ 
      y = r; 
     } 
     if (x > GamePanel.WIDTH - r){ 
      x = GamePanel.WIDTH - r; 
     } 
     if (y > GamePanel.HEIGHT - r){ 
      y = GamePanel.HEIGHT - r; 
     } 

     dx = 0; 
     dy = 0; 

    } 

    public void draw(Graphics2D g){ 

     g.setColor(color1); 
     g.fillOval(x - r, x - r, 2 * r, 2 * r); 

     g.setStroke(new BasicStroke(3)); 
     g.setColor(color1.darker()); 
     g.drawOval(x - r, x - r, 2 * r, 2 * r); 
     g.setStroke(new BasicStroke(1)); 

    } 

} 
+0

'keyReleased()'コールバックに頼るのではなく、プレーヤーの 'left'、' right'などのメンバーを 'Player.update()'の最後に 'false'に戻してみてください。問題が単にキーリリースが正しく登録されていないことを確認するだけです。 – domsson

+0

[キー・リスナーの代わりにキー・バインディングを使用する方法](http://stackoverflow.com/questions/22741215/how-to-use-key-bindings-instead-of-key-listeners) – user1803551

+0

@domdom iそれを試してみると、プレイヤーのレスポンスが遅くなり(動きが遅くなる)、それでも上下左右に動きます。上矢印と下矢印は何もしない –

答えて

0

行は次のようになります。

g.fillOval(x - r, y - r, 2 * r, 2 * r); 

// and 

g.drawOval(x - r, y - r, 2 * r, 2 * r); 

ない

g.fillOval(x - r, x - r, 2 * r, 2 * r); 

// and 

g.drawOval(x - r, x - r, 2 * r, 2 * r); 

XとYのバールが混ざり合っていて、何らかの理由でキャラクターの動きが異なっていました。今すぐ動作します

関連する問題