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;
}
}

