Ball

ボールの動きをアニメーションする

クラスの構成など

プロジェクト

メイン・クラスの作成のチックを外す
カテゴリJavaアプリケーション
プロジェクト名BallAnimation
[注意]

ファイル

以下の2つのファイルを作成する

ファイル1(Ball.java)

カテゴリーJava GUI フォーム
ファイルタイプJFrameフォーム
ファイル名Ball
  • 作成するアプリ全体を表すフレーム

ファイル2(drawPanel)

カテゴリーJava GUI フォーム
ファイルタイプJPanelフォーム
ファイル名drawPanel
  • Ballフレーム内に配置し,このパネルにアニメーションを描画する

drawPanelクラス

    public class drawPanel extends javax.swing.JPanel implements ActionListener { ... }

機能

NetBeans IDE が自動作成するメソッド

次のメソッドは,NetBeans IDE が自動的に作成する

必要なimport命令

import java.awt.*;
import java.awt.event.*;
import javax.swing.Timer;

作成する変数

double x, y;ボールの座標(左上隅が原点)
double Vx, Vy;ボールの速度
int r;
ボールの半径

作成するメソッド

 init() ボールの位置や速度を初期値として設定する 
private void init() {
    r = 32; // ballの半径
    x = r;  // ballの初期位置
    y = r;
    Vx = 4; // 初期速度
    Vy = 0;
}
  next() ボールの状態を1フレーム進める 
public void next() {
    x += Vx;     // ballを移動させる
    y += Vy;
    Vy += 0.125; // ballを加速する
    // ballが壁に衝突したら初期状態に戻す
    if((x+r >= getWidth()) || (y+r >= getHeight())) init();
}
 actionPerformed(...) Timerイベントに対するアクション・リスナ 
public void actionPerformed(ActionEvent evt) {
    next();    // 1フレームすすめて
    repaint(); // 再描画
}
  init() 描画関数(ボールを描画する) 
public void paint(Graphics g) {
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, getWidth(), getHeight()); // パネル全体を白色で塗りつぶす
    g.setColor(Color.BLUE);
    g.fillOval((int)(x-r), (int)(y-r), 2*r, 2*r); // ballを青色で描く
}

コンストラクタの修正

このクラス・オブジェクトが生成されるときに, ballの位置と速度もあわせて初期設定する.
public drawPanel() {
    initComponents();
    init();
}
上の赤字の行を追加する

drawPanelクラスのコンパイル

このクラスがコンポーネントとして利用できるように コンパイルを済ませておく

メニューから: 「実行]→「ファイルをコンパイル」

Ballクラス

機能

必要なimport命令

import javax.swing.Timer;

変数

Timer timer;  // タイマ

ボタン・クリックに対するアクション

public void jButton1ActionPerformed( ... ) {
      if(timer == null) { // タイマを起動する
          timer = new Timer(200, drawPanel1); // インターバルを200[ミリ秒]に設定
          timer.start();
      }
      else {
          timer.stop();  // タイマを停止
          timer = null;
      }
}
上の2〜9行を書き足す.

実行

演習問題

  1. 機能の拡張

    ボールが壁に衝突したら,初期状態に戻すのではなく, 速度を反転させてボールが跳ね返るようにプログラムに機能を追加せよ.
  2. threadへの変更

    Timerは便利ではあるが, オブジェクト生成時にインターバル時間を指定することから, 実行途中でアニメーションの速度(インターバル, コマ送り時間)を変更することができない.

    作成したプログラムを書き換えて,

    • Timerではなく,Threadを用いてアニメーションを実現せよ
    • スライダー(JSlider)などを用いて, アニメーションの実行途中でも,インターバル(コマ送り時間)を変更可能とせよ

    [ヒント]  スレッドでは,繰り返し毎に sleepメソッドを実行することでアニメーション速度を指定することになる. そこで,sleepへの引数を変数で与え, この変数の値をスライダーなどを用いて可変にする.