2016-03-24 9 views
0

私はJavaを使いこなしています。基本的なゲームを作成しようとしていますが、今はプレイヤークラスをプログラムしようとしています。しかし、私はゲームを実行するときにのみJFRameが表示されます。これらは私の泥棒のクラスであり、エラーは表示されません。矩形が見えないJFrameのPlayerクラス

import java.awt.Color; 

import javax.swing.JFrame; 

public class Game extends JFrame { 
    public 
final static int WIDTH = 700, HEIGHT = 450; 
    public 
GamePanel panel; 

    public Game() { 
     setSize(WIDTH, HEIGHT); 
     setTitle("Game"); 
     setBackground(Color.WHITE); 
     setResizable(false); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     panel = new GamePanel(this); 
     add(panel); 
    } 

    public GamePanel getPanel() { 
     return panel; 
    } 

    public static void main(String[] args) { 
     new Game(); 
    } 
} 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 

public class GamePanel extends JPanel implements ActionListener, KeyListener { 
    public 
Game game; 
    public 
Player player; 

    public GamePanel(Game game) { 
     setBackground(Color.GREEN); 
     this.game = game; 
     player = new Player(game, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, game.getWidth() - 36); 
     addKeyListener(this); 
     setFocusable(true); 
    } 

    public 
void update() { 
     player.update(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     update(); 
     repaint(); 
    } 

     public Player getPlayer(int playerNo) { 
      return player; 
     } 

    public void keyPressed(KeyEvent e) { 
     player.pressed(e.getKeyCode()); 
    } 

    public void keyReleased(KeyEvent e) { 
     player.released(e.getKeyCode()); 
    } 

    public void keyTyped(KeyEvent e) { 
     ; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     player.paint(g); 
    } 
} 

import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.Color; 

public class Player { 
    public 
static final int WIDTH = 50, HEIGHT = 50; 
    public 
Game game; 
    public 
int left, right; 
    public 
int y; 
    public 
int x, xa; 

    public Player(Game game, int left, int right, int x) { 
     this.game = game; 
     this.x = x; 
     y = game.getHeight() - 20; 
     this.left = left; 
     this.right = right; 
     this.y = y; 
     x = game.getWidth() - 36; 
    } 

    public void update() { 
     if (x > 0 && x < game.getWidth() - WIDTH - 36) 
      x += xa; 
     else if (x == 0) 
      x++; 
     else if (x == game.getWidth() - WIDTH - 36) 
      x--; 
    } 

    public void pressed(int keyCode) { 
     if (keyCode == left) 
      xa = -1; 
     else if (keyCode == right) 
      xa = 1; 
    } 

    public void released(int keyCode) { 
     if (keyCode == left || keyCode == right) 
      xa = 0; 
    } 

    public Rectangle getBounds() { 
     return new Rectangle(x, y, WIDTH, HEIGHT); 
    } 

    public void paint(Graphics g) { 
     g.fillRect(x, y, WIDTH, HEIGHT); 
     g.setColor(Color.ORANGE); 
    } 
} 
+0

'setVisible(true);'をとり、 'Game'コンストラクタの最後に移動します。また、UIを構築するときにEDTのコンテキスト内で作業していることを確認する必要があります。詳細は[初期スレッド](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)を参照してください。詳細 – MadProgrammer

+0

私はあなたが言ったことはあったが、悲しいことに私はまだ私のプレーヤークラスを見ることができない –

+0

あなたのコードには、プレイヤーの位置を1つ設定しようとしたときにいくつか他の問題がありますあなたが 'y'に' y'を割り当てているという事実もまた奇妙です。 – MadProgrammer

答えて

2

setVisible(true);を取り、Gameコンストラクタの最後にそれを移動します。また、あなたがあなたのUIのを構築する際に、より詳細

基本的に
import java.awt.Color; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Game extends JFrame { 

    public final static int WIDTH = 700, HEIGHT = 450; 
    public GamePanel panel; 

    public Game() { 
     setTitle("Game"); 
     setBackground(Color.WHITE); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     panel = new GamePanel(this); 
     add(panel); 
     setResizable(false); 
     setSize(WIDTH, HEIGHT); 
     setVisible(true); 
    } 

    public GamePanel getPanel() { 
     return panel; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       new Game(); 
      } 
     }); 
    } 
} 

、Swingのレイアウト管理は怠け者であるためInitial Threadsを参照してくださいEDTのコンテキスト内で作業していることを確認する必要があり、それがコンテナ階層を更新しようとしませんあなたがそれを言うまで(revalidate)、それが実現またはサイズ変更されるようになると、操作が高価になる可能性があるので、これは良いことです。

次に、あなたが部品width未満36ピクセルにプレイヤーの位置を設定しているが、これが呼び出されたときに、width0なりますplayer = new Player(game, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, game.getWidth() - 36);

を見てみましょう。

基本的には、この種のコールを行う前にUIを「解決」する必要があります。これは実際には簡単ではありません。 ComponentListenerを使用し、componentResizedイベントを監視することができますが、最初に初期化されたときにウィンドウが何回もサイズ変更される可能性があります。このため、サイズが「決まる」まで「待つ」必要があります。

public Game() { 
    addComponentListener(new ComponentAdapter() { 
     private boolean initalised = false; 
     private Timer timer = new Timer(250, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       initalised = true; 
       panel.init(); 
       timer.stop(); 
      } 
     }); 

     @Override 
     public void componentResized(ComponentEvent e) { 
      if (!initalised) { 
       timer.restart(); 
      } 
     } 
    }); 

次にあなたがinit方法を提供することGamePanelを更新する必要があるだろう...

public class GamePanel extends JPanel implements ActionListener, KeyListener { 

    public Game game; 
    public Player player; 

    public GamePanel(Game game) { 
     setBackground(Color.GREEN); 
     this.game = game; 
     addKeyListener(this); 
     setFocusable(true); 
    } 

    public void init() { 
     player = new Player(game, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, game.getWidth() - 36); 
     repaint(); 
    } 
    //... 
    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (player != null) { 
      player.paint(g); 
     } 
    } 
} 

あなたがしているものと同等でない「魔法」の数字の広い範囲を、持っています例えば実際にやろうとしている...

player = new Player(game, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, game.getWidth() - 36); 

は、game.getWidth() - Player.WIDTHであってはなりませんか?

そしてPlayer ...

public Player(Game game, int left, int right, int x) { 
    this.game = game; 
    this.x = x; 
    y = game.getHeight() - 20; 
    //... 
    this.y = y; 
    x = game.getWidth() - 36; 
} 

にあなたはフィールドxにパラメータxを割り当てたが、その後、コンストラクタの最後にそれを変更?また、this.y = yは意味をなさない!今

、あなたの表示可能領域は常により小さくなりますので

Windowsは、装飾を持っている...あなたはそれをしたい場所に関連する悪い考えsetSize(WIDTH, HEIGHT);は、プレーヤーが表示されない理由を何について話しましょう実際のウィンドウサイズは、悪いことに、装飾のサイズは可変です。代わりに、JFrame#packを使用して、コンテンツの周りにウィンドウをパックし、その内容に、自分が望む大きなヒントを提供する必要があります。

詳しくはHow can I set in the midst?をご覧ください。

フレームのサイズを設定する代わりに、packを使用する必要があります。

public class Game extends JFrame { 

    public GamePanel panel; 

    public Game() { 
     addComponentListener(new ComponentAdapter() { 
      private boolean initalised = false; 
      private Timer timer = new Timer(250, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        initalised = true; 
        panel.init(); 
        timer.stop(); 
       } 
      }); 

      @Override 
      public void componentResized(ComponentEvent e) { 
       if (!initalised) { 
        timer.restart(); 
       } 
      } 
     }); 
     setTitle("Game"); 
     setBackground(Color.WHITE); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     panel = new GamePanel(this); 
     add(panel); 
     setResizable(false); 
     pack(); 
     setVisible(true); 
    } 

そして、それがあることを望んでどのように大きなに関する意思決定を行うためにGamePanelを許可する...これはまた、代わりにあなたのオブジェクトへのGameを渡すので、あなたがそれらにGamePanelを渡すとすべきであることを意味し

public static class GamePanel extends JPanel implements ActionListener, KeyListener { 

    public final static int WIDTH = 700, HEIGHT = 450; 

    public Game game; 
    public Player player; 

    public GamePanel(Game game) { 
     setBackground(Color.GREEN); 
     this.game = game; 
     addKeyListener(this); 
     setFocusable(true); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(WIDTH, HEIGHT); 
    } 

あなたはまた、KeyListener、代わりにshoulを使用すべきではない

public static class Player { 
    //... 
    public Player(GamePanel game, int left, int right, int x) { 
     this.game = game; 
     this.left = left; 
     this.right = right; 
     this.x = x; 
     y = game.getHeight() - HEIGHT; 
    } 

...例えば、その寸法を使用してd Key Bindings APIを代わりに使用すると、フォーカスに関連する問題が解決され、キーストロークの設定が簡単になります

基本的には、スイングフレームワークの仕組み私は基本的に得るためにあなたのコードを虐殺しましたので、私は、今...フレームワークは、ゲーム開発

Runnableの例のように複雑なものにダイビングする前に、一般的にどのように機能するかについての詳細を学ぶために

を時間がかかるだろうそれは動作するように...

Happy Player

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Game extends JFrame { 

    public GamePanel panel; 

    public Game() { 
     addComponentListener(new ComponentAdapter() { 
      private boolean initalised = false; 
      private Timer timer = new Timer(250, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        initalised = true; 
        panel.init(); 
        timer.stop(); 
       } 
      }); 

      @Override 
      public void componentResized(ComponentEvent e) { 
       if (!initalised) { 
        timer.restart(); 
       } 
      } 
     }); 
     setTitle("Game"); 
     setBackground(Color.WHITE); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     panel = new GamePanel(this); 
     add(panel); 
     setResizable(false); 
     pack(); 
     setVisible(true); 
    } 

    public GamePanel getPanel() { 
     return panel; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       new Game(); 
      } 
     }); 
    } 

    public static class GamePanel extends JPanel implements ActionListener, KeyListener { 

     public final static int WIDTH = 700, HEIGHT = 450; 

     public Game game; 
     public Player player; 

     public GamePanel(Game game) { 
      setBackground(Color.GREEN); 
      this.game = game; 
      addKeyListener(this); 
      setFocusable(true); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(WIDTH, HEIGHT); 
     } 

     public void init() { 
      System.out.println("!!"); 
      player = new Player(this, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, getWidth() - 50); 
      repaint(); 
     } 

     public void update() { 
      player.update(); 
     } 

     public void actionPerformed(ActionEvent e) { 
      update(); 
      repaint(); 
     } 

     public Player getPlayer(int playerNo) { 
      return player; 
     } 

     public void keyPressed(KeyEvent e) { 
      player.pressed(e.getKeyCode()); 
     } 

     public void keyReleased(KeyEvent e) { 
      player.released(e.getKeyCode()); 
     } 

     public void keyTyped(KeyEvent e) { 
      ; 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (player != null) { 
       player.paint(g); 
      } 
     } 
    } 

    public static class Player { 

     public static final int WIDTH = 50, HEIGHT = 50; 
     public GamePanel game; 
     public int left, right; 
     public int y; 
     public int x, xa; 

     public Player(GamePanel game, int left, int right, int x) { 
      this.game = game; 
      this.left = left; 
      this.right = right; 
      this.x = x; 
      y = game.getHeight() - HEIGHT; 
     } 

     public void update() { 
      if (x > 0 && x < game.getWidth() - WIDTH - 36) { 
       x += xa; 
      } else if (x == 0) { 
       x++; 
      } else if (x == game.getWidth() - WIDTH - 36) { 
       x--; 
      } 
     } 

     public void pressed(int keyCode) { 
      if (keyCode == left) { 
       xa = -1; 
      } else if (keyCode == right) { 
       xa = 1; 
      } 
     } 

     public void released(int keyCode) { 
      if (keyCode == left || keyCode == right) { 
       xa = 0; 
      } 
     } 

     public Rectangle getBounds() { 
      return new Rectangle(x, y, WIDTH, HEIGHT); 
     } 

     public void paint(Graphics g) { 
      System.out.println(x + "x" + y); 
      g.fillRect(x, y, WIDTH, HEIGHT); 
      g.setColor(Color.ORANGE); 
     } 
    } 
} 
関連する問題