エフェクトの完成
Effect.java
アプレットでweb公開できたらいいぞなもし
ソースコードは以下
import java.awt.*; import java.awt.Color; import java.awt.event.*; import java.awt.Dimension; import java.awt.Graphics; import java.awt.geom.*; import java.applet.*; import java.lang.Math; import javax.swing.*; class Effect extends JFrame{ public Effect(){ MainPanel mainpanel = new MainPanel(); setTitle("effect"); Container contentPane = getContentPane(); contentPane.add(mainpanel); pack(); } public static void main(String[] args){ Effect frame = new Effect(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } class MainPanel extends JPanel implements MouseListener, Runnable { private final int WIDTH = 1200; //画面の横幅 private final int HEIGHT = 700; //画面の縦幅 private int radius =400; //円波動の最大半径 private int x, y; //描画の中心点 private int rectWIDTH = 70; //四角形の最大幅 private int rectHEIGHT = 300; //四角形の最初の縦幅。ここから上に伸びる private int shapeX; //四角形の横幅を減らしていく変数 private int shapeR; //円波動の半径を増加させる変数 private boolean click; //描画のOnOffを決める変数 private int colorCount; //エフェクトの色を決める変数 private int RED, GREEN, BLUE; //描画の色を決める変数。乱数にすれば良いかも private Thread thread; private int th_sleep = 10; //スレッドの休止時間 /* 効果音を付けたいときは、WAVEファイルの名前を以下のように付ける private static String musicNames[] = {"laser","magic"}; private AudioClip music[]; */ public MainPanel(){ setPreferredSize(new Dimension(WIDTH,HEIGHT)); setBackground(Color.BLACK); setFocusable(true); addMouseListener(this); /* 効果音の読み込み music = new AudioClip[2]; music[0] = Applet.newAudioClip(getClass().getResource(musicNames[0] + ".wav")); music[1] = Applet.newAudioClip(getClass().getResource(musicNames[1] + ".wav")); */ //スレッドの開始。Timerで作った方がいい気がしてきたので、近日改造。 thread = new Thread(this); thread.start(); } public void run() { while(true) { //shapeXが大きくなるほど描画される四角形は小さくなる。 if(shapeX < rectWIDTH) { shapeX++; } //円波動の半径を広げていく if(shapeR < radius) { shapeR+=2; //指定した半径まで増加したら描画しないようにする。 } else { click = false; } repaint(); try{ Thread.sleep(th_sleep); }catch(InterruptedException e){ e.printStackTrace(); } } } public void mouseClicked(MouseEvent e) { /* 一度ストップしてから再生すると音がならないバグが出にくくなる。 music[0].stop(); music[1].stop(); music[0].play(); music[1].play(); */ //描画中心、四角形、円波動、描画OnOffに関して初期化 x = (int)e.getX(); y = (int)e.getY(); shapeX = 0; shapeR = 0; click = true; //クリックする度にエフェクトの色が変化するようにしている if(colorCount == 0) { RED = 255; GREEN = 0; BLUE = 0; } else if(colorCount == 1) { RED = 0; GREEN = 255; BLUE = 0; } else { RED = 0; GREEN = 0; BLUE = 255; colorCount = -1; } colorCount++; } //この辺りは使わなくても記述しなければならない。 public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} //描画メソッド。superでオーバーライドすることにより、repaint()の度に画面が一度クリアされる。 public void paintComponent(Graphics g) { super.paintComponent(g); int loop = 10;//円波動の数 int loopR = 10;//波動の増加半径 //今回はsetPaintの為にGraphics2Dを使用 Graphics2D g2 = (Graphics2D)g; //setColor()と異なり透明度が設定出来る。右端の値がalpha値 g2.setPaint(new Color(RED,GREEN,BLUE,20)); if(click){ //スレッドで増加している半径から、更に外へloopの数だけ円を描画 //中心部は何度も円が描画されるため色が濃くなり、外側は薄くなる。 for(int i=0; i<loop; i++) { g2.fillOval(x-(loopR*i+shapeR)/2, y-(loopR*i+shapeR)/10, loopR*i+shapeR, (loopR*i+shapeR)/5); } //中心部の円だけを背景色で塗りつぶす g2.setPaint(getBackground()); g2.fillOval(x-shapeR/2, y-(shapeR)/10, shapeR, shapeR/5); //中心部の四角形を描画。グラデーションの仕組みは円波動描画と同じ // g2.setPaint(new Color(RED,GREEN,BLUE,20)); for(int i=0; i<(int)(rectWIDTH-shapeX)/4; i++) { g2.fillRect(x + shapeX + 4*i - rectWIDTH, y - 3*shapeX - rectHEIGHT, 2*(rectWIDTH - shapeX - 4*i), rectHEIGHT + 3*shapeX); } } } } 半径半径言っとりますが、実際には直径のことです。