ダンジョンに切り替える

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

下のリンクをクリックすると、このページで作成したアプレットが実行されます。
ダンジョンに切り替える

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

プログラムの作成

  1. メモ帳などでタイプして rpgchange.java の名前で保存して下さい。
    Applet はサーバーにアップロードすることが前提なので、ファイル名やクラス名を小文字で統一しています。
    //★ ダンジョンに切り替える    前田 稔
    //   appletviewer rpgchange.htm
    import java.applet.*;
    import java.awt.*;
    import java.io.*;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import java.awt.event.*;
    
    public class rpgchange extends Applet implements Runnable, KeyListener
    {   // Back Ground
        bg          obj,obj2;                   // BG Class
        Point       off= new Point();           // BG のスクロール値
        byte        Flag= 0;                    // ゲームの進行フラグ
        // Character
        card        cat;                        // card Class(cat の描画)
        int         key_t[] = { 0,0,0,0 };      // UP, RIGHT, DOWN, LEFT
        Point       pos= new Point(320,512);    // cat の座標(4の倍数)
        int         dir= 0, num= 0;             // cat の向きとアニメ
        long        animeTime= 0;               // アニメーションのタイミング
        // Game Window
        Rectangle   win= new Rectangle(0,0,800,576);
        boolean     msg= true;                  // Message 表示
        Point       posw= new Point(320,512);   // cat の座標ワーク
        // Double Buffer
        Dimension   size;
        Image       back= null;
        Graphics    buffer;
    
        // Initialize
        public void init()
        {   cat = new card(getCodeBase().toString() + "chr47.gif",32,32);
            obj = new bg(getCodeBase().toString(),"javabg.txt");
            obj2 = new bg(getCodeBase().toString(),"javabg2.txt");
            obj.LoadAT(getCodeBase().toString(),"javabgatt.txt");
            obj2.LoadAT(getCodeBase().toString(),"javabgatt.txt");
            obj.SetRect(win);
            obj2.SetRect(win);
            off.y= obj.scrollMax.y;
            setBackground(Color.gray);
            size = getSize();
            back= createImage(size.width, size.height);
            if (back==null) System.out.print("createImage Error");
            addKeyListener(this);
            Thread t = new Thread(this);
            t.start();
        }
    
        //  Runnable Class
        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 || Flag==3) wat= obj2.GetAtt(i,pos,off);
                        else                    wat= obj.GetAtt(i,pos,off);
                        if (wat>0)  break;
                    }
                }
            }
            if (i>3)    return false;
    
            // 座標の更新
            dir= i;
            switch(i)
            {   case 0:     // UP
                    if (pos.y>obj.center.y) pos.y-= 4;
                    else    if (off.y>=4)   off.y-= 4;
                    else    pos.y-= 4;
                    break;
                case 1:     // RIGHT
                    if (pos.x<obj.center.x) pos.x+= 4;
                    else    if (off.x+4<obj.scrollMax.x)  off.x+= 4;
                    else    pos.x+= 4;
                    break;
                case 2:     // DOWN
                    if (pos.y<obj.center.y) pos.y+= 4;
                    else    if (off.y+4<obj.scrollMax.y)  off.y+= 4;
                    else    pos.y+= 4;
                    break;
                case 3:     // LEFT
                    if (pos.x>obj.center.x) pos.x-= 4;
                    else    if (off.x>=4)   off.x-= 4;
                    else    pos.x-= 4;
                    break;
            }
    
            // Message フラグのリセット
            if (msg)
            {   int wk;
                wk= posw.x-(pos.x+off.x);
                if (wk>128 || wk<-128)  msg= false;
                wk= posw.y-(pos.y+off.y);
                if (wk>128 || wk<-128)  msg= false;
            }
            return true;
        }
    
        // Paint Method
        public void paint(Graphics g)
        {   if (back==null)     return;
            buffer= back.getGraphics();
            if (buffer==null)   return;
            size = getSize();
            buffer.setColor(getBackground());
            buffer.fillRect(0, 0, size.width, size.height);
            if (Flag==2 || Flag==3) obj2.MapView(buffer,off.x,off.y);
            else                    obj.MapView(buffer,off.x,off.y);
            cat.View(buffer,dir*2+num,pos.x,pos.y);
            g.setFont(new Font("Helvetica",Font.PLAIN,32));
            buffer.setColor(Color.red);
            if (msg)
            {   switch(Flag)
                {   case 0:
                        buffer.drawString("アイテムを探して下さい", 20,610);
                        break;
                    case 1:
                        buffer.drawString("アイテムを見つけた!", 20,610);
                        break;
                    case 2:
                        buffer.drawString("秘密の入口だ!", 20,610);
                        break;
                    case 3:
                        buffer.drawString("宝物を手に入れた!", 20,610);
                        break;
                    case 4:
                        buffer.drawString("出口を見つけた!", 20,610);
                        break;
                }
            }
            g.drawImage(back,0,0,this);
        }
    
        // イベントのチェック
        public void eventcheck()
        {   int     wx,wy,wat;
            if (Flag==2 || Flag==3) wat= obj2.GetAtt(pos,off);
            else                    wat= obj.GetAtt(pos,off);
            switch(wat)
            {   case 2:     //宝箱
                    posw.x= pos.x+off.x;
                    posw.y= pos.y+off.y;
                    msg= true;
                    takara(pos, off,Flag);  //宝箱の蓋を開ける
                    if (Flag==0)
                    {   System.out.println("アイテムを見つけた!!");
                        Flag= 1;
                        break;
                    }
                    if (Flag==2)
                    {   System.out.println("宝物を手に入れた!");
                        Flag= 3;
                        break;
                    }
                    break;
                case 3:     //ダンジョンの入口
                    posw.x= pos.x+off.x;
                    posw.y= pos.y+off.y;
                    msg= true;
                    if (Flag==1)
                    {   System.out.println("秘密の入口だ!");
                        Flag= 2;
                        break;
                    }
                    //ダンジョンの出口
                    if (Flag==3)
                    {   System.out.println("出口だ!");
                        Flag= 4;
                        break;
                    }
                    break;
            }
        }
    
        // 宝箱の蓋を開ける
        public void takara(Point pos, Point off, int flag)
        {   int wx,wy;
            if (flag==0)
            {   wx= obj.GetX(pos.x,off.x);
                wy= obj.GetY(pos.y,off.y);
                obj.TT[wy][wx]++;
                obj.TT[wy-1][wx]++;
            }
            if (flag==2)    //ダンジョン
            {   wx= obj2.GetX(pos.x,off.x);
                wy= obj2.GetY(pos.y,off.y);
                obj2.TT[wy][wx]++;
                obj2.TT[wy-1][wx]++;
                obj2.TT[wy+1][wx]= 11;
            }
        }
    
        // KeyEvent Listener
        public void keyPressed(KeyEvent e)
        {   switch(e.getKeyCode( ))
            {   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) { }
    }
    
    //★ 画像を切り分ける class card は Java Applet カードゲームと同じです。
    class card extends JApplet
    {   private Image   Img;            // CARD Image
          ・・・
    }
    
    //★ BG Object Class は「TEXT ファイルを使う」と同じです。
    class bg extends Applet
    {   String  Imgfile;        // image file
          ・・・
    }
    
  2. Java Applet を起動する HTML(rpgchange.htm) ファイルです。
    <html>
      <body>
        <h3>ダンジョンに切り替える</h3>
        <applet code="rpgchange.class" width="800" height="620">
        </applet>
      </body>
    </html>
    
  3. BG(背景画像)を定義した TEXT 形式のファイル(javabg.txt)は、前回の「宝箱の蓋を開ける」と同じです。
    ダンジョンの BG を定義した TEXT 形式のファイル(javabg2.txt)です。
    私が作成した MapEditor を使って作成したファイルです。
    //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, 
    
  4. Mapchip の属性を定義した TEXT 形式のファイル(javabgatt.txt)は、前回の「宝箱の蓋を開ける」と同じです。
  5. プロジェクトのフォルダーに、次のファイルを格納して下さい。
    ファイル名 説明
    rpgchange.javaJava Applet のソースプログラムファイル
    rpgchange.htm Java Applet を起動する HTML ファイル
    javabg.gif MapChip の画像ファイル
    javabg.txt BG(背景画像)を定義した TEXT 形式のファイル
    javabg2.txt ダンジョンの BG を定義した TEXT 形式のファイル
    javabgatt.txt Mapchip の属性を定義した TEXT 形式のファイル
  6. rpgchange.java をコンパイルして Class ファイルを作成して下さい。
    インターネットブラウザを起動して HTML ファイルから実行して下さい。
    矢印キーでキャラクタを操作して、宝物を取り出して戻ってくるゲームです。
    1. 宝箱を開けてアイテムを取得し下さい。
    2. アイテムを持って、秘密の通路を通るとダンジョンに切り替わります。
    3. ダンジョンに隠されている宝物を取り出して下さい。
    4. 帰り道を見つけて戻ってきて下さい。

Main プログラムの説明

  1. このプログラムは 宝箱の蓋を開ける の続きです。
    BG に設定した Mapchip の属性を利用して、キャラクタを操作して宝箱を探し当てます。
    Mapchip の属性は次のとおりです。
    1. 0:通行不可
      キャラクタが通ることが出来ないセルです。
    2. 1:通行可
      キャラクタが通ることが出来るセルです。
    3. 2:宝箱
      探し当てると蓋が開きます。
    4. 3:ワープ
      ダンジョンの入口/出口です。
  2. Flag はゲームの進行フラグです。
    1. Flag:0
      ゲームが開始した状態です。
    2. Flag:1
      アイテムを手に入れた状態です。
    3. Flag:2
      秘密の通路を通ってダンジョンに入った状態です。
    4. Flag:3
      宝物を手に入れた状態です。
    5. Flag:4
      ダンジョンから戻った状態です。
  3. bg は BG を描画する bg object class で、ダンジョンの BG に切り替えるので二枚定義します。
    win は Game Window の矩形領域で、進行メッセージを表示するために、下部を少し開けています。
    msg は進行メッセージの表示フラグで、最初は ON に設定しています。
    posw は msg を OFF にするためのワーク領域で、キャラクタが移動すると OFF にします。
        public class rpgchange extends Applet implements Runnable, KeyListener
        {   // Back Ground
            bg          obj,obj2;                   // BG Class
            Point       off= new Point();           // BG のスクロール値
            byte        Flag= 0;                    // ゲームの進行フラグ
            // Character
            card        cat;                        // card Class(cat の描画)
            int         key_t[] = { 0,0,0,0 };      // UP, RIGHT, DOWN, LEFT
            Point       pos= new Point(320,512);    // cat の座標(4の倍数)
            int         dir= 0, num= 0;             // cat の向きとアニメ
            long        animeTime= 0;               // アニメーションのタイミング
            // Game Window
            Rectangle   win= new Rectangle(0,0,800,576);
            boolean     msg= true;                  // Message 表示
            Point       posw= new Point(320,512);   // cat の座標ワーク
            // Double Buffer
            Dimension   size;
            Image       back= null;
            Graphics    buffer;
        
  4. init() はアプレットの初期化を行うメソッドです。
    new card() で card Object Class をインスタンス化します。
    new bg() で二枚の bg Object Class をインスタンス化します。
    "javabg2.txt" はダンジョンの BG です。
    LoadAT() で Mapchip の属性を定義したファイルを入力します。
    SetRect(win); で BG を描画する矩形領域を設定します。
    off.y= obj.scrollMax.y; で縦方向のスクロール値を最大に設定します。
    ダブルバッファの領域を設定します。
    KeyListener を設定して Thread を起動します。
        // Initialize
        public void init()
        {   cat = new card(getCodeBase().toString() + "chr47.gif",32,32);
            obj = new bg(getCodeBase().toString(),"javabg.txt");
            obj2 = new bg(getCodeBase().toString(),"javabg2.txt");
            obj.LoadAT(getCodeBase().toString(),"javabgatt.txt");
            obj2.LoadAT(getCodeBase().toString(),"javabgatt.txt");
            obj.SetRect(win);
            obj2.SetRect(win);
            off.y= obj.scrollMax.y;
            setBackground(Color.gray);
            size = getSize();
            back= createImage(size.width, size.height);
            if (back==null) System.out.print("createImage Error");
            addKeyListener(this);
            Thread t = new Thread(this);
            t.start();
        }
        
  5. paint() メソッドでは、スクロール値を指定して BG を描画します。
    その上からキャラクタを描画します。
    msg が ON のときにゲームの進行メッセージを表示します。
    描画は BackBuffer にイメージを作成してから一挙に Front Buffer に転送します。
        public void paint(Graphics g)
        {   if (back==null)     return;
            buffer= back.getGraphics();
            if (buffer==null)   return;
            size = getSize();
            buffer.setColor(getBackground());
            buffer.fillRect(0, 0, size.width, size.height);
            if (Flag==2 || Flag==3) obj2.MapView(buffer,off.x,off.y);
            else                    obj.MapView(buffer,off.x,off.y);
            cat.View(buffer,dir*2+num,pos.x,pos.y);
            g.setFont(new Font("Helvetica",Font.PLAIN,32));
            buffer.setColor(Color.red);
            if (msg)
            {   switch(Flag)
                {   case 0:
                        buffer.drawString("アイテムを探して下さい", 20,610);
                        break;
                    case 1:
                        buffer.drawString("アイテムを見つけた!", 20,610);
                        break;
                    case 2:
                        buffer.drawString("秘密の入口だ!", 20,610);
                        break;
                    case 3:
                        buffer.drawString("宝物を手に入れた!", 20,610);
                        break;
                    case 4:
                        buffer.drawString("出口を見つけた!", 20,610);
                        break;
                }
            }
            g.drawImage(back,0,0,this);
        }
        
  6. 矢印キーを検出してキャラクタを操作する action() メソッドです。
    二枚の BG を切り替えるので Flag でどちらが使われているかを調べます。
    eventcheck(); でイベントが設定されているセルをチェックします。
    進行メッセージを常に表示すると解り難いので、キャラクタが移動すると OFF にします。
        // キャラクタの移動
        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 || Flag==3) wat= obj2.GetAtt(i,pos,off);
                        else                    wat= obj.GetAtt(i,pos,off);
                        if (wat>0)  break;
                    }
                }
            }
            if (i>3)    return false;
    
            // 座標の更新
            dir= i;
            switch(i)
            {   case 0:     // UP
                    if (pos.y>obj.center.y) pos.y-= 4;
                    else    if (off.y>=4)   off.y-= 4;
                    else    pos.y-= 4;
                    break;
                case 1:     // RIGHT
                    if (pos.x<obj.center.x) pos.x+= 4;
                    else    if (off.x+4<obj.scrollMax.x)  off.x+= 4;
                    else    pos.x+= 4;
                    break;
                case 2:     // DOWN
                    if (pos.y<obj.center.y) pos.y+= 4;
                    else    if (off.y+4<obj.scrollMax.y)  off.y+= 4;
                    else    pos.y+= 4;
                    break;
                case 3:     // LEFT
                    if (pos.x>obj.center.x) pos.x-= 4;
                    else    if (off.x>=4)   off.x-= 4;
                    else    pos.x-= 4;
                    break;
            }
    
            // Message フラグのリセット
            if (msg)
            {   int wk;
                wk= posw.x-(pos.x+off.x);
                if (wk>64 || wk<-64)    msg= false;
                wk= posw.y-(pos.y+off.y);
                if (wk>64 || wk<-64)    msg= false;
            }
            return true;
        }
        
  7. セルの属性を調べる eventcheck() メソッドです。
    Flag でどちらの BG が使われているかを調べて GetAtt() でセルの属性を取得します。
    属性=2 のときは「宝箱」のセルです。
    宝箱を探し当てると、蓋が空いた画像に切り替えます。
    宝箱の画像と蓋が空いた画像が隣同士で並んでいることを確認して下さい。
    属性=3 のときは「ダンジョンの出入口」のセルです。
    Flag を設定して BG を切り替えます。
        // イベントのチェック
        public void eventcheck()
        {   int     wx,wy,wat;
            if (Flag==2 || Flag==3) wat= obj2.GetAtt(pos,off);
            else                    wat= obj.GetAtt(pos,off);
            switch(wat)
            {   case 2:     //宝箱
                    posw.x= pos.x+off.x;
                    posw.y= pos.y+off.y;
                    msg= true;
                    takara(pos, off,Flag);  //宝箱の蓋を開ける
                    if (Flag==0)
                    {   System.out.println("アイテムを見つけた!!");
                        Flag= 1;
                        break;
                    }
                    if (Flag==2)
                    {   System.out.println("宝物を手に入れた!");
                        Flag= 3;
                        break;
                    }
                    break;
                case 3:     //ダンジョンの入口
                    posw.x= pos.x+off.x;
                    posw.y= pos.y+off.y;
                    msg= true;
                    if (Flag==1)
                    {   System.out.println("秘密の入口だ!");
                        Flag= 2;
                        break;
                    }
                    //ダンジョンの出口
                    if (Flag==3)
                    {   System.out.println("出口だ!");
                        Flag= 4;
                        break;
                    }
                    break;
            }
        }
        

Java Game Program