Как установить фоновое изображение в Java? - PullRequest
22 голосов
/ 07 февраля 2009

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

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

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

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

Ответы [ 5 ]

28 голосов
/ 07 февраля 2009

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

(В основном, классы, начинающиеся с J, такие как JApplet и JFrame, - это Swing, а Applet и Frame - это AWT.)

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

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

Шаг 1. Загрузка изображения может быть либо с использованием класса Toolkit, либо с помощью класса 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);
    }
}

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

1 голос
/ 03 марта 2009

Сначала создайте новый класс, который расширяет класс WorldView. Я позвонил своему новому классу Background. Таким образом, в этом новом классе импортируйте все пакеты 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;

Затем, после имени класса, убедитесь, что оно говорит: extends WorldView. Примерно так:

public class Background extends WorldView

Затем объявите игру переменных типа Game и переменную изображения типа Image примерно так:

private Game game;
private Image image;

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

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

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

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

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

private Background image;

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

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

frame.add(image);

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

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

0 голосов
/ 01 апреля 2019
<script>
function SetBack(dir) {
    document.getElementById('body').style.backgroundImage=dir;
}
SetBack('url(myniftybg.gif)');
</script>
0 голосов
/ 26 апреля 2012

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

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

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

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

0 голосов
/ 05 апреля 2012

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

try {
  this.setContentPane(
    new JLabel(new ImageIcon(ImageIO.read(new File("your_file.jpeg")))));
} catch (IOException e) {};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...