2011年9月2日金曜日

Java入門⑥

やっとオブジェクト指向らしいことをしましょう。





プロジェクトエクスプローラーの現在編集しているプロジェクトを右クリックして新規クラスを作成します。


新規→クラス→名前に「Ball」と入力→完了


Ballクラスを以下のように編集

public class Ball {
	public int x;
	public int y;

	public int SIZE;

	public int vx;
	public int vy;
}

メインパネルを以下のように編集

	/**
	 * ゲームで用いる変数は、ここで定義
	 */

	private Ball ball;



    public MainPanel() {
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        addMouseMotionListener(this);

        gameInit();		//ゲームの初期化

        gameLoop = new Thread(this);
        gameLoop.start();
    }



    //ゲーム情報の初期化をここに書く
    private void gameInit() {
    	ball = new Ball();
    	ball.x = 5;
    	ball.y = 5;
    	ball.vx = 3;
    	ball.vy = 3;
    	ball.SIZE =8;
	}

	//ゲームの処理はここに書く
	private void gameUpdate() {
		ball.x++;
		ball.y++;

	}

	//描画処理はここに書く
	private void gameDraw(Graphics g) {
			// 黒色の背景
			//黒色で描画するようにする
	       g.setColor(Color.BLACK);
	       //左上を(0,0)、右下を(WIDTH,HEIGHT)とする四角形を描画する
	       g.fillRect(0, 0, WIDTH, HEIGHT);

	       //黄色で円
	       //黄色で描画するようにする
	       g.setColor(Color.YELLOW);
	       //(pos_x,pos_y)に直径(SIZE,SIZE)の楕円を描画する
	       g.fillOval(ball.x, ball.y, ball.SIZE, ball.SIZE);
	}


おそらく⑥のアニメーションの初期の状態と同じ動作になったはずです。
ですが、これではただの構造体としてしか使えていないのでオブジェクト指向らしくしましょう。


まずはカプセル化です。
変数を全てprivateにしましょう。


privateにすると外部からの参照ができなくなるので、setX()やget()などのメソッドを実装します。
しかし、それぞれに対してset,getを全て付けていては面倒でなので、Ballのパラメーターを全て一括で設定するsetBall()にまとめてみます。


public class Ball {
	private int x;
	private int y;

	private int SIZE;

	private int vx;
	private int vy;

	public void setBall(int xx,int yy, int sSIZE,int vvx,int vvy){
		x = xx;
		y = yy;
		SIZE = sSIZE;
		vx = vvx;
		vy = vvy;
	}

	public int getX(){
		return x;
	}

	public int getY(){
		return y;
	}

	public int getSIZE(){
		return SIZE;
	}

	public int getVx(){
		return vx;
	}

	public int getVy(){
		return vy;
	}

}

さらに、ボールの移動と描画はボールオブジェクトの中で完結させたほうが手っ取り早いのでmove();とdraw()メソッドを追加します。


	//ボールを移動
	public void move(){
		x += vx;
		y += vy;
	}

	//ボールの描画
    public void draw(Graphics g) {
        g.setColor(Color.YELLOW);
        g.fillOval(x, y, SIZE, SIZE);
    }

問題⑥:Ballクラスを変更し、壁にあたったら跳ね返るように変える。
問題⑦:Ballを3つに増やす。

2 件のコメント:

  1. 問題⑦の回答が欲しいです。

    返信削除
    返信
    1. 参考にどうぞ
      /**
      * ゲームで用いる変数は、ここで定義
      */
      private Ball[] ball = new Ball[3];

      public MainPanel() {
      setPreferredSize(new Dimension(WIDTH, HEIGHT));
      addMouseMotionListener(this);

      gameInit(); //ゲームの初期化

      gameLoop = new Thread(this);
      gameLoop.start();
      }



      //ゲーム情報の初期化をここに書く
      private void gameInit() {
      for(int i=0; i<3; i++){
      ball[i] = new Ball();
      }

      ball[0].setBall(5, 5, 8, 3, 3);
      ball[1].setBall(7, 10, 10, 4, 4);
      ball[2].setBall(11, 3, 12, 5, 5);

      }

      //ゲームの処理はここに書く
      private void gameUpdate() {
      //ball.x++;
      //ball.y++;
      for(int i=0; i<3; i++){
      ball[i].move(WIDTH, HEIGHT);
      }
      }

      //描画処理はここに書く
      private void gameDraw(Graphics g) {
      // 背景
      g.setColor(Color.BLACK);
      g.fillRect(0, 0, WIDTH, HEIGHT);

      g.setColor(Color.YELLOW);
      g.fillOval(ball[0].getX(), ball[0].getY(), ball[0].getSIZE(), ball[0].getSIZE());

      g.setColor(Color.RED);
      g.fillOval(ball[1].getX(), ball[1].getY(), ball[1].getSIZE(), ball[1].getSIZE());

      g.setColor(Color.WHITE);
      g.fillOval(ball[2].getX(), ball[2].getY(), ball[2].getSIZE(), ball[2].getSIZE());


      }

      削除