Java061213

出典: MediaArtWiki

[編集] 音声ファイルを読み込んで鳴らす

Java Sound API を使うという手もあるが、 java.applet.AudioClip を Applet.newAudioClip(url) で読み込むのが楽。 AppletはURLしか読み込めないので、 ファイル名をURLに変換するおまじないが必要:

String path;
URL url = getClass().getClassLoader().getResource(path);
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.applet.*;// applet.AudioClipを使うので必要
import java.net.*;// urlを使うので必要

public class PikoPong extends JFrame {
	public static void main(String[] args){
		new PikoPong();
	}

	public PikoPong(){
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(new Rectangle(100, 100, 300, 300));
		add(new JCanvas());
		setVisible(true);
	}

	AudioClip clip;

        public class JCanvas extends JComponent {
		double x, y, vx, vy;
		int mouseX, paddleSpeed;
		int ballSize = 10;
		int score, life;

		public void ballInit(){
			clip = readClip("pikopiko.wav");

			x = getWidth() / 2;// x座標初期化
			y = getHeight() / 2;// y座標
			vx = Math.random() * 8 - 4;// x方向の速度
			vy = Math.random() * 8 + 4;// y方向の速度
		}

		public JCanvas(){// ここでいろいろ初期化する。
			new Timer(20, new ActionListener() {// タイマーの初期化
				public void actionPerformed(ActionEvent e) {
					repaint();
				}
			}).start();

			addMouseListener(new MouseAdapter(){
				public void mousePressed(MouseEvent e){
					if(life == 0){// ライフが0のときクリックするとゲームスタート。
						ballInit();
						score = 0;
						life = 5;
					}
				}
			});

			addMouseMotionListener(new MouseMotionAdapter(){
				public void mouseMoved(MouseEvent e){
					paddleSpeed = e.getX() - mouseX;
					mouseX = e.getX();
				}
			});
		}

                public void paint(Graphics g){// 描画処理
			final int paddleWidth = 40;// パドルの幅
			final int paddleHeight = 5;// パドルの高さ

			g.setColor(Color.cyan);
			g.fillRect(0, 0, getWidth(), getHeight());

			g.setColor(Color.blue);
			g.fillRect(mouseX - paddleWidth / 2, getHeight() - paddleHeight,
				paddleWidth, paddleHeight);// パドルを描く

			g.setColor(Color.black);
			g.drawString("Score: " + score, 10, 10);// スコア表示
			g.drawString("Life: " + life, 200, 10);// ライフ表示
			if(life == 0){// ライフが0でゲームオーバー。
				g.drawString("Click to Start", 150, 150);
				return;// 以後は実行しないで返ります。
			}

			// ボールを動かす

			g.setColor(Color.red);
			g.fillOval((int)x,(int)y, ballSize, ballSize);// ボールを描く

			x += vx;
			if(x < 0){// 左端
				vx = Math.abs(vx);// x方向の速度をプラスに。右に動く。
			}
			if(x + ballSize > getWidth()){// 右端
				vx = - Math.abs(vx);// x方向の速度をマイナスに。左に動く。
			}
			y += vy;
			if(y < 0){// 天井
				vy = Math.abs(vy);// y方向の速度をプラスに。下に動く。
			}
			if(y + ballSize > getHeight()){// 床
				if(x + ballSize > mouseX - paddleWidth / 2 &&
				   x < mouseX + paddleWidth / 2){// パドルとボールの当たり判定
					vy = - Math.abs(vy);// y方向の速度をマイナスに。上に動く。
					vx += paddleSpeed;// ボールのx方向の速さにパドルの速さを加える。
					score++;// 打ち返すとスコアが増える。
					clip.play();
				} else {
					life--;// ロストボールでライフが減る。
					ballInit();
				}
			}
                }
        }

	public AudioClip readClip(String path){
		URL url = getClass().getClassLoader().getResource(path);
		AudioClip clip = Applet.newAudioClip(url);
		return clip;
	}
}