Y.Okamoto@Psy.JWU

流れ星

ポインタによる線形リスト、スレッド、アニメーション

 

ポインタによるリストの表現は、Javaにおけるクラス型がポインタであることを利用して行うことができる。流れ星のアニメーション・プログラムをポインタによるリスト表現の例として作成した。アニメーションの速さを制御するためにスレッドのsleepメソッドを用いた。流れ星は図1のように画面に表示される。

図1

 

このサンプルプログラムのファイルは圧縮ファイルcomet.ZIPとしてまとめた。comet.ZIPここをクリックしてダウンロードできる。ダウンロードして解凍すると作成されるフォルダcometにあるプロジェクトファイルcomet.jpxをダブルクリックなどによりJBuilderで開くと実行することができる。

プログラム(プロジェクト)を実行すると図2のフレームが表示される。

 

図2

 

GOボタンのクリックで図1のように流れ星が表示される。Exitボタンをクリックするとプログラムが終了する。

プログラムの内容を簡単に説明する。

1つ1つの星をオブジェクトとして扱い、そのためのクラス型を図3のように宣言している。

 

図3

 

線形リストのためのポインタが

 

Star spos;

 

とフィールドとして宣言されている。このポインタにより線形リストが図4のように構成されている。

 

図4

 

星の線形リストはリスト1に示されているwhile文による無限ループで管理されている。

 

リスト1

 

           Star p, p0;

            long ix, iy;

            while (true) {        //  無限ループ

                //   線形リストの探索

                p = SStar;

                do {

                    p0 = p.spos;

                    //   星が画面から飛び出しているかどうかのチェック

                    if (((p0.xpos-p0.size) > w) ||

                        ((p0.xpos+p0.size) < 0) ||

                        ((p0.ypos-p0.size) > h) ||

                        ((p0.ypos+p0.size) < 0)) {

                              //   飛び出している場合は線形リストからはずす

                              //

                              //   星の描画を消す

                              g.setColor(new Color(0,0,0));

                              ix = Math.round(p0.xpos);

                              iy = Math.round(p0.ypos);

                              g.fillOval((int)ix-2,(int)iy-2,4,4);

 

                              p.spos = p0.spos;  //  リストからはずす

 

                    } else {  //   飛び出していない場合は描画を更新する

                              p0.setNext();

                              p = p0;      //  次のインスタンス

                    }

                } while (p.spos != EStar);  //  最後尾かどうかのチェック

 

                //   星を2個生成

                p.spos = new Star();

                p0 = new Star();

                p.spos.spos = p0;

                p0.spos = EStar;

 

                jButtonExit.updateUI();  //  ボタンに穴が開くのを防ぐ

 

                try {

                    this.sleep(100);     //  100ミリ秒のお休み

                } catch (Exception ee) {

                    System.exit(9);

                }

            }

 

 

画面からはみ出した星は線形リストからはずされるが、このはずされた星のオブジェクトはJavaにより自動的に削除される。アニメーションの速さはsleepメソッドによって制御されているので、無限ループの実行中もCPUの使用率は高くない。これらのことは図5のタスクマネージャのパフォーマンスの表示によって確認することができる。

 

図5

 

フレームとパネルの最大化はリスト2に示すように、スクリーンのサイズを取得して行っている。

 

リスト2

    private void jbInit() throws Exception {

        contentPane = (JPanel) getContentPane();

        contentPane.setLayout(null);

 

        //      スクリーンのサイズの取得

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        w = screenSize.width;

        h = screenSize.height;

 

        setSize(new Dimension(w,h));  //  フレームの最大化

                     

                     

                     

        //      パネルの最大化

        jPanel1.setLocation(0,0);

        jPanel1.setSize(new Dimension(w,h));

        jPanel1.setBackground(new Color(0,0,0));  //  背景の色の設定(黒)

    }

 

GOボタンのクリックで図6に示すメソッドが呼び出される。

 

図6

 

図6のメソッドでは、パネルjPanel1上での描画用グラフィックオブジェクトをグローバル変数gに設定してから星の運動を表すアニメーション用のスレッドMyThreadを生成・実行している。このスレッドのsleepメソッドにより運動の速さが制御されている。

 

Up