// mPlay.java - Shall we play with lines? import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class mPlay extends Applet implements Runnable, MouseListener, MouseMotionListener, ItemListener{ private static Label point = new Label("???, ???"); private static Checkbox clear = new Checkbox("Clear Flag", true); private static TextField tf = new TextField("10", 2); private static CheckboxGroup cbg = new CheckboxGroup(); private static Checkbox cb1 = new Checkbox("Laser", cbg, true); private static Checkbox cb2 = new Checkbox("Riber", cbg, false); private static Checkbox cb3 = new Checkbox("Targetting", cbg, false); private static Checkbox cb4 = new Checkbox("Spiral", cbg, false); private static Checkbox cb5 = new Checkbox("Windmill", cbg, false); private static Checkbox cb6 = new Checkbox("Hurricane", cbg, false); private static Checkbox cb7 = new Checkbox("Bomb", cbg, false); private static int x, y, width, height, randPt, randCol; public void init(){ width = getSize().width; height = getSize().height; // アプレットのwidth, heightを取得 /* * * * * * * * パラメータ受け取り&セット * * * * * * * */ int bg = Integer.parseInt(getParameter("bgcolor"), 16); int fontSize = Integer.parseInt(getParameter("fontSize")); String fontFamily = getParameter("family"); String fontBold = getParameter("font"); setLayout(new BorderLayout()); setBackground(new Color(bg)); if(fontBold.toLowerCase().equals("bold")) setFont(new Font(fontFamily, Font.BOLD, fontSize)); else if(fontBold.toLowerCase().equals("italic")) setFont(new Font(fontFamily, Font.ITALIC, fontSize)); else if(fontBold.toLowerCase().equals("bolditalic")) setFont(new Font(fontFamily, Font.BOLD+Font.ITALIC, fontSize)); else setFont(new Font(fontFamily, Font.PLAIN, fontSize)); /* * * * * * * * * * * * ここまで * * * * * * * * * * * * */ Panel p1 = new Panel(new FlowLayout()); // 上の情報表示パネル p1.add(new Label("Start coordinate :")); p1.add(point); p1.add(new Label("; Quantity :")); p1.add(tf); Panel p2 = new Panel(new GridLayout(2, 4)); // 下のメニューパネル p2.add(clear); p2.add(cb1); p2.add(cb2); p2.add(cb3); p2.add(cb4); p2.add(cb5); p2.add(cb6); p2.add(cb7); add(p1, BorderLayout.NORTH); add(p2, BorderLayout.SOUTH); cb1.addItemListener(this); cb2.addItemListener(this); cb3.addItemListener(this); cb4.addItemListener(this); cb5.addItemListener(this); cb6.addItemListener(this); cb7.addItemListener(this); // 選択が変更されるとitemStateChangedメソッドを呼び出す cb1.addMouseListener(this); cb2.addMouseListener(this); cb3.addMouseListener(this); cb4.addMouseListener(this); cb5.addMouseListener(this); cb6.addMouseListener(this); cb7.addMouseListener(this); clear.addMouseListener(this); addMouseListener(this); addMouseMotionListener(this); } public void mouseMoved(MouseEvent e){ x = e.getX(); y = e.getY(); point.setText(Integer.toString(x) + ", " + Integer.toString(y)); // マウスが動くたびに座標を表示し直す } public void mouseClicked(MouseEvent e){ if(e.toString().toLowerCase().lastIndexOf("panel") != -1) // パネル上のクリックであれば (new Thread(this)).start(); } public void run(){ Graphics g = getGraphics(); // Graphicsオブジェクトを取得 if(clear.getState()) g.clearRect(0, 0, width, height); // "Clear Flag"がチェックしてあった場合クリア if(cb1.getState()) paintLines(g, x, y); else if(cb2.getState()) paintCurves(g, x, y); else if(cb3.getState()) paintRectangles(g, x, y); else if(cb4.getState()) paintSpiral(g, x, y, true); else if(cb5.getState()) paintSpiral(g, x, y, false); else if(cb6.getState()) paintHurricane(g, x, y, true); else paintHurricane(g, x, y, false); // それぞれの処理へ } private void paintHurricane(Graphics g, int ptX, int ptY, boolean flag){ // Hurricane & Bomb final int qua = Integer.parseInt(tf.getText()); // 描画数をアプレットから取得 int [][] xpoints = new int[50][qua]; int [][] ypoints = new int[50][qua]; // qua本描画 randCol = (int)Math.rint(Math.random() * 0xFFFFFF); int dev = randCol / qua; Color [] col = new Color[qua]; for(int i = 1; i < qua+1; i++) col[i-1] = new Color(randCol - (dev * i)); for(int j = 0; j < qua; j++){ double plus = 2.5; for(int i = 0; i < xpoints.length; i++){ xpoints[i][j] = (int)(Math.pow(Math.E, plus) * Math.cos(plus * 2 * Math.PI + plus + j)) + ptX; ypoints[i][j] = (int)(Math.pow(Math.E, plus) * Math.sin(plus * 2 * Math.PI + plus + j)) + ptY; plus += 0.05; } } // qua本分の座標保持 for(int i = xpoints.length - 1; i > 0; i--){ for(int j = qua - 1; j >= 0; j--){ // 最大値から減らしていく g.setColor(col[j]); for(int k = 0; k < i; k+=5){ g.drawLine(xpoints[i][j], ypoints[i][j]+k, xpoints[i-1][j], ypoints[i-1][j]+k); // i(k)の値を加えることで高さを表す(徐々に小さくなっていくように見える) } } try{ Thread.sleep(i); } // 中心に行くに連れて速くなる catch(InterruptedException e){ e.printStackTrace(); } if(!flag){ // Bomb用・苦し紛れの線消し処理(背景で線の塗り潰し) for(int j = qua - 1; j >= 0; j--){ g.setColor(getBackground()); for(int k = 0; k < i; k+=5) g.drawLine(xpoints[i][j], ypoints[i][j]+k, xpoints[i-1][j], ypoints[i-1][j]+k); } } } if(!flag){ // Bomb用・ダメージと爆発の描画 int [] ran = new int[(width-(width-ptY))/15]; for(int i = 0; i < ran.length; i++) ran[i] = (int)Math.floor(Math.random() * (10+qua)); for(int i = ran.length-1; i >= 0; i--){ // 最後の爆発 g.setColor(new Color(0x00FF00)); g.drawLine(ptX+3+ran[i], ptY+15-ran[i], ptX+3+ran[i], ptY-10-(i*15)); g.drawLine(ptX-3-ran[i], ptY+15-ran[i], ptX-3-ran[i], ptY-10-(i*15)); g.drawLine(ptX+5+ran[i], ptY+ran[i], ptX+5+ran[i], ptY-10-(i*15)); g.drawLine(ptX-5-ran[i], ptY+ran[i], ptX-5-ran[i], ptY-10-(i*15)); g.setColor(new Color(0x0000FF)); g.drawLine(ptX+7+ran[i], ptY+15-ran[i], ptX+7+ran[i], ptY-10-(i*15)); g.drawLine(ptX-7-ran[i], ptY+15-ran[i], ptX-7-ran[i], ptY-10-(i*15)); g.drawLine(ptX+9+ran[i], ptY+ran[i], ptX+9+ran[i], ptY-10-(i*15)); g.drawLine(ptX-9-ran[i], ptY+ran[i], ptX-9-ran[i], ptY-10-(i*15)); g.setColor(new Color(0xFF0000)); g.drawLine(ptX+13+ran[i], ptY+15-ran[i], ptX+13+ran[i], ptY-10-(i*15)); g.drawLine(ptX-13-ran[i], ptY+15-ran[i], ptX-13-ran[i], ptY-10-(i*15)); g.drawLine(ptX+15+ran[i], ptY+ran[i], ptX+15+ran[i], ptY-10-(i*15)); g.drawLine(ptX-15-ran[i], ptY+ran[i], ptX-15-ran[i], ptY-10-(i*15)); try{ Thread.sleep(5); } catch(InterruptedException e){ e.printStackTrace(); } } int r = (int)Math.floor(Math.random()*150)*qua; g.setColor(new Color(0x000000)); g.drawString(r + "pts damage!!", ptX-48, ptY+37); g.setColor(new Color(0xFFFFFF)); g.drawString(r + "pts damage!!", ptX-50, ptY+35); if(r > 140*qua){ g.setColor(new Color(0x000000)); g.drawString("Critical Hit!!", ptX-38, ptY+52); g.setColor(new Color(0xFFFFFF)); g.drawString("Critical Hit!!", ptX-40, ptY+50); } // ダメージ表示 for(int i = 0; i < ran.length; i++){ // 爆発の消去 g.setColor(getBackground()); g.drawLine(ptX+3+ran[i], ptY+15-ran[i], ptX+3+ran[i], ptY-10-(i*15)); g.drawLine(ptX-3-ran[i], ptY+15-ran[i], ptX-3-ran[i], ptY-10-(i*15)); g.drawLine(ptX+5+ran[i], ptY+ran[i], ptX+5+ran[i], ptY-10-(i*15)); g.drawLine(ptX-5-ran[i], ptY+ran[i], ptX-5-ran[i], ptY-10-(i*15)); g.drawLine(ptX+7+ran[i], ptY+15-ran[i], ptX+7+ran[i], ptY-10-(i*15)); g.drawLine(ptX-7-ran[i], ptY+15-ran[i], ptX-7-ran[i], ptY-10-(i*15)); g.drawLine(ptX+9+ran[i], ptY+ran[i], ptX+9+ran[i], ptY-10-(i*15)); g.drawLine(ptX-9-ran[i], ptY+ran[i], ptX-9-ran[i], ptY-10-(i*15)); g.drawLine(ptX+13+ran[i], ptY+15-ran[i], ptX+13+ran[i], ptY-10-(i*15)); g.drawLine(ptX-13-ran[i], ptY+15-ran[i], ptX-13-ran[i], ptY-10-(i*15)); g.drawLine(ptX+15+ran[i], ptY+ran[i], ptX+15+ran[i], ptY-10-(i*15)); g.drawLine(ptX-15-ran[i], ptY+ran[i], ptX-15-ran[i], ptY-10-(i*15)); try{ Thread.sleep(5); } catch(InterruptedException e){ e.printStackTrace(); } } } } private void paintSpiral(Graphics g, int ptX, int ptY, boolean flag){ // Spiral & Windmill final int qua = Integer.parseInt(tf.getText()); // 描画数をアプレットから取得 int [][] xpoints = new int[135][qua]; int [][] ypoints = new int[135][qua]; // qua本描画 Color [] col = new Color[qua]; for(int i = 0; i < qua; i++) col[i] = new Color((int)Math.rint(Math.random() * 0xFFFFFF)); // カラー情報の保持 if(flag){ // Spiralの場合 for(int j = 0; j < qua; j++){ double plus = 1; for(int i = 0; i < xpoints.length; i++){ xpoints[i][j] = (int)(Math.pow(Math.E, plus) * Math.cos(plus * 2 * Math.PI + plus + j)) + ptX; ypoints[i][j] = (int)(Math.pow(Math.E, plus) * Math.sin(plus * 2 * Math.PI + plus + j)) + ptY; plus += 0.03; } } // qua本分の座標保持 } else{ // Windmillの場合 for(int j = 0; j < qua; j++){ double plus = 1; for(int i = 0; i < xpoints.length; i++){ xpoints[i][j] = (int)(Math.pow(Math.E, plus) * Math.cos(plus * 2 * Math.PI + plus + j + i)) + ptX; ypoints[i][j] = (int)(Math.pow(Math.E, plus) * Math.sin(plus * 2 * Math.PI + plus + j + i)) + ptY; plus += 0.03; } } // qua本分の座標保持 } for(int i = 1; i < xpoints.length; i++){ for(int j = 0; j < qua; j++){ g.setColor(col[j]); g.drawLine(xpoints[i-1][j], ypoints[i-1][j], xpoints[i][j], ypoints[i][j]); } // qua本一気に描画 try{ Thread.sleep(5); } catch(InterruptedException ie){ } // 動きを付けるためのsleep } } private void paintRectangles(Graphics g, int ptX, int ptY){ // Targetting final int qua = Integer.parseInt(tf.getText()); // 描画数をアプレットから取得 randCol = (int)Math.rint(Math.random() * 0xFFFFFF); g.setColor(new Color(randCol)); // ランダムに描画色を決定 randPt = (int)Math.rint(Math.random() * 15) + 15; for(int i = 0; i < qua; i++){ // qua回描画 int size = (int)(70 * Math.cos(i * 2 * Math.PI / randPt)) + 70; g.draw3DRect(ptX-size, ptY-size, size*2, size*2, false); // 四角の大きさの変化量をランダムに決定して描画 try{ Thread.sleep(15); } catch(InterruptedException ie){ } // 動きを付けるためのsleep } } private void paintCurves(Graphics g, int ptX, int ptY){ // Riber final int qua = Integer.parseInt(tf.getText()); // 描画数をアプレットから取得 int [][] xpoints = new int[50][qua]; // 描画する線はqua本(変更可) int [] ypoints = new int[50]; int [] ran = new int[qua]; Color [] col = new Color[qua]; randPt = (int)Math.rint(Math.random() * 15) + 15; for(int i = 0; i < qua; i++){ col[i] = new Color((int)Math.rint(Math.random() * 0xFFFFFF)); ran[i] = (int)Math.rint(Math.random() * 30); } // それぞれ描画色と傾きを保持しておく for(int i = 0; i < xpoints.length; i++){ for(int j = 0; j < qua; j++) xpoints[i][j] = (int)(ptX - 100 * Math.sin(i * 2 * Math.PI / randPt) + i*(ran[j]-15)); // それぞれの線のx座標を決定・代入していく ypoints[i] = ptY + i * 10; // y座標の決定・代入 } for(int i = 1; i < xpoints.length; i++){ for(int j = 0; j < qua; j++){ g.setColor(col[j]); g.drawLine(xpoints[i-1][j], ypoints[i-1], xpoints[i][j], ypoints[i]); } // それぞれの線を描画していく(動きを付けるためdrawPolyLineは使わない(使っても可)) try{ Thread.sleep(10); } catch(InterruptedException ie){ } // 動きを付けるためのsleep } } private void paintLines(Graphics g, int ptX, int ptY){ // Laser final int qua = Integer.parseInt(tf.getText()); // 描画数をアプレットから取得 for(int i = 0; i < qua; i++){ // qua本描画 randPt = (int)Math.rint(Math.random() * width); randCol = (int)Math.rint(Math.random() * 0xFFFFFF); // 線の終点と描画色をランダムに決定 g.setColor(new Color(randCol)); g.drawLine(ptX, ptY, randPt, height); // 色を決定し、描画 try{ Thread.sleep(25); } catch(InterruptedException ie){ } // 動きを付けるためのsleep } } public void itemStateChanged(ItemEvent e){ if(((String)e.getItem()).equals("Laser")) tf.setText("10"); // Laser else if(((String)e.getItem()).equals("Riber")) tf.setText("5"); // Riber else if(((String)e.getItem()).equals("Targetting")) tf.setText("25"); // Targetting else tf.setText("6"); // Spiral & Windmill & Hurricane & Bomb // 選択によって初期値を変更 } public void mouseEntered (MouseEvent e){ if(e.toString().toLowerCase().lastIndexOf("checkbox") != -1) // Checkbox上のクリックであれば setCursor(new Cursor(Cursor.HAND_CURSOR)); // カーソルを指に } public void mouseExited (MouseEvent e){ setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); // カーソルをデフォルトに戻す } public void mouseDragged (MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mousePressed (MouseEvent e){} // 使わないメソッドのオーバーライド }