Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
17.03.2016
Размер:
605.65 Кб
Скачать

Изображения

Для работы с изображениями в Java используют классы Image и ImageIcon, а также метод getImage(), который получает изображение от ImageIcon.

Рисуется изображение с помощью метода drawImage(Image img, int x, int y,ImageObserver observer).

Пример

Image img = new ImageIcon(“img.jpg”).getImage();

g.drawImage(img, 10, 10 , null);

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

Итак, создаем класс с исполнительным методом main().

Не забывем подключить библиотеку swing:

import javax.swing.*;

И начинаем с создания фрейма. Создаем фрейм с названием «Cartoon»:

JFrame frame = new Jframe("Cartoon");

Задаем его размеры:

frame.setSize(1370, 730);

Указываем, чтобы при нажатии на кнопку закрыть, приложение закрывалось:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

А также делаем наш фрейм видимым:

frame.setVisible(true);

Теперь создадим новый класс заднего фона Background, этот класс будет панелью и на нем мы будем рисовать нашу графику. Так как класс будет панелью, то он наследует JPanel.

Подключаем в этот класс библиотеки swing и awt:

import javax.swing.*;

import java.awt.*;

public class Background extends JPanel{

}

Внутри тела класса создаем пока что еще пустой конструктор:

public Background(){

}

Теперь давайте установим задний фон нашего мультика. Для этого создаем, изученный нами ранне обьект Imageи получаем изображения из файла, указав путь у нему, а после этого используем методgetImage();

Image img = new ImageIcon("res/background.png").getImage();

Как вы можете помнить рисуем мы в графическом контексте элементов. Поэтому все наши действия по прорисовке мы будем задавать в методе paint();

public void paint(Graphics g){

}

Внутри метода делаем преобразование GraphicsвGraphics2D, а потом с помощьюупомянутого нами методаdrawImage() рисуем изображение в графическом контексте:

public void paint(Graphics g){

g = (Graphics2D) g;

g.drawImage(img, 0, 0, null);

}

Если сейчас вы запустите приложение, то увидите, что задний фон установился.

Теперь давайте нарисуем поверх нашего фона танк. Создадим для него отдельный класс Panzer.

Подключаем библиотеки awt и swing:

import java.awt.Image;

import javax.swing.ImageIcon;

Создаем наш класс:

publicclassPanzer {

}

Теперь нам надо задать изображение нашего танка. Создаем экземпляр класса Image по указанному нами ранее образцу:

Image img = new ImageIcon("res/panzer.png").getImage();

Так как мы хотим, чтобы наш танк находился на траве, мы дожны задать его координаты, по которым будем отрисовывать его:

intx= 100,y= 500;

Так как это мультик, то наш танк будет двигаться.

Вопрос на сообразительность: что нужно сделать чтобы наш танк двигался по горизонтали? (смещение по горизонтали)

Соответсвенно наш танк должен иметь скорость и метод move():

intv= 5;

В методе move() мы задаем смещение танка по координатеxна расстояние, которое равно его скорости. Этот метод будет вызываться каждый промежуток времени, который мы зададим в будущем сами:

public void move(){

x += v;

}

Теперь возвращаемся в класс Background() и в методеpaint() прорисовываем наш танк. Для этого создаем экземляр классаPanzer:

Panzer panzer = new Panzer();

А также прорисовываем наш танк в методе paint():

g.drawImage(panzer.img, panzer.x, panzer.y, null);

Теперь мы хотим, чтобы на танк двигался, для этого мы должны менять его координаты по xкаждый раз в определенном промежутке времени. Тоесть, мы должны вызывать написанный нами методmove() каждыеnединиц времени. Это позволяет сделать классTimer, конструктор которого в качестве параметров принимает задержку в миллисекундах, а также слушатель событийActionListener(), сейчас мы разберем что это такое:

Timer timer = new Timer(20, this);

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

Слушатель (listener) - это объект, уведомляемый о событии. Он должен быть зарегистрирован источником событий и реализовывать методы для получения и обработки уведомлений.

Класс-слушатель cобытий ActionListenter должен определять методы объявленные в интерфейсе ActionListener и работать с объектами событий. В нашем случае, это всего один метод actionPerformed, который имеет один параметр - объектная ссылка на объект класса ActionEvent.

Итак, указываем что наш класс Background реализовывает интерфейс ActionListener

public class Background extends JPanel implements ActionListener{

}

Так мы должны реализовать интерфейс ActionListener, то следует переопределить метод actionPerformed(), именно в нем мы зададим движение танка:

public void actionPerformed(ActionEvent e){

}

Наш танк будет двигаться до определенного пункта назначения.

Вопрос во время лекции:что надо сделать, чтобы танк двигался до определенной точки?

(вызвать метод move() пока танк не достигнет определеннойкоординаты)

Тан будет двигаться до того времени, пока не достигнет координаты x - 400, поэтому пишем условие и вызываем метод move():

public void actionPerformed(ActionEvent e){

if(panzer.x < 400){

panzer.move();

}

}

Так как танк двигается, то мы должны постоянно перерисовывать нашу панель, для этого вызываем метод repaint()

public void actionPerformed(ActionEvent e){

if(panzer.x < 400){

panzer.move();

}

repaint();

}

Теперь осталось запустить наш таймер в конструкторе класса:

public Background(){

timer.start();

}

Вот мы и создали танк, который движется. Можете запустить и проверить.

Танк что должен делать? Правильно, стрелять. Сейчас создадим вражеский танк, в который наш танк будет стрелять.

Создаем класс Enemyи по раннее указанному образцу добавляем поле с изображением нашего танка, а также его координатыпоxиy:

public class Enemy {

Image img = new ImageIcon("res/enemy.png").getImage();

int x = 900, y = 500;

}

Теперь в классе Background создаем экземпляр класса Enemy, после чего отрисовываем его в методеpaint():

Enemy enemy = new Enemy();

g.drawImage(enemy.img, enemy.x, enemy.y, null);

Итак теперь давайте создадим снаряд, которым наш танк будет стрелять во вражеский, когда доедет до него. Создаем отельный класс Bullet для снаряда, так же как и ранее создаем его изображение, координаты x,y, его скорость, а также методmove(), в котором изменяется координата :

public class Bullet {

Image img = new ImageIcon("res/bullet.png").getImage();

int v = 8;

int x = 700 , y = 490;

public void move(){

x += v;

}

}

Теперь опять жев классе Background создаем экземпляр класса Bullet:

Bullet bullet = new Bullet();

Пуля должна появиться и начать двигаться, когда наш танк уже остановился, а закончить двигаться – когда достигнем вражеского танка. Имеем двойное условие для координат xтанка и пули, которое задает когда пуле надо отрисовываться:

if(panzer.x >= 400 && bullet.x < 850){

g.drawImage(bullet.img, bullet.x, bullet.y, null);

}

После того, как мы указали когда отрисовываться нашей пуле, зададим ее движение в методе actionPerformed() до того времени пока она не достигнет вражеского танка:

if(bullet.x < 850){

bullet.move();

}

Теперь давайте сделаем так, что когда пуля попадает во вражеский танк, то он исчезает и на его месте появляется огонь, причем огонь будет уже готовой gif-анимацией. ВJavaподдерживаются анимацииgif. Для этого создаем экземпляр классаImageс гифкой огня:

Image gif = new ImageIcon("res/fire.gif").getImage();

Приэтом отрисовываться в методеpaint() огонь должен, только когда снаряд достигнет вражеского танка и тот исчезнет. Для этого прописываем условие, в котором будем ориентироваться на координатуxснаряда. Если пуля не долетела до вражеского танка, то отрисовываем вражеский танк, если же долетела, то отрисовываем огонь:

if(bullet.x < 850){

g.drawImage(enemy.img, enemy.x, enemy.y, null);

}

else{

g.drawImage(gif, 850, 350, null);

}

Вот наш мультик почти уже готов, осталось оповестить всех, о том он со счастливым концом – HappyEnd. Для этого в методеpaint() там, где мы отрисовываем наш огонь, устанавливаем цветColor(245, 245, 245) и шрифтFont("Arial", Font.BOLD , 40), после чего выводим нашу строчу. Это все мы уже умеем:

g.setColor(new Color(245, 245, 245));

g.setFont(new Font("Arial", Font.BOLD , 40));

drawString("HAPPY END", 600, 100);

Вот и все, наш мультик готов и заканчивается он счастливым концом, также как и наш курс поJava. Огромное спасибо за внимание.

Если мы объединим все вышесказанное в один код, то получится следующее:

Класс Main с исполнительным методом main

import javax.swing.*;

public class Main {

public static void main(String args[]){

JFrame frame = new JFrame("Cartoon");

frame.setSize(1370, 730);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(new Background());

frame.setVisible(true);

}

}

Класс заднего фона Background

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.*;

public class Background extends JPanel implements ActionListener{

Timer timer = new Timer(20, this);

Image img = new ImageIcon("res/background.png").getImage();

Image gif = new ImageIcon("res/fire.gif").getImage();

Panzer panzer = new Panzer();

Enemy enemy = new Enemy();

Bullet bullet = new Bullet();

public Background(){

timer.start();

}

public void paint(Graphics g){

g = (Graphics2D) g;

g.drawImage(img, 0, 0, null);

g.drawImage(panzer.img, panzer.x, panzer.y, null);

if(bullet.x < 850)

g.drawImage(enemy.img, enemy.x, enemy.y, null);

else{

g.drawImage(gif, 850, 350, null);

g.setColor(new Color(245, 245, 245));

g.setFont(new Font("Arial", Font.BOLD , 40));

g.drawString("HAPPY END", 600, 100);

}

if(panzer.x >= 400 && bullet.x < 850){

g.drawImage(bullet.img, bullet.x, bullet.y, null);

}

}

public void actionPerformed(ActionEvent e){

if(panzer.x < 400){

panzer.move();

}

else if(bullet.x < 850){

bullet.move();

}

repaint();

}

}

Класс танка Panzer

import java.awt.Image;

import javax.swing.ImageIcon;

public class Panzer {

Image img = new ImageIcon("res/panzer.png").getImage();

int x = 100, y = 500;

int v = 5;

public void move(){

x += v;

}

}

Класс вражеского танка Enemy

import java.awt.Image;

import javax.swing.ImageIcon;

public class Enemy {

Image img = new ImageIcon("res/enemy.png").getImage();

int x = 900, y = 500;

}

Класс снаряда Bullet

import java.awt.Image;

import javax.swing.ImageIcon;

public class Bullet {

Image img = new ImageIcon("res/bullet.png").getImage();

int v = 8;

int x = 700 , y = 490;

public void move(){

x += v;

}

}

Мини-тест по видеолекции (3 задачи)

  1. Нарисуйте с помощью примитивных фигур, изученных в даной видеолекции

  1. Нарисуйте с помощью примитивных фигур следующий цветной рисунок

  1. Создайте свою анимацию, в которой задним фоном будет растровое изображение с полянкой, по полянке катится колобок, когда он докатится до лисицы, то садится ей на нос, после чего исчезает (колобок и лисица - также растровые изображения).

Тест по итогам недели (15 вопросов, из них 5 – на написание кода)

  1. __________________класс для использования ввода многострочного текста. a) TextArea b) TextField c) List d) Comment 

  2. С помощью какого метода можно получить экземпляр графического контекста?

    1. draw()

    2. get()

    3. paint()

    4. graphic()

  3. Какой размер по-умолчанию имеет фрейм?

  4. Создайте програмку с графическим интерфейсом, в которой проводится соц. опрос(Примерно 5-6 вопросов с радиокнопками и флажками в качестве вариантов ответов)

  5. Что надо передедать в качестве второго параметра при вызове даного конструктора?

JLabel label = new JLabel(“Ваше имя”, ……..);

    1. Размер метки в количестве символов

    2. По какой стороне выровнять содержимое метки

    3. Название шрифта

    4. Цвет, которым будет написан текст

  1. С помощью примитивных фигур Graphics или Graphics2D создайте фрейм со следующим рисунком:

  1. Что принимает в качестве параметров метод g.drawRect()

    1. Координаты верхнего угла и длины диагоналей

    2. Координаты центра, а также длину и высоту

    3. Координаты верхнего левого угла прямоугольника, длину и высоту

    4. Координаты каждой из вершин

  2. Вставьте растровое изображение и на его фоне с помощью drawstring напишите какой-то текст с шрифтом Tahoma размер 36.

  3. Какой компонент подходит для многовариантного ответа

    1. Кнопка-переключатель

    2. Комбинированный список

    3. Флажок

    4. Метка

  4. Нарисуйте график функции y = x^2.

  5. Создайте анимацию длительностью 10 сек, в которой кораблик, который проплывает мимо острова с пальмой стреляет в пальму, после чего она горит.

  6. Можно ли непосредственно создать экземпляры класса Graphics или Graphics2D.

  7. Какой класс ипользуется для панели прокрутки?

    1. Scroll

    2. ScrollPane

    3. Scrolling

    4. ScrollPanel

  8. Где находится начало системы координат в графическом контексте?

    1. В правом верхнем углу

    2. По центру

    3. В нижнем левом углу

    4. В левом вернем углу

  9. Создайте цветной рисунок домика с забором вокруг, а также деревьями с помощью примитивных фигур.