Я студент университета и относительно новичок в Java. У меня есть проект по созданию игры, похожей на Space Invaders, и часть описания проекта - сделать мой код максимально модульным. Я пытаюсь нарисовать объект "космический корабль" для JPanel, когда игра начинается, не зная, насколько большим будет экран. Программа будет работать в полноэкранном режиме (JFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)
).
Я искал несколько форумов (включая этот) по причинам, почему getHeight()
и getWidth()
возвращают 0 при использовании в вызове конструктора. То, что казалось общим ответом, это то, что значения высоты и ширины равны 0, пока JPanel не будет правильно инициализирован. Однако я не смог найти решение, которое соответствовало бы тому, чего я пытаюсь достичь.
Мой код, вероятно, довольно плохо структурирован, но я надеюсь, что он все еще имеет некоторый смысл.
Объект JFrame "AstronomicalAssimilators ()" требует создания объекта "Game ()", который, в свою очередь, требует создания объектов всех различных игровых элементов.
public AstronomicalAssimilators(){
super.setTitle("AstronomicalAssimilators");
super.setExtendedState(JFrame.MAXIMIZED_BOTH);
super.setUndecorated(true);
super.setResizable(false);
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.add(new Game()); //Create "game" object (launch "AstronimcalAssimilators" level)
super.pack();
super.setVisible(true);
}
В проигрывателе класс, объект "Player" создается следующим конструктором:
public Player(JPanel panel, int x, int y, int max_X, int max_Y) {
this.ship_x_pos = x;
this.ship_y_pos = y;
this.max_X = max_X;
this.max_Y = max_Y;
this.panel = panel;
}
Теперь мое первоначальное утверждение (в классе "Game"), вызывающее этот конструктор, было:
Player spaceship = new Player(this, getHeight()/2, getWidth()/2, getHeight(), getWidth());
Который прошел правильную панель, но передал {0, 0, 0, 0} для последних четырех аргументов утверждений.
Если я не дал достаточно объяснений, я приложу еще несколько своих код:
public class Game extends JPanel implements ActionListener, KeyListener {
//List of objects to track each enemy:
static List<Alien> aliens = new ArrayList<Alien>();
//Object to track player spaceship:
Player spaceship = new Player(this, getHeight()/2, getWidth()/2, getHeight(), getWidth());
//Create timer for triggering game actions:
Timer time;
//Method for creating visual output for program:
public Game(){
super.setDoubleBuffered(true);
time = new Timer(10, this);
time.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
}
public class Player {
//Integers used to store the location and orientation of the player's spaceship:
public int ship_x_pos, ship_y_pos, ship_x_vel = 0, ship_angle_deg = 0;
// Integers for bounds of "space" in JFrame:
int max_X, max_Y;
// Panel variable for drawing to:
JPanel panel;
// Constructor for creating player spaceship object from given parameters:
public Player(JPanel panel, int x, int y, int max_X, int max_Y) {
this.ship_x_pos = x;
this.ship_y_pos = y;
this.max_X = max_X;
this.max_Y = max_Y;
this.panel = panel;
}
//Method for moving player spaceship to the right:
public void moveRight() {
ship_x_vel = 3;
}
// Method for moving player spaceship to the left:
public void moveLeft() {
ship_x_vel = -3;
}
// Method for displaying spaceship:
public void paintComponent(Graphics g) {
ImageIcon player_icon = new ImageIcon(this.getClass().getResource("playership.png")); // Import image of player spaceship into program
player_icon.paintIcon(panel, g, ship_x_pos, ship_y_pos);
}
}
Я надеюсь, что предоставил достаточно информации. Заранее благодарю за любую помощь.