ボールたちが動いていって反射するプログラム
ボールが動いていくプログラム の続きみたいなもの。
とりあえず反射させてみる+ボールのクラスを作ることでボールを増やすことが可能になりました!これぞオブジェクト指向ってやつだね
主な変更点は
・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); } }