MyShip から連射する

MyShip(自機)を操作しながら Space キーで連射します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. サンプルプログラムをコピー&ペーストして動かすだけでは勉強になりません。
    今回は読者自身で作成してみて下さい。
    Point(Point2D.Float)の説明は Rotation Class に Point を使うを参照して下さい。
    画像の描画は JPEG ファイルを表示する を参照して下さい。
    画像の切り分けは 美人の顔のアニメーション を参照して下さい。
    Sprite Class の説明は Sprite Class でアニメーション を参照して下さい。
    キーの操作は 矢印キーでキャラクターを動かす を参照して下さい。
    KeyListener で直接キーを検出したのでは、タイムラグが生じます。
    詳しい説明は Timer でキーの状態を調べる または Runnable を使う を参照して下さい。
    シューティングゲームでは FPS(frames per second) を一定にして描画します。
    FPS の説明は Thread で FPS を制御 または Runnable で FPS を制御 を参照して下さい。
    普通に描画したのでは画面の「チラツキ」が大きくてゲームになりません。
    チラツキを少なくする方法は Double Buffer を使う を参照して下さい。
    ArrayList を使うとサイズの制限が無くなり、要素の「追加/挿入/削除」が簡単に出来るようになります。
    ArrayList の説明は ArrayList で String を使う を参照して下さい。
  2. 幾つかヒントを提供しましょう。
    ベースとなるプログラムは、やはり Array List で連射する でしょうか。
    これをベースに キーでシップを操作 を組み込みます。
    出来たら 背景画像のスクロール もほしいですね。
  3. プログラムの最初の部分です。
    背景画像をスクロールするなら、その領域も追加して下さい。
        import java.awt.*;
        import javax.swing.*;
        import java.awt.event.*;
        import java.awt.geom.Point2D;
        import java.util.*;
    
        class Shoot_05 extends JFrame implements KeyListener
        {   // MyShip
            int         key_t[] = { 0,0,0,0,0 };    //UP, RIGHT, DOWN, LEFT, SPACE
            Image       ship;                   //Ship の画像
            Point       pos= new Point(300,380);//Ship の座標
            // Shot
            ArrayList<Shot>   list;             //弾の登録
            Shot        shotw;                  //Shot のワーク
            Image       img;                    //弾の画像
            long        nowTime,drawTime,shotTime;
            // Double Buffer
            Dimension   size;
            Image       back;
            Graphics    buffer;
        
  4. KeyEvent Listener では矢印キーに加えて Space キーも追加して下さい。
        // KeyEvent Listener
        public void keyPressed(KeyEvent e)
        {   switch(e.getKeyCode( ))
            {   case KeyEvent.VK_ESCAPE: System.exit(0);  break;
                case KeyEvent.VK_UP :   key_t[0]= 1;  break;
                case KeyEvent.VK_RIGHT: key_t[1]= 1;  break;
                case KeyEvent.VK_DOWN : key_t[2]= 1;  break;
                case KeyEvent.VK_LEFT : key_t[3]= 1;  break;
                case KeyEvent.VK_SPACE: key_t[4]= 1;  break;
            }
        }
        
  5. 弾丸は MyShip の画像に合わせて、座標(x,y)から発射します。
    下記のソースコードでは、シップの画像の先端から上方向に発射しています。
        if (key_t[4]==1)                // Space で連射
        {   if (shotTime<nowTime)
            {   shotTime= nowTime+100;
                shotw = new Shot();
                shotw.Set(pos.x+20,pos.y,0,-8);
                list.add(shotw);
            }
        }
        

超初心者のプログラム入門(Java2)