人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

ボールをたくさん作る

跳ね返るボールを複数作ってみます。今回はボールを表すクラスを別途作りました。このクラス(オブジェクトの雛形)を用いればいくつでもボールが作れます。オブジェクト指向が非常に強力な仕組みであることを理解してください。オブジェクト指向については特に解説はしません。クラス、オブジェクト等の言葉がわからないときは先にJavaの入門書を読んでみてください。

many_balls.jar

オブジェクト指向

今回はオブジェクト指向を使います。ボールに関する情報はすべてBallクラスに集中させてMainPanelとは独立させましょう。Ballに関する情報は何でしょう?ボールの大きさ、位置、速度などが考えられます。また、ボールに関する操作としてボールの移動、ボールの描画、跳ね返り処理などが考えられます。このようにデータとそれに対する操作をクラスとしてパックできるのがオブジェクト指向の利点です

Ballのコンストラクタを見てください。コンストラクタではボールの位置(x,y)、ボールの速度(vx,vy)を受け取っています。

    // コンストラクタ(新しいボールオブジェクトを作る工場)
    public Ball(int x, int y, int vx, int vy) {

    }

オブジェクトの配列

ボールの作成で注意しなければならないのは、

    // ボールを格納する配列
    private Ball[] ball;

    // ボールを格納する配列を作成
    ball = new Ball[NUM_BALL];
    // ボールを作成
    ball[0] = new Ball(0, 0, 1, 2);
    ball[1] = new Ball(10, 10, 3, -2);
    ball[2] = new Ball(50, 0, -2, 3);
    ball[3] = new Ball(0, 0, 12, 8);

この部分でしょうか。ここで、ballはBall型オブジェクトを格納する配列という点に注意してください。配列を作っただけではオブジェクトは作られません。配列の各要素にオブジェクトをnewで作って代入するのを忘れないようにしましょう。私がJava入門者のときは配列だけ作ってオブジェクトの代入を忘れたということがたびたびありました。描画はオブジェクトにまかせる。

あと描画のところも見てください。

    // 各ボールを描画
    for (int i = 0; i < NUM_BALL; i++) {
        ball[i].draw(g);
    }

各ボールの描画はBallクラスのdraw()にgを渡して丸投げしています。paintComponent()でfillOval()を使って図形を直接描画することはしません。これもよく使うテクニックで委譲といいます。Ballオブジェクトに描画を委譲する(おまかせする)という意味ですね。