Читайте также:
|
|
package Hipnosis.java;import java.awt.*;import java.awt.event.*;import java.awt.image.*;import javax.swing.*;import javax.swing.Timer; // Импорт java.util.Timer /** * компонент Swing, реализующий улучшенную анимацию **/public class Hypnosis extends JComponent implements ActionListener { double x, y; // центр спирали double r1, r2; // внутренний и внешний радиусы спирали double a1, a2; // начальный и конечный углы спирали double deltaA; // изменение угла между кадрами double deltaX, deltaY; // траектория центра float linewidth; // толщина линий Timer timer; // объект, управляющий сменой кадров BufferedImage buffer; // двойная буферизация Graphics2D osg; // объект Graphics2D для рисования в буфер public Hypnosis(double x, double y, double r1, double r2, double a1, double a2, float linewidth, int delay, double deltaA, double deltaX, double deltaY) { this.x = x; this.y = y; this.r1 = r1; this.r2 = r2; this.a1 = a1; this.a2 = a2; this.linewidth = linewidth; this.deltaA = deltaA; this.deltaX = deltaX; this.deltaY = deltaY; // настройка таймера на actionPerformed() каждые delay мс timer = new Timer(delay, this); // создание буфера buffer = new BufferedImage((int)(2*r2+linewidth), (int)(2*r2+linewidth), BufferedImage.TYPE_INT_RGB); // создание объекта Graphics для буфера // толщина линии и сглаживание osg = buffer.createGraphics(); osg.setStroke(new BasicStroke(linewidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); osg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } // запуск и остановка анимации public void start() { timer.start(); } public void stop() { timer.stop(); } /** * Swing вызывает этот метод для прорисовки. * метод применяет двойную буферизацию. **/ public void paintComponent(Graphics g) { // очистка фона osg.setColor(getBackground()); osg.fillRect(0, 0, buffer.getWidth(), buffer.getHeight()); // изображение черной спирали osg.setColor(Color.black); osg.draw(new Spiral(r2+linewidth/2, r2+linewidth/2, r1, a1, r2, a2)); // копируем изображение на экран g.drawImage(buffer, (int)(x-r2), (int)(y-r2), this); } /** * метод, реализующий интерфейс ActionListener. Объект Timer * периодически взаимодействует с ним, перерисовывая области * изменений. **/ public void actionPerformed(ActionEvent e) { // перерисовка области спирали. repaint((int)(x-r2-linewidth), (int)(y-r2-linewidth), (int)(2*(r2+linewidth)), (int)(2*(r2+linewidth))); // анимация: обновление положения и углов // отскок от края Rectangle bounds = getBounds(); if ((x - r2 + deltaX < 0) || (x + r2 + deltaX > bounds.width)) deltaX = -deltaX; if ((y - r2 + deltaY < 0) || (y + r2 + deltaY > bounds.height)) deltaY = -deltaY; // перемещение центра x += deltaX; y += deltaY; // увеличение углов; a1 += deltaA; a2 += deltaA; if (a1 > 2*Math.PI) { // ограничение размера углов a1 -= 2*Math.PI; a2 -= 2*Math.PI; } // перерисовка места спирали. // пересечение с предыдущим местом repaint((int)(x-r2-linewidth), (int)(y-r2-linewidth), (int)(2*(r2+linewidth)), (int)(2*(r2+linewidth))); } /** отмена двойной буферизации */ public boolean isDoubleBuffered() { return false; } /** метод main() тестирует компонент */ public static void main(String[] args) { JFrame f = new JFrame("Hypnosis"); Hypnosis h = new Hypnosis(200, 200, 10, 100, 0, 11*Math.PI, 7, 100, 2*Math.PI/30, 3, 5); f.getContentPane().add(h, BorderLayout.CENTER); f.setSize(400, 400); f.show(); h.start(); }}
Дата добавления: 2015-09-11; просмотров: 65 | Поможем написать вашу работу | Нарушение авторских прав |