秘密の通路を通ると、ダンジョンの BG(Back Ground) に切り替わります。

Applet でプログラムを体験できます。
ダンジョンに切り替える

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

プログラムの作成

  1. CARD.java をコンパイルして CARD.class を作成して下さい。
    CARD.class の説明は CARD Class で画像を切り分ける を参照して下さい。
    BG.java をコンパイルして BG.class を作成して下さい。
    BG.class の説明は BG のスクロール を参照して下さい。
  2. Rpg_07.java の名前で BG.class と CARD.class と同じフォルダーに格納して下さい。
    //★ ダンジョンに切り替える    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Rpg_07 extends JFrame implements KeyListener
    {   // Back Ground
        BG          bg,bg2;
        Point       off= new Point();           // BG のスクロール値
        byte        Flag= 0;
        // DialogBox
        MyDialog    dlg;
        MyDialog2   dlg2;
        MyDialog3   dlg3;
        // Character
        CARD        card;
        int         key_t[] = { 0,0,0,0 };      //UP, RIGHT, DOWN, LEFT
        Point       pos= new Point(320,512);    //4の倍数
        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_07();
        }
    
        // Constructor
        Rpg_07()
        {   super("ダンジョンに切り替える");
            bg = new BG("JavaBg.txt");
            bg.SetRect(win);
            bg.LoadAT("JavaBgAtt.txt");
            off.y= bg.scrollMax.y;
            bg2 = new BG("JavaBg2.txt");
            bg2.SetRect(win);
            bg2.LoadAT("JavaBgAtt.txt");
            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");
            dlg = new MyDialog(this);
            dlg2 = new MyDialog2(this);
            dlg3 = new MyDialog3(this);
        }
    
        //  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;
                        if (action())   repaint();
                    }
                }
            }
        }
    
        // キャラクタの移動
        public boolean action()
        {   int     i,wat;
            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)
                    {   if (Flag<2)     wat= bg.GetAtt(i,pos,off);
                        else            wat= bg2.GetAtt(i,pos,off);
                        if (wat>0)  break;
                    }
                }
            }
            // 座標の更新
            if (i>3)    return false;
            dir= i;
            switch(dir)
            {   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;
            }
            return true;
        }
    
        // イベントのチェック
        public void eventcheck()
        {   int     wx,wy,wat;
            boolean flg;
            if (Flag<2)     wat= bg.GetAtt(pos,off);
            else            wat= bg2.GetAtt(pos,off);
            flg= false;
            switch(wat)
            {   case 2:     //宝箱
                    takara(pos, off,Flag);  //宝箱の蓋を開ける
                    if (Flag==0)
                    {   System.out.println("アイテムを見つけた!");
                        dlg.setVisible(true);
                        Flag= 1;
                        flg= true;
                        break;
                    }
                    if (Flag==2)
                    {   System.out.println("宝物を手に入れた!");
                        dlg3.setVisible(true);
                        Flag= 3;
                        flg= true;
                        break;
                    }
                    break;
                case 3:     //ダンジョンの入口
                    if (Flag==1)
                    {   System.out.println("秘密の入口だ!");
                        Flag= 2;
                        dlg2.setVisible(true);
                        flg= true;
                        break;
                    }
                    //ダンジョンの出口
                    if (Flag==3)
                    {   System.out.println("出口だ!");
                        Flag= 1;
                        break;
                    }
                    break;
            }
            if (flg)    for(int i=0; i<4; i++)  key_t[i]= 0;
        }
    
        // 宝箱の蓋を開ける
        public void takara(Point pos, Point off, int flag)
        {   int wx,wy;
            if (flag==0)
            {   wx= bg.GetX(pos.x,off.x);
                wy= bg.GetY(pos.y,off.y);
                bg.TT[wy][wx]++;
                bg.TT[wy-1][wx]++;
            }
            if (flag==2)    //ダンジョン
            {   wx= bg2.GetX(pos.x,off.x);
                wy= bg2.GetY(pos.y,off.y);
                bg2.TT[wy][wx]++;
                bg2.TT[wy-1][wx]++;
                bg2.TT[wy+1][wx]= 11;
            }
        }
    
        // 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);
            if (Flag<2)     bg.MapView(buffer,off.x,off.y);
            else            bg2.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) { }
    }
    
    // Dialog Box
    class MyDialog extends JDialog implements ActionListener
    {
        MyDialog(Frame owner)
        {   super(owner);
            getContentPane().setLayout(new FlowLayout());
            JButton btn = new JButton("OK");
            btn.addActionListener(this);
            getContentPane().add(btn);
            setTitle("アイテムを見つけた");
            setSize(300, 80);
            setLocation(400, 300);
            //setVisible(true);
        }
        public void actionPerformed(ActionEvent e)
        {   setVisible(false);  // 非表示にする
        }
    }
    
    // Dialog Box-2
    class MyDialog2 extends JDialog implements ActionListener
    {
        MyDialog2(Frame owner)
        {   super(owner);
            getContentPane().setLayout(new FlowLayout());
            JButton btn2 = new JButton("OK");
            btn2.addActionListener(this);
            getContentPane().add(btn2);
            setTitle("秘密の入口だ");
            setSize(300, 80);
            setLocation(400, 300);
        }
        public void actionPerformed(ActionEvent e)
        {   setVisible(false);  // 非表示にする
        }
    }
    
    // Dialog Box-3
    class MyDialog3 extends JDialog implements ActionListener
    {
        MyDialog3(Frame owner)
        {   super(owner);
            getContentPane().setLayout(new FlowLayout());
            JButton btn3 = new JButton("OK");
            btn3.addActionListener(this);
            getContentPane().add(btn3);
            setTitle("宝物を手に入れた");
            setSize(300, 80);
            setLocation(400, 300);
        }
        public void actionPerformed(ActionEvent e)
        {   setVisible(false);  // 非表示にする
        }
    }
    
  3. プロジェクトのフォルダーに以下のファイルを格納して下さい。
    ファイル名 説明 掲載場所
    CARD.java CARD Object ClassCARD Class で画像を切り分ける
    BG.java BG Object ClassBG のスクロール
    JavaBg.txtMapEditor で出力した TEXT 形式のファイル宝箱の蓋を開ける
    JavaBg2.txtMapEditor で出力したダンジョンのTEXT 形式のファイルこのページの後部
    JavaBgAtt.txtMapChip の属性を定義したファイル宝箱の蓋を開ける
    JavaBg.gifMapChip の画像ファイル このページの先頭
    Chr47.gif キャラクタの画像ファイル矢印キーでキャラクタを操作
    矢印キーでキャラクタを操作して、宝箱を探して下さい。
    アイテムを取得して、秘密の通路を通るとダンジョンに切り替わります。
    ダンジョンに隠されている宝物を取得して、戻ってきて下さい。

プログラムの説明

  1. 前回までの説明は 宝箱の蓋を開ける を参照して下さい。
    今回は二枚の BG と三個の DialigBox を使います。
    Flag でゲームをコントロールします。
    1. Flag == 0
      ゲームが開始した状態です。
    2. Flag == 1
      アイテムを手に入れた状態です。
    3. Flag == 2
      秘密の通路を通ってダンジョンに切り替わった状態です。
    4. Flag == 3
      宝物を手に入れた状態です。
        public class Rpg_07 extends JFrame implements KeyListener
        {   // Back Ground
            BG          bg,bg2;
            Point       off= new Point();           // BG のスクロール値
            byte        Flag= 0;
            // DialogBox
            MyDialog    dlg;
            MyDialog2   dlg2;
            MyDialog3   dlg3;
        
  2. 二枚の BG をインスタンス化して、ゲームウインドウを設定します。
    三個の DialigBox をインスタンス化します。
        // Constructor
        Rpg_07()
        {   super("ダンジョンに切り替える");
            bg = new BG("JavaBg.txt");
            bg.SetRect(win);
            bg.LoadAT("JavaBgAtt.txt");
            off.y= bg.scrollMax.y;
            bg2 = new BG("JavaBg2.txt");
            bg2.SetRect(win);
            bg2.LoadAT("JavaBgAtt.txt");
            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");
            dlg = new MyDialog(this);
            dlg2 = new MyDialog2(this);
            dlg3 = new MyDialog3(this);
        }
        
  3. 画像を描画する paint() メソッドです。
    BG を二枚使用するので、使い分けて下さい。
        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);
            if (Flag<2)     bg.MapView(buffer,off.x,off.y);
            else            bg2.MapView(buffer,off.x,off.y);
            card.View(buffer,dir*2+num,pos.x+12,pos.y+20);
            g.drawImage(back,0,0,this);
        }
        
  4. 宝箱を調べる eventcheck() メソッドです。
    ここでも二枚の BG を使い分けて下さい。
    bg.GetAtt() で現在のセルの属性を調べます。
    属性=2 のときは「宝箱」のセルです。
    属性=3 のときはダンジョンの入口(出口)です。
    宝箱を探し当てると、蓋が空いた画像に切り替えます。
    ダンジョンの宝箱を探し当てると、宝箱の底が抜けて出口に出られます。
        // イベントのチェック
        public void eventcheck()
        {   int     wx,wy,wat;
            boolean flg;
            if (Flag<2)     wat= bg.GetAtt(pos,off);
            else            wat= bg2.GetAtt(pos,off);
            flg= false;
            switch(wat)
            {   case 2:     //宝箱
                    takara(pos, off,Flag);  //宝箱の蓋を開ける
                    if (Flag==0)
                    {   System.out.println("アイテムを見つけた!");
                        dlg.setVisible(true);
                        Flag= 1;
                        flg= true;
                        break;
                    }
                    if (Flag==2)
                    {   System.out.println("宝物を手に入れた!");
                        dlg3.setVisible(true);
                        Flag= 3;
                        flg= true;
                        break;
                    }
                    break;
                case 3:     //ダンジョンの入口
                    if (Flag==1)
                    {   System.out.println("秘密の入口だ!");
                        Flag= 2;
                        dlg2.setVisible(true);
                        flg= true;
                        break;
                    }
                    //ダンジョンの出口
                    if (Flag==3)
                    {   System.out.println("出口だ!");
                        Flag= 1;
                        break;
                    }
                    break;
            }
            if (flg)    for(int i=0; i<4; i++)  key_t[i]= 0;
        }
        
  5. Dialog Box の Class です。
    他の Dialog Box も同じ要領です。
        // Dialog Box
        class MyDialog extends JDialog implements ActionListener
        {
            MyDialog(Frame owner)
            {   super(owner);
                getContentPane().setLayout(new FlowLayout());
                JButton btn = new JButton("OK");
                btn.addActionListener(this);
                getContentPane().add(btn);
                setTitle("アイテムを見つけた");
                setSize(300, 80);
                setLocation(400, 300);
            }
            public void actionPerformed(ActionEvent e)
            {   setVisible(false);  // 非表示にする
            }
        }
        

TEXT File

  1. MapEditor で出力したダンジョンの TEXT 形式のファイル JavaBg2.txt です。
    //Map  Ver 3.2  前田 稔
    //JavaBG.gif
    //  25,   40,   32,   32,  Map の幅と高さ, Mapchip の幅と高さ
    100, 100, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 100, 100, 100, 
    101, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 11, 11, 101, 
    100, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 100, 165, 166, 100, 
    100, 103, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 100, 181, 182, 100, 
    100, 119, 105, 106, 11, 107, 108, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 11, 11, 100, 
    100, 103, 121, 122, 11, 123, 124, 100, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 11, 100, 
    100, 119, 11, 11, 11, 100, 100, 100, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 100, 11, 100, 
    101, 103, 11, 11, 100, 103, 103, 103, 102, 102, 102, 102, 11, 102, 102, 102, 102, 102, 103, 103, 103, 103, 100, 11, 101, 
    100, 119, 11, 11, 100, 119, 119, 119, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 119, 119, 119, 119, 100, 11, 100, 
    100, 11, 11, 11, 100, 102, 102, 102, 102, 102, 102, 102, 11, 102, 102, 102, 102, 102, 102, 102, 102, 102, 100, 11, 100, 
    100, 11, 100, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 100, 11, 100, 
    100, 11, 100, 103, 103, 103, 103, 103, 103, 103, 103, 103, 11, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 11, 100, 
    101, 11, 100, 119, 119, 119, 119, 119, 119, 119, 119, 119, 11, 119, 119, 119, 119, 119, 119, 119, 119, 119, 100, 11, 101, 
    100, 11, 100, 103, 103, 103, 103, 103, 103, 103, 103, 103, 11, 102, 102, 102, 103, 103, 103, 103, 103, 103, 100, 11, 100, 
    100, 11, 100, 119, 119, 119, 119, 119, 119, 119, 119, 119, 11, 11, 11, 11, 119, 119, 119, 119, 119, 119, 100, 11, 100, 
    100, 11, 100, 102, 102, 102, 102, 102, 102, 102, 102, 102, 11, 102, 102, 102, 102, 102, 102, 102, 102, 102, 100, 11, 100, 
    100, 11, 100, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 100, 11, 100, 
    100, 11, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 100, 11, 100, 
    101, 11, 100, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 11, 101, 
    100, 11, 100, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 100, 11, 100, 
    100, 11, 100, 102, 102, 102, 102, 102, 102, 102, 102, 102, 11, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 11, 100, 
    100, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 119, 119, 119, 119, 119, 119, 119, 119, 119, 100, 11, 100, 
    100, 11, 100, 103, 103, 103, 103, 103, 103, 103, 103, 103, 11, 102, 102, 102, 102, 102, 103, 103, 103, 103, 100, 11, 100, 
    100, 11, 100, 119, 119, 119, 119, 119, 119, 119, 119, 119, 11, 11, 11, 11, 11, 11, 119, 119, 119, 119, 100, 11, 100, 
    101, 100, 100, 102, 102, 102, 102, 102, 102, 102, 102, 102, 11, 102, 102, 102, 102, 102, 102, 102, 102, 102, 100, 11, 100, 
    100, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 100, 11, 101, 
    100, 11, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 100, 100, 100, 101, 100, 100, 11, 100, 
    100, 11, 100, 103, 103, 103, 103, 103, 103, 103, 103, 103, 11, 102, 102, 103, 103, 103, 103, 103, 103, 103, 100, 11, 100, 
    100, 11, 100, 119, 119, 119, 119, 119, 119, 119, 119, 119, 11, 119, 119, 119, 119, 119, 119, 119, 119, 119, 100, 11, 100, 
    100, 11, 100, 103, 103, 103, 103, 103, 103, 103, 103, 103, 11, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 11, 100, 
    101, 11, 100, 119, 119, 119, 119, 119, 119, 119, 119, 119, 11, 119, 119, 119, 119, 119, 119, 119, 119, 119, 100, 11, 101, 
    100, 11, 100, 103, 103, 103, 103, 103, 103, 103, 103, 103, 11, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 11, 100, 
    100, 11, 100, 119, 119, 119, 119, 119, 119, 119, 119, 119, 11, 119, 119, 119, 119, 119, 119, 119, 119, 119, 100, 11, 100, 
    100, 11, 100, 103, 103, 103, 103, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 103, 103, 103, 103, 103, 100, 11, 100, 
    100, 11, 100, 119, 119, 119, 119, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 119, 119, 119, 119, 119, 100, 11, 100, 
    100, 11, 100, 103, 103, 103, 103, 11, 101, 100, 100, 101, 11, 101, 100, 100, 101, 103, 103, 103, 103, 103, 100, 11, 100, 
    101, 11, 100, 119, 119, 119, 119, 11, 100, 105, 106, 104, 98, 104, 107, 108, 100, 119, 119, 119, 119, 119, 100, 11, 101, 
    100, 11, 100, 11, 11, 11, 11, 11, 100, 121, 122, 120, 114, 120, 123, 124, 100, 100, 100, 100, 101, 100, 100, 11, 100, 
    100, 11, 11, 11, 11, 101, 100, 100, 100, 11, 11, 11, 100, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 100, 
    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 100, 100, 100, 101, 100, 100, 100, 100, 
    

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