import static jp.ac.tuis.lib.DxJava.*; // Java用DXライブラリクラス jp.ac.tuis.lib.DxJava の static メンバをインポート

// 弾を表すクラスを定義
class Shot {
    int x, y;
    int life;
    public Shot( int x, int y, int life ) {
        this.x = x; this.y = y; this.life = life;
    }
}

public class Array2 {
    public static void main(String[] args) {

        int x = 640/2 - 32/2, y = 480/2 - 32/2 ; // 最初の描画位置を画面の真ん中にセット(画面サイズは640x480)
        int keyInput;   // キー入力の結果を保存しておくための変数

        int bg     = 0; // 背景グラフィックのグラフィック番号
        int myShip = 0; // 自機グラフィックのグラフィック番号を記憶しておく変数

        Shot [ ] shots = new Shot[10]; // 弾を10発分管理する配列を生成する
        int j; // 自機の弾を表している配列をfor文で処理するためのカウンタ変数
        for( j = 0; j < shots.length; j++ ) { // 配列の各要素をShot型オブジェクトへの参照値で初期化
            shots[j] = new Shot( 0, 0, 0 );
        }
        int myShot = 0; // 自機弾グラフィックのグラフィック番号を記憶しておく変数

        myShot= LoadGraph( "Chars16_orange.bmp" ); // 自機弾グラフィック(16pixels×16pixels)の読み込み

        bg     = DxJava.LoadGraph( "bg.jpg" ); // 背景グラフィック(640pixels×600pixels)の読み込み
        myShip = LoadGraph( "MyShip32.bmp"  ); // 自機グラフィック(32pixels×32pixels)の読み込み

        SetDrawScreen( DX_SCREEN_BACK );  // 描画先を裏画面に設定する

        while( 0 == ProcessMessage() ){ // 無限に繰り返す(無限ループ)

            ClearDrawScreen(); /* 描画先画面をきれいに消去する */

            keyInput = GetJoypadInputState( DX_INPUT_KEY_PAD1 ); // キーボードからの入力を変数keyInputへ保存
            if( keyInput == PAD_INPUT_RIGHT ) { // 右矢印キーを押し続けても画面の右側に自機が出ないようにする
                if( (x + 5) >= (639-31) ) {
                    x = (639-31);
                }
                else {
                    x = x + 5;
                }
            }
            if( keyInput == PAD_INPUT_LEFT  ) { // 左矢印キーを押し続けても画面の左側に自機が出ないようにする
                if( (x - 5) <= 0 ) {
                    x = 0;
                }
                else {
                    x = x - 5;
                }
            }
            if( keyInput == PAD_INPUT_DOWN  ) { // 下矢印キーを押し続けても画面の下側に自機が出ないようにする
                if( (y + 5) >= (479 - 31) ) {
                    y = (479 - 31);
                }
                else {
                    y = y + 5;
                }
            }
            if( keyInput == PAD_INPUT_UP    ) { // 上矢印キーを押し続けても画面の上側に自機が出ないようにする
                if( (y - 5) <= 0 ) {
                    y = 0;
                }
                else {
                    y = y - 5;
                }
            }

            DxJava.DrawGraph( 0, 0, bg, DxJava.TRUE ); // 座標0,0に背景のグラフィックを描画する

            // キーボードから入力された文字がスペースなら自機が弾を撃つ
            if( GetInputChar( TRUE ) == ' ' ) { // GetInputChar(TRUE)はDXライブラリの機能でキーボードで押した文字を入力する
                for( j = 0; j < 10; j++ ) {
                    if( shots[j].life == 0 ) { // 未発射の弾を見つけたら...
                        shots[j].life = 1;     // 発射済みにして
                        shots[j].x = x + (32/2) - (16/2); // 弾のx座標を自機の鼻先に設定する
                        shots[j].y = y;                   // 弾のy座標を自機の鼻先に設定する
                        break; // 発射する弾は1個だけでいいので、繰り返しを強制的に終了させる
                    }
                }
            }

            for( j = 0; j < 10; j++ ) { // 自機の弾10個に対して次の処理を行う
                if( shots[j].y+16 < 0 ) shots[j].life = 0; // 画面から飛び出した弾は未発射状態にする
                if( shots[j].life != 0 ) {              // もし自機のj番目の弾が発射済みなら...
                    DrawGraph( shots[j].x, shots[j].y, myShot, TRUE ); // 自機のj番目の弾を画面に描画する
                    shots[j].y = shots[j].y - 8;        // 次の描画時のためにj番目の弾の位置を前に進める
                }
            }

            DrawGraph( x, y, myShip, TRUE ); // 座標x,yに自機のグラフィックを描画する

            ScreenFlip(); // 裏画面に描画したものを表画面に転写する


            if( 1 == CheckHitKey(KEY_INPUT_ESCAPE) ) break; // エスケープキーが押されたら繰り返し処理から出る
        } // while()の閉じ中括弧

    }
}