ボールたちが動いていって反射するプログラム

ボールが動いていくプログラム の続きみたいなもの。
とりあえず反射させてみる+ボールのクラスを作ることでボールを増やすことが可能になりました!これぞオブジェクト指向ってやつだね

主な変更点は
・WinodowListenerの追加(閉じるボタンで閉じるようになった)
・反射させた(簡単なif分の追加)
・クラスを三つに分けた(メイン、キャンバス、ボール)


ってところ。


//MoveBalls_Bound.java メインのクラス
import java.awt.*;
import java.awt.event.*;

//メインのクラス
public class MoveBalls_Bound implements WindowListener{
	int width, height;	//縦横サイズ
	Frame mainF;		//フレーム
	Canvas mainC;		//キャンバス
	
	public static void main(String[] args){
		//main関数でインスタンス化を行います
		new MoveBalls_Bound();
	}
	
	public MoveBalls_Bound(){
		//サイズ設定して
		width = 500;
		height = 500;
		
		//キャンバスの背景色を指定
		mainC = new MainCanvas();
		mainC.setBackground(Color.blue);
		
		//フレームの大きさと背景色を指定、キャンバスをフレームに載せる
		mainF = new Frame("moving ball");
		mainF.setBackground(Color.green);
		mainF.setSize(width,height);
		mainF.setLayout(new FlowLayout());
		mainF.add(mainC);
		mainF.addWindowListener(this);
		mainF.setVisible(true);
	}
	
	//WindowLisnerを実装。×ボタンで閉じるようになりました
	//ユーザーがウィンドウを閉じようとしたら呼ばれる関数
	public void windowClosing(WindowEvent evt) {
		mainF.dispose();	//フレームを閉じて
		System.exit(0);		//JAVA仮想マシンを終了する
	}
	public void windowOpened(WindowEvent evt) {}		//最初にウィンドウを開いたとき
	public void windowIconified(WindowEvent evt) {}		//最小化したとき
	public void windowDeiconified(WindowEvent evt) {}	//最小化から復帰したとき
	public void windowClosed(WindowEvent evt) {}		//ウィンドウが閉じられたとき(disposeの結果)
	public void windowActivated(WindowEvent evt) {}		//アクティブになったとき
	public void windowDeactivated(WindowEvent evt) {}	//非アクティブになったとき
}
//MainCanvas.java キャンバスクラス
import java.awt.Canvas;
import java.awt.Graphics;

//キャンバスクラス
//こいつがスレッド立ててそっちでボールを動かすよ
public class MainCanvas extends Canvas implements Runnable{
	static final int WIDTH = 200;
	static final int HEIGHT = 200;
	int NUM = 5;	//ボールの個数
	Ball[] ball; 	//ボールクラスを保持するための配列
	Thread thread;	//スレッド準備
	
	//ボールクラス配列の大きさを指定
	//配列に順々にボールを入れていって、最後にスレッドスタートです
	public MainCanvas(){
		setSize(WIDTH, HEIGHT);
		ball = new Ball[NUM];
		ball[0] = new Ball(5, 5, 1, 1);
		ball[1] = new Ball(50, 5, 5, 3);
		ball[2] = new Ball(5, 50, 3, 1);
		ball[3] = new Ball(25, 25, 7, 7);
		ball[4] = new Ball(30, 5, 2, 3);
	
		thread = new Thread(this);
		thread.start();
	}
	
	//x,yの位置にボール描くよ
	public void paint(Graphics g){
		for(int i = 0; i < NUM; i++){
			//描くのはballクラスがやってくれるよ
			ball[i].draw(g);
		}
	}
	
	//x,yの移動を行うスレッドです
	//スレッドを立てるとrunメソッドが呼ばれるので
	//そこでメインループさせときます
	public void run(){
        while (true) {
    		for(int i = 0; i < NUM; i++){
    			//動くのもballクラスがやってくれるよ
    			ball[i].move();
    		}
            repaint();

        	//早すぎて困るのでスリープ
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
	}
}
//ball.java
import java.awt.Color;
import java.awt.Graphics;

//ボールクラス
//ボールに関する行動は全部こいつがやってくれます
public class Ball{
	int x, y;
	int vx, vy;

	public Ball(int x, int y, int vx, int vy){
		this.x = x;
		this.y = y;
		this.vx = vx;
		this.vy = vy;
	}
	
	//ボールの移動
	public void move(){
		//跳ね返り判定
		//(x,y)はボールの左上なので、右下側の判定は+10してから
    	if(x + vx + 10 > MainCanvas.WIDTH  || x + vx < 0){
    		vx *= -1;
    	}
    	if(y + vy + 10 > MainCanvas.HEIGHT || y + vy < 0){
    		vy *= -1;
    	}
    	
        x += vx;
        y += vy;
	}
	
	//ボールの描画
	public void draw(Graphics g){
		g.setColor(Color.white);
		g.fillOval(x, y, 10, 10);
	}
}