Всегда кажется, что вы прокляты, если вы делаете, и прокляты, если вы не .Насколько я понимаю, код, который вы поместили в в предыдущем посте , был адекватным, на самом деле его все еще не хватало (класса PlayerShip нет).Пример кода в этом посте делает еще меньше справедливости.Тем не менее ......
Прежде чем я начну, я просто хочу, чтобы вы знали, что лично я бы справился с этой задачей несколько иначе, и скудная помощь, предоставленная здесь, будет основана исключительно на коде, который вы имеетеуже предоставлено в этом и предыдущем постах.
Причина, по которой вы не видите, что ваши Корабли пришельцев отображаются на игровом поле при создании, заключается в том, что вы не повторно проверяете панель доски.Поскольку у вас сейчас есть код, это можно сделать с помощью метода Board.setAlien () , в который добавлены инопланетные корабли.Непосредственно под строк кода:
alien = new AlienShip();
add(alien);
enemies.add(alien);
добавьте строку кода: revalidate();
, чтобы код выглядел так:
alien = new AlienShip();
add(alien);
enemies.add(alien);
revalidate();
Ваши инопланетные кораблитеперь должен отображаться.
На стороне Примечание:
Что должно произойти, когда любой инопланетный корабль действительно доберется до дна игрыСовет?Как предложение, сделайте так, чтобы они снова появились на вершине игрового поля (это верно).Это можно сделать из метода AlienShip.scrollShip () , проверив, достиг ли Корабль пришельцев нижней части доски, например:
public void scrollShip() {
if (getY() + 1 > this.getParent().getHeight()) {
setY(0 - PANEL_HEIGHT);
}
else {
setY(getY() + 1);
}
}
По моему мнению, PANEL_HEIGHT - неправильное имя поля для использования.Я думаю, что было бы более уместно использовать что-то вроде ALIEN_SHIP_WIDTH и ALIEN_SHIP_HEIGHT .То же самое для переменных panelX и panelY , может быть alienShipX и alienShipY .Пища для размышлений.
Как видно из приведенного выше кода, текущую высоту игрового поля можно получить путем опроса метода getHeight () игрового поля с: this.getParent().getHeight()
.Это позволяет в любой момент изменить размер игрового поля, и инопланетные корабли будут знать, где находится текущая граница при прокрутке вниз.Все это тогда означает, что параметр свойства setResizable (false); , выполненный в главном классе для окна JFrame в игре, теперь можно изменять в размере: setResizable(true);
.
Вы также заметите, что когдаКорабль пришельцев вновь появляется в верхней части игрового поля, он фактически находится за пределами площадки и попадает в поле зрения при движении вниз.Я думаю, что это гораздо более плавный переход в игровую зону, а не просто появление на виду.Это достигается с помощью строки кода setY(0 - PANEL_HEIGHT);
выше.На самом деле, даже при первом запуске игры ваши инопланетные корабли должны попасть в игровую зону таким образом, что можно сделать из метода AlienShip.initAlienShip () , инициализировав panelY переменная в panelY = -PANEL_HEIGHT;
.
Теперь это приводит меня к инициализации полей PANEL_WIDTH и PANEL_HEIGHT .Значения кажутся огромными (224 и 250 соответственно).Конечно, вы можете установить эти размеры для тестирования столкновений и т. Д., Но я думаю, что размер изображения 64 x 35, скорее всего, будет достаточно:
![enter image description here](https://i.stack.imgur.com/PQYlp.png)
Это изображение должно быть PNG-изображением с прозрачным фоном, что устраняет необходимость в кодовой строке setBackground(Color.BLUE);
, расположенной в методе AlienShip.initAlienShip () .
Методы AlienShip.getX () и AlienShip.getY () следует переопределить:
@Override
public int getX() { ... }
@Override
public int getY() { ... }
Я думаю, что расширение класса AlienShip до JLabel было бы лучше, чем до JPanel.Для JPanel это выглядит излишне:
public class AlienShip extends JLabel { ... }
Добавление фонового изображения на игровую доску может добавить в игру pizazz.Это может быть достигнуто путем добавления следующего кода в метод Board.paintComponent () :
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
ImageIcon imgIcon = new ImageIcon("images/StarBackground.png");
Image img = imgIcon.getImage();
g.drawImage(img, 0, 0, this.getSize().width, this.getSize().height, this);
}
Изображения могут быть получены здесь .
![enter image description here](https://i.stack.imgur.com/Eto7F.png)
Это должно держать вас на некоторое время.Скоро это будет инопланетный беспредел.
![enter image description here](https://i.stack.imgur.com/D095Z.png)