- •Обробка виключних ситуацій
- •6.0804 “Комп’ютерні науки”
- •1. Мета роботи
- •2.Основні теоретичні відомості
- •2.1. Оператори мови java
- •15.1. Модель обробки "поставщик-споживач"
- •15.2. Класи-фільтри
- •15.6. Модель обробки прямим доступом
- •15.8. Афінне перетворення зображення
- •15.7. Перетворення зображення в Java 2d
- •15.9. Зміна інтенсивности зображення
- •Import java.Awt.*;
- •Import java.Awt.Image.*;
- •Import java.Awt.Event.*;
- •15.10. Зміна складових кольору
- •15.11. Створення різних эфектів
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •15.13. Покращення зображення подвійною буферизацією
- •50, 50, 0, 360, Arc2d.Open));
- •15.14. Звук
- •Import java.Applet.* ;
- •Import java.Net.*;
- •15.15. Програвання звуку в Java 2
- •Import javax.Sound.Sampled.*;
- •Import java.Io.*;
- •If (!AudioSystem.IsLineSupported(info)){
- •Import javax.Sound.Sampled.*;
- •Import java.Io.*;
- •If (!AudioSystem.IsLineSupported(info)){
- •Import javax.Sound.Midi.*;
- •Import java.Io.*;
- •15.16. Синтез і запис звуку в Java 2
- •Import javax.Sound.Midi.*;
- •Import java.Io.*;
- •3.Контрольні запитання
- •4.Лабораторне завдання
- •Мета роботи.
- •Список рекомендованої літератури
50, 50, 0, 360, Arc2d.Open));
// Змінюємо колір рисування
big.setColor(getForeground());
// Рисуємо горизонтальну пряму
big.draw(new Line2D.Double(0, 125, w, 125));
// Виводимо зображення-буфер на екран
g2.drawImage(bi, 0, 0, this); }
public void go(){
while(count < 1000){
repaint();
try{
Thread.sleep(10);
}catch(InterruptedException e){}
count++;
}
}
public static void main(String[] args){
DrawAnim f = new DrawAnim(" Анімація");
f.go();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
Eфект мерехтіння, переливи кольору, затемнення і інші эфект, отримані заміною окремих пікселів зображення, зручно створювати за допомогою класу MemoryІmageSource. Метод newPixels() цього класу викликають негайне перерисовування зображення навыть без звернення до методу repaint(), якщо перед цим виконаний метод setAnimated(true). Частіше всього застосовуються два методи:
newPixels(int x, int y, int width, int height) — отримувачу посилається указаний аргументами прямокутний фрагмент зображення;
newPixels() — отримувачу посилається все зображення.
В лістинзі 15.13 показано застосування цього способу. Квадрат, виведений на екран, переливається різними кольорами.
Лістинг 15.13. Анімація за допомогою MemorylmageSource
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
class InMemory extends Frame{
private int w = 100, h = 100, count;
private int[] pix = new int[w * h];
private Image img;
MemoryImageSource mis;
InMemory(String s){ super(s);
int i = 0;
for(int y = 0; y < h; y++){
int red = 255 * y / (h - 1);
for(int x = 0; x < w; x++){
int green = 255 * x / (w - 1);
pix[i++] = (255 << 24)|(red << 16)|(green << 8)| 128;
}
}
mis = new MemoryImageSource(w, h, pix, 0, w);
// Задаємо можливість анімації
mis.setAnimated(true);
img = createImage(mis);
setSize(350, 300);
setVisible(true);
}
public void paint(Graphics gr){
gr.drawImage(img, 10, 30, this);
}
public void update(Graphics g){ paint(g); }
public void go(){
while (count < 100){
int i = 0;
// Змінюємо масив пікселів по деякому закону
for(int y = 0; y < h; y++)
for (int x = 0; x < w; x++)
pix[i++] = (255 << 24)|(255 + 8 * count << 16)| (8*count <<8)| 255 + 8 * count;
// Повідомляємо споживача про зміну
mis.newPixels();
try{
Thread.sleep(100);
}catch(InterruptedException e){}
count++;
}
}
public static void main(String[] args){
InMemory f= new InMemory(" Зображення в памяті");
f.go();
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){ System.exit(0); }
});
}
}
Ось і всі засоби для анімації, решта — їх вміле застосування. Комбінуючи розглянуті способи, можна добитися цікавих эфектів. В документації SUN J2SDK, в каталогах demo\applets і demo\jfc\Java2D \src, наведено багато прикладів аплетів і додатків з анімацією.
