Как установить фоновое изображение в Java?
Я разрабатываю простую платформенную игру, используя Java, используя BlueJ как IDE. Сейчас у меня есть игровые/вражеские спрайты, платформы и другие предметы в игре, нарисованные с использованием полигонов и простых фигур. В конце концов я надеюсь заменить их фактическими изображениями.
На данный момент я хотел бы знать, что является самым простым решением для установки изображения (URL-адреса или из локального источника) в качестве "фона" моего игрового окна/холста?
Буду признателен, если это не что-то длинное или сложное, так как мои навыки программирования не очень хорошие, и я хочу, чтобы моя программа была как можно более простой. Просьба предоставить примеры кодов с комментариями, чтобы подробно описать их функцию, а также, если она в своем классе, как вызвать соответствующие методы, используемые им для других классов.
Большое спасибо.
Ответы
Ответ 1
Ответ будет немного отличаться в зависимости от того, использует ли приложение или апплет AWT или Swing.
(В принципе, классы, начинающиеся с J
, такие как JApplet
и JFrame
, являются Swing, а Applet
и Frame
являются AWT.)
В любом случае основными шагами будут:
- Нарисуйте или загрузите изображение в объект
Image
.
- Нарисуйте фоновое изображение в событии рисования
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);
}
}
Для получения дополнительной информации о живописи:
Ответ 2
Сначала создайте новый класс, который расширяет класс 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();
.
Также убедитесь, что вы используете фоновое изображение, которое не слишком велико!
Теперь, когда это! Ive заметил, что игровые движки могут обрабатывать форматы изображений JPEG и PNG, но также могут поддерживать других. Хотя это помогает включить фоновое изображение в вашу игру, оно не идеально! Потому что как только вы переходите на следующий уровень, все ваши платформы и спрайты невидимы, и вы можете видеть только ваше фоновое изображение и любые JLabels/Jbuttons, которые вы включили в игру.
Ответ 3
Или попробуйте это;)
try {
this.setContentPane(
new JLabel(new ImageIcon(ImageIO.read(new File("your_file.jpeg")))));
} catch (IOException e) {};
Ответ 4
<script>
function SetBack(dir) {
document.getElementById('body').style.backgroundImage=dir;
}
SetBack('url(myniftybg.gif)');
</script>
Ответ 5
Путь - это единственное, о чем вам действительно нужно беспокоиться, если вы действительно новичок в Java.
Вам нужно перетащить изображение в основной файл проекта, и он будет отображаться в самом низу списка.
Затем путь к файлу довольно прост. Этот код входит в конструктор для класса.
img = Toolkit.getDefaultToolkit().createImage("/home/ben/workspace/CS2/Background.jpg");
CS2 - это имя моего проекта, и все, что до этого приводит к рабочей области.