Как установить фоновое изображение в Java?
Я разрабатываю простую платформенную игру, используя Java, используя BlueJ в качестве среды IDE. Сейчас у меня есть игровые / вражеские спрайты, платформы и другие предметы в игре, нарисованные с использованием полигонов и простых фигур. В конце концов я надеюсь заменить их фактическими изображениями.
На данный момент я хотел бы знать, что является самым простым решением для установки изображения (URL-адреса или из локального источника) в качестве «фона» моего windows / canvasа в игре?
Я был бы признателен, если это не что-то длинное или сложное, так как мои навыки программирования не очень хорошие, и я хочу, чтобы моя программа была как можно более простой. Просьба предоставить примеры кодов с комментариями, чтобы подробно описать их функцию, а также, если она находится в своем classе, как вызвать соответствующие методы, используемые ею для других classов.
Большое спасибо.
Ответ будет немного отличаться в зависимости от того, использует приложение или апплет AWT или Swing .
(В принципе, classы, начинающиеся с J
такие как JApplet
и JApplet
являются Swing, а Applet
и Frame
– AWT.)
В любом случае основными шагами будут:
- Нарисуйте или загрузите изображение в объект
Image
. - Нарисуйте фоновое изображение в событии рисования
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 – это имя моего проекта, и все, что до этого приводит к рабочей области.