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
ピクセルにプレイヤーの位置を設定しているが、これが呼び出されたときに、width
は0
なります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の例のように複雑なものにダイビングする前に、一般的にどのように機能するかについての詳細を学ぶために
を時間がかかるだろうそれは動作するように...
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);
}
}
}
'setVisible(true);'をとり、 'Game'コンストラクタの最後に移動します。また、UIを構築するときにEDTのコンテキスト内で作業していることを確認する必要があります。詳細は[初期スレッド](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)を参照してください。詳細 – MadProgrammer
私はあなたが言ったことはあったが、悲しいことに私はまだ私のプレーヤークラスを見ることができない –
あなたのコードには、プレイヤーの位置を1つ設定しようとしたときにいくつか他の問題がありますあなたが 'y'に' y'を割り当てているという事実もまた奇妙です。 – MadProgrammer