宝箱の蓋を開ける

BG に設定した宝箱を探し出して、宝物を取り出します。

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

プログラムの作成

  1. CARD.java をコンパイルして CARD.class を作成して下さい。
    CARD.class の説明は CARD Class で画像を切り分ける を参照して下さい。
    BG.java をコンパイルして BG.class を作成して下さい。
    BG.class の説明は BG のスクロール を参照して下さい。
  2. 宝箱を探し出して蓋を開ける Rpg_06.java です。
    BG.class と CARD.class と同じフォルダーに格納して下さい。
    //★ 宝箱の蓋を開ける    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Rpg_06 extends JFrame implements KeyListener
    {   // Back Ground
        BG      bg;
        Point   off= new Point();           // BG のスクロール値
        // Character
        CARD    card;
        int     key_t[] = { 0,0,0,0 };      //UP, RIGHT, DOWN, LEFT
        Point   pos= new Point(320,512);
        int     dir= 0, num= 0;
        long    animeTime= 0;
        // Game Window
        Rectangle   win= new Rectangle(0,0,800,600);
        // Double Buffer
        Dimension   size;
        Image       back;
        Graphics    buffer;
    
        // Main
        public static void main(String args[])
        {   new Rpg_06();
        }
    
        // Constructor
        Rpg_06()
        {   super("宝箱の蓋を開ける");
            bg = new BG("JavaBg.txt");
            bg.SetRect(win);
            bg.LoadAT("JavaBgAtt.txt");
            off.y= bg.scrollMax.y;
            card = new CARD("c:\\data\\test\\Chr47.gif",32,32);
            addKeyListener(this);
            ThreadClass threadcls = new ThreadClass();
            Thread thread = new Thread(threadcls);
            thread.start();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBackground(Color.gray);
            setSize(800,600);
            setLocation(400,200);
            setVisible(true);
            size = getSize();
            back= createImage(size.width, size.height);
            if (back==null) System.out.print("createImage Error");
        }
    
        //  Runnable Class
        class ThreadClass implements Runnable
        {
            public void run()
            {   long    nowTime,drawTime;
                nowTime= System.currentTimeMillis();
                drawTime= nowTime+30;
                while(true)
                {   nowTime= System.currentTimeMillis();
                    if (drawTime<nowTime)
                    {   drawTime= nowTime+30;
                        action();
                        repaint();
                    }
                }
            }
        }
    
        // キャラクタの移動
        public void action()
        {   int     i;
            long  nowTime = System.currentTimeMillis();
            if (animeTime < nowTime)
            {   animeTime= nowTime+300;
                num^= 1;
            }
            eventcheck();       //イベントのチェック
            // MAP の境界まで動く
            i= 4;
            if ((pos.x+off.x)%32!=0 && (dir==1 || dir==3))  i= dir;
            if ((pos.y+off.y)%32!=0 && (dir==2 || dir==0))  i= dir;
            // キーが押されているか
            if (i>3)
            {   for(i=0; i<4; i++)
                {   if (key_t[i]==1)
                    {   dir= i;
                        if (bg.GetAtt(i,pos,off)>0) break;
                    }
                }
            }
            // 座標の更新
            if (i<4)
            {   switch(i)
                {   case 0:     // UP
                        if (pos.y>bg.center.y)  pos.y-= 4;
                        else    if (off.y>=4)   off.y-= 4;
                        else    pos.y-= 4;
                        break;
                    case 1:     // RIGHT
                        if (pos.x<bg.center.x)  pos.x+= 4;
                        else    if (off.x+4<bg.scrollMax.x)   off.x+= 4;
                        else    pos.x+= 4;
                        break;
                    case 2:     // DOWN
                        if (pos.y<bg.center.y)  pos.y+= 4;
                        else    if (off.y+4<bg.scrollMax.y)   off.y+= 4;
                        else    pos.y+= 4;
                        break;
                    case 3:     // LEFT
                        if (pos.x>bg.center.x)  pos.x-= 4;
                        else    if (off.x>=4)   off.x-= 4;
                        else    pos.x-= 4;
                        break;
                }
            }
        }
    
        // イベントのチェック
        public void eventcheck()
        {   int     wat,wx,wy;
            wat= bg.GetAtt(pos,off);
            switch(wat)
            {   case 2:     //宝箱の蓋を開ける
                    wx= bg.GetX(pos.x,off.x);
                    wy= bg.GetY(pos.y,off.y);
                    bg.TT[wy][wx]++;
                    bg.TT[wy-1][wx]++;
                    System.out.println("宝箱を見つけた!");
                    return;
            }
        }
    
        // Paint
        public void paint(Graphics g)
        {   if (back==null)     return;
            buffer= back.getGraphics();
            if (buffer==null)   return;
            buffer.setColor(getBackground());
            buffer.fillRect(0, 0, size.width, size.height);
            bg.MapView(buffer,off.x,off.y);
            card.View(buffer,dir*2+num,pos.x+12,pos.y+20);
            g.drawImage(back,0,0,this);
        }
    
        // 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;
            }
        }
        public void keyReleased(KeyEvent e)
        {   switch(e.getKeyCode( ))
            {   case KeyEvent.VK_UP :   key_t[0]= 0;  break;
                case KeyEvent.VK_RIGHT: key_t[1]= 0;  break;
                case KeyEvent.VK_DOWN : key_t[2]= 0;  break;
                case KeyEvent.VK_LEFT : key_t[3]= 0;  break;
            }
        }
        public void keyTyped(KeyEvent e) { }
    }
    
  3. プロジェクトのフォルダーに以下のファイルを格納して下さい。
    ファイル名 説明 掲載場所
    CARD.java CARD Object ClassCARD Class で画像を切り分ける
    BG.java BG Object Class BG のスクロール
    JavaBg.txtMapEditor で出力した TEXT 形式のファイル このページの後部
    JavaBgAtt.txtMapChip の属性を定義したファイル このページの後部
    JavaBg.gifMapChip の画像ファイル このページの先頭
    Chr47.gif キャラクタの画像ファイル矢印キーでキャラクタを操作
    矢印キーでキャラクタを操作して、宝箱を探して下さい。
    宝箱の蓋が開いたら完成です。

プログラムの説明

  1. 前回までの説明は BG のスクロール を参照して下さい。
    BG のスクロールには、二種類の方法があります。
    1. キャラクタを中央に置く方法
      キャラクタを中央に置いて、先に背景画像からスクロールします。
      背景画像がスクロール出来なくなったら、キャラクタを動かします。
      戻るときはキャラクタが中央に来るまで移動し、中央に来たら背景をスクロールします。
    2. キャラクタから動かす方法
      矢印キーの操作で先にキャラクタを動かします。
      キャラクタがウインドウの端に来ると背景をスクロールします。
    今回はキャラクタを中央に置く方法を使っています。
    ただし、横方向はスクロールの余地が無いので、キャラクタが動きます。
  2. 最初キャラクタは、背景画面の下部に配置しています。
        // Back Ground
        BG      bg;
        Point   off= new Point();           // BG のスクロール値
        // Character
        CARD    card;
        int     key_t[] = { 0,0,0,0 };      //UP, RIGHT, DOWN, LEFT
        Point   pos= new Point(320,512);
        int     dir= 0, num= 0;
        long    animeTime= 0;
        // Game Window
        Rectangle   win= new Rectangle(0,0,800,600);
        
  3. Constructor で BG をインスタンス化して、ゲームウインドウ(背景画像を描画する矩形領域)を設定します。
    bg.LoadAT() でマップチップの属性データを入力します。
        // Constructor
        Rpg_06()
        {   super("宝箱の蓋を開ける");
            bg = new BG("JavaBg.txt");
            bg.SetRect(win);
            bg.LoadAT("JavaBgAtt.txt");
            off.y= bg.scrollMax.y;
            card = new CARD("c:\\data\\test\\Chr47.gif",32,32);
            addKeyListener(this);
            ThreadClass threadcls = new ThreadClass();
            Thread thread = new Thread(threadcls);
            thread.start();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBackground(Color.gray);
            setSize(800,600);
            setLocation(400,200);
            setVisible(true);
            size = getSize();
            back= createImage(size.width, size.height);
            if (back==null) System.out.print("createImage Error");
        }
        
  4. paint() メソッドでは off.x, off.y を指定して BG を描画します。
    BG の上から card.view() でキャラクタをアニメーションしながら描画します。
        public void paint(Graphics g)
        {   if (back==null)     return;
            buffer= back.getGraphics();
            if (buffer==null)   return;
            buffer.setColor(getBackground());
            buffer.fillRect(0, 0, size.width, size.height);
            bg.MapView(buffer,off.x,off.y);
            card.View(buffer,dir*2+num,pos.x+12,pos.y+20);
            g.drawImage(back,0,0,this);
        }
        
  5. action() メソッドで矢印キーを検出してキャラクタを操作します。
    eventcheck(); が宝箱を調べるメソッドです。
    キャラクタをマップの境界に合わせて移動します。
        // キャラクタの移動
        public void action()
        {   int     i;
            long  nowTime = System.currentTimeMillis();
            if (animeTime < nowTime)
            {   animeTime= nowTime+300;
                num^= 1;
            }
            eventcheck();       //イベントのチェック
            // MAP の境界まで動く
            i= 4;
            if ((pos.x+off.x)%32!=0 && (dir==1 || dir==3))  i= dir;
            if ((pos.y+off.y)%32!=0 && (dir==2 || dir==0))  i= dir;
            // キーが押されているか
            if (i>3)
            {   for(i=0; i<4; i++)
                {   if (key_t[i]==1)
                    {   dir= i;
                        if (bg.GetAtt(i,pos,off)>0) break;
                    }
                }
            }
            // 座標の更新
            if (i<4)
            {   switch(i)
                {   case 0:     // UP
                        if (pos.y>bg.center.y)  pos.y-= 4;
                        else    if (off.y>=4)   off.y-= 4;
                        else    pos.y-= 4;
                        break;
                    case 1:     // RIGHT
                        if (pos.x<bg.center.x)  pos.x+= 4;
                        else    if (off.x+4<bg.scrollMax.x)   off.x+= 4;
                        else    pos.x+= 4;
                        break;
                    case 2:     // DOWN
                        if (pos.y<bg.center.y)  pos.y+= 4;
                        else    if (off.y+4<bg.scrollMax.y)   off.y+= 4;
                        else    pos.y+= 4;
                        break;
                    case 3:     // LEFT
                        if (pos.x>bg.center.x)  pos.x-= 4;
                        else    if (off.x>=4)   off.x-= 4;
                        else    pos.x-= 4;
                        break;
                }
            }
        }
        
  6. 宝箱を調べる eventcheck() メソッドです。
    bg.GetAtt() で現在のセルの属性を調べます。
    属性=2 のときは「宝箱」のセルです。
    宝箱を探し当てると、蓋が空いた画像に切り替えます。
    宝箱の画像と蓋が空いた画像が隣同士で並んでいることを確認して下さい。
        // イベントのチェック
        public void eventcheck()
        {   int     wat,wx,wy;
            wat= bg.GetAtt(pos,off);
            switch(wat)
            {   case 2:     //宝箱の蓋を開ける
                    wx= bg.GetX(pos.x,off.x);
                    wy= bg.GetY(pos.y,off.y);
                    bg.TT[wy][wx]++;
                    bg.TT[wy-1][wx]++;
                    System.out.println("宝箱を見つけた!");
                    return;
            }
        }
        

TEXT File

  1. MapEditor で出力した TEXT 形式のファイル JavaBg.txt です。
    //Map  Ver 3.2  前田 稔
    //JavaBG.gif
    //  25,   40,   32,   32,  Map の幅と高さ, Mapchip の幅と高さ
    103, 103, 103, 103, 103, 103, 103, 101, 11, 136, 153, 8, 55, 8, 8, 8, 56, 53, 8, 8, 8, 61, 8, 96, 8, 
    119, 119, 119, 119, 119, 119, 119, 101, 11, 109, 109, 8, 8, 54, 8, 8, 8, 8, 8, 8, 8, 61, 8, 112, 8, 
    103, 11, 11, 11, 11, 11, 11, 101, 11, 136, 153, 8, 52, 8, 56, 8, 8, 61, 61, 61, 8, 61, 169, 170, 8, 
    119, 11, 11, 11, 11, 11, 11, 101, 11, 152, 137, 8, 8, 53, 8, 8, 61, 8, 8, 8, 8, 61, 185, 186, 61, 
    103, 11, 11, 11, 11, 11, 11, 101, 11, 136, 153, 8, 54, 8, 8, 8, 61, 8, 54, 8, 54, 8, 56, 8, 8, 
    119, 11, 11, 11, 11, 11, 11, 101, 11, 152, 137, 8, 8, 8, 61, 61, 8, 8, 53, 8, 52, 8, 8, 56, 14, 
    11, 11, 165, 166, 11, 11, 11, 101, 11, 136, 153, 56, 8, 61, 8, 8, 56, 14, 8, 54, 8, 14, 8, 8, 54, 
    105, 106, 181, 182, 107, 108, 104, 101, 11, 152, 153, 8, 8, 61, 8, 8, 8, 8, 8, 8, 8, 8, 55, 8, 8, 
    121, 122, 11, 11, 123, 124, 120, 101, 11, 152, 144, 145, 189, 147, 148, 147, 148, 145, 148, 145, 146, 147, 146, 147, 148, 
    11, 11, 11, 11, 11, 11, 11, 11, 11, 152, 128, 129, 189, 131, 132, 129, 130, 129, 130, 129, 130, 131, 132, 129, 130, 
    146, 147, 146, 147, 146, 147, 148, 145, 145, 149, 153, 49, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    129, 130, 131, 132, 129, 129, 130, 131, 130, 129, 151, 49, 3, 3, 3, 74, 160, 161, 162, 160, 161, 162, 74, 3, 3, 
    49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 90, 176, 177, 178, 176, 177, 178, 90, 3, 49, 
    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 3, 3, 3, 3, 3, 3, 3, 3, 16, 16, 3, 3, 3, 3, 3, 
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 
    29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 3, 33, 48, 48, 48, 48, 48, 48, 3, 48, 48, 48, 48, 48, 48, 
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 33, 24, 24, 24, 24, 24, 24, 3, 24, 24, 24, 24, 24, 24, 
    28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 74, 74, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 90, 90, 24, 24, 24, 24, 24, 24, 3, 24, 24, 24, 24, 24, 24, 
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    139, 172, 172, 172, 172, 172, 172, 140, 3, 141, 3, 32, 24, 24, 24, 24, 24, 24, 3, 24, 24, 24, 24, 24, 24, 
    155, 3, 3, 3, 3, 3, 156, 3, 3, 157, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    155, 3, 156, 3, 3, 3, 3, 3, 3, 157, 3, 32, 25, 25, 25, 25, 25, 25, 3, 25, 25, 25, 25, 25, 25, 
    155, 3, 3, 3, 3, 156, 3, 3, 3, 157, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    155, 3, 3, 3, 3, 156, 3, 3, 3, 157, 3, 32, 25, 25, 25, 25, 25, 25, 3, 25, 25, 25, 25, 25, 25, 
    155, 3, 3, 156, 3, 3, 3, 3, 156, 157, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    171, 172, 172, 172, 172, 172, 172, 172, 172, 173, 3, 32, 25, 25, 25, 25, 25, 25, 3, 25, 25, 25, 25, 25, 25, 
    3, 3, 3, 3, 3, 37, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    134, 145, 146, 145, 146, 147, 148, 135, 32, 3, 3, 32, 26, 26, 26, 26, 26, 26, 3, 26, 26, 26, 26, 26, 26, 
    136, 64, 64, 64, 64, 64, 64, 137, 42, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    152, 64, 64, 85, 64, 69, 64, 153, 32, 3, 3, 32, 26, 26, 26, 26, 26, 26, 3, 26, 26, 26, 26, 26, 26, 
    136, 64, 69, 70, 85, 64, 64, 137, 30, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    152, 64, 64, 64, 64, 64, 64, 153, 32, 3, 3, 32, 26, 26, 26, 26, 26, 26, 3, 26, 26, 26, 26, 26, 26, 
    150, 130, 131, 132, 130, 131, 132, 151, 42, 3, 3, 3, 48, 48, 48, 48, 48, 48, 3, 48, 48, 48, 48, 48, 48, 
    135, 43, 43, 43, 43, 43, 43, 43, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 134, 145, 145, 146, 147, 148, 
    144, 145, 135, 3, 3, 3, 3, 3, 3, 76, 3, 75, 3, 3, 3, 3, 3, 134, 145, 149, 80, 80, 64, 80, 80, 
    80, 80, 137, 49, 49, 49, 49, 49, 49, 92, 3, 91, 49, 49, 49, 49, 49, 136, 80, 80, 80, 80, 80, 84, 80, 
    80, 80, 153, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 152, 80, 80, 80, 81, 80, 80, 80, 
    64, 81, 144, 145, 145, 145, 146, 147, 135, 3, 3, 134, 145, 146, 147, 148, 145, 149, 80, 84, 80, 80, 80, 84, 80, 
    64, 64, 64, 80, 80, 80, 80, 80, 137, 3, 3, 136, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 
    
  2. MapChip の属性を定義したファイル JavaBgAtt.txt です。
    //JavaBG.gif の属性(0:通行不可  1:通行可  2:宝箱  3:ワープ 4:ドア)  12*16
      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,
      1,  1,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,
      1,  0,  1,  1,  0,  1,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  1,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  0,  0,  0,  0,  0,
      1,  1,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,
      2,  1,  2,  1,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  3,  0,
      0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  1,  0,
      0,  0,  0,  1,  1,  3,  3,  1,  1,  1,  1,  0,  0,  1,  1,  1,
    

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