Как установить фоновое изображение в Java?

Я разрабатываю простую платформенную игру, используя Java, используя BlueJ в качестве среды IDE. Сейчас у меня есть игровые / вражеские спрайты, платформы и другие предметы в игре, нарисованные с использованием полигонов и простых фигур. В конце концов я надеюсь заменить их фактическими изображениями.

На данный момент я хотел бы знать, что является самым простым решением для установки изображения (URL-адреса или из локального источника) в качестве «фона» моего windows / canvasа в игре?

Я был бы признателен, если это не что-то длинное или сложное, так как мои навыки программирования не очень хорошие, и я хочу, чтобы моя программа была как можно более простой. Просьба предоставить примеры кодов с комментариями, чтобы подробно описать их функцию, а также, если она находится в своем classе, как вызвать соответствующие методы, используемые ею для других classов.

Большое спасибо.

Ответ будет немного отличаться в зависимости от того, использует приложение или апплет AWT или Swing .

(В принципе, classы, начинающиеся с J такие как JApplet и JApplet являются Swing, а Applet и Frame – AWT.)

В любом случае основными шагами будут:

  1. Нарисуйте или загрузите изображение в объект Image .
  2. Нарисуйте фоновое изображение в событии рисования Component вы хотите нарисовать фон.

Шаг 1. Загрузка изображения может быть либо с помощью classа Toolkit либо с помощью classа ImageIO .

Метод Toolkit.createImage можно использовать для загрузки Image из местоположения, указанного в String :

 Image img = Toolkit.getDefaultToolkit().createImage("background.jpg"); 

Аналогично, ImageIO может использоваться:

 Image img = ImageIO.read(new File("background.jpg"); 

Шаг 2. Метод рисования для Component который должен получить фон, должен быть переопределен и нарисовать Image на компоненте.

Для AWT метод переопределения – это метод paint и использует метод drawImage объекта Graphics который передается в метод paint :

 public void paint(Graphics g) { // Draw the previously loaded image to Component. g.drawImage(img, 0, 0, null); // Draw sprites, and other things. // .... } 

Для Swing метод переопределения – это метод paintComponent для JComponent и рисует Image как с тем, что было сделано в AWT.

 public void paintComponent(Graphics g) {    // Draw the previously loaded image to Component.    g.drawImage(img, 0, 0, null);    // Draw sprites, and other things.    // .... } 

Простой компонентный пример

Вот Panel которая загружает файл изображения при создании экземпляра и сама рисует это изображение:

 class BackgroundPanel extends Panel { // The Image to store the background image in. Image img; public BackgroundPanel() { // Loads the background image and stores in img object. img = Toolkit.getDefaultToolkit().createImage("background.jpg"); } public void paint(Graphics g) { // Draws the img to the BackgroundPanel. g.drawImage(img, 0, 0, null); } } 

Для получения дополнительной информации о живописи:

  • Картина в AWT и Swing
  • Урок: Выполнение пользовательской живописи из учебных пособий Java может помочь.

Сначала создайте новый class, который расширяет class WorldView . Я назвал свой новый class Background . Поэтому в этом новом classе импортируйте все пакеты Java, которые вам понадобятся, чтобы переопределить метод paintBackground . Это должно быть:

 import city.soi.platform.*; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.ImageObserver; import javax.swing.ImageIcon; import java.awt.geom.AffineTransform; 

Далее после имени classа убедитесь, что он говорит, что он расширяет WorldView . Что-то вроде этого:

 public class Background extends WorldView 

Затем объявите переменную игру типа Game и переменной изображения типа Image что-то вроде этого:

 private Game game; private Image image; 

Затем в конструкторе этого classа убедитесь, что игра типа Game находится в сигнатуре конструктора и что в вызове super вам придется инициализировать WorldView , инициализировать игру и инициализировать переменные изображения, что-то вроде этого:

 super(game.getCurrentLevel().getWorld(), game.getWidth(), game.getHeight()); this.game = game; bg = (new ImageIcon("lol.png")).getImage(); 

Затем вы просто переопределяете метод paintBackground точно так же, как и при переопределении метода paint в classе Player . Именно так:

 public void paintBackground(Graphics2D g) { float x = getX(); float y = getY(); AffineTransform transform = AffineTransform.getTranslateInstance(x,y); g.drawImage(bg, transform, game.getView()); } 

Теперь, наконец, вам нужно объявить ссылку на class для нового classа, который вы только что создали в classе Game и инициализировать его в конструкторе Game , примерно так:

 private Background image; And in the Game constructor: image = new Background(this); 

Наконец, все, что вам нужно сделать, это добавить фон в рамку! Это то, что я уверен, что мы все пропали без вести. Для этого вам нужно сделать что-то подобное после того, как объявлен переменный frame :

 frame.add(image); 

Убедитесь, что вы добавили этот код непосредственно перед frame.pack(); , Также убедитесь, что вы используете фоновое изображение, которое не слишком велико!

Вот и все! Ive заметил, что игровые движки могут обрабатывать форматы изображений JPEG и PNG, но также могут поддерживать других. Хотя это помогает включить фоновое изображение в вашу игру, оно не идеально! Потому что как только вы переходите на следующий уровень, все ваши платформы и спрайты невидимы, и все, что вы можете видеть, это ваше фоновое изображение и любые JLabels / Jbuttons, которые вы включили в игру.

Или попробуйте это;)

 try { this.setContentPane( new JLabel(new ImageIcon(ImageIO.read(new File("your_file.jpeg"))))); } catch (IOException e) {}; 

Путь – это единственное, о чем вам действительно нужно беспокоиться, если вы действительно новичок в Java. Вам нужно перетащить изображение в основной файл проекта, и он будет отображаться в самом низу списка.

Тогда путь к файлу довольно прост. Этот код входит в конструктор для classа.

  img = Toolkit.getDefaultToolkit().createImage("/home/ben/workspace/CS2/Background.jpg"); 

CS2 – это имя моего проекта, и все, что до этого приводит к рабочей области.

Interesting Posts
Давайте будем гением компьютера.