二個のウインドウからキャラクタを操作

二個のウインドウで、情報を共有してキャラクタを動かします。
左のウインドウでは猫を動かし、右のウインドウでは恐竜を動かします。

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

プログラムの作成

  1. 二個のウインドウで Beans の情報を共有してキャラクタを動かします。
    左のウインドウでは猫を動かし、右のウインドウでは恐竜を動かします。
    キャラクタの操作は 矢印キーでキャラクタを操作 を参照して下さい。
    Beans で情報を共有する方法は Beans でデータを共有 を参照して下さい。
  2. キャラクタの座標を管理する posbean.java です。
    //★ Game Position の Beans    前田 稔
    import java.io.Serializable;
    
    public class posbean implements Serializable
    {   private int     xa, ya, dira;
        private int     xb, yb, dirb;
    
        // Set Method
        public void setXa(int v)    {  this.xa= v;  }
        public void setYa(int v)    {  this.ya= v;  }
        public void setDira(int v)  {  this.dira= v;  }
        public void setXb(int v)    {  this.xb= v;  }
        public void setYb(int v)    {  this.yb= v;  }
        public void setDirb(int v)  {  this.dirb= v;  }
    
        // Get Method
        public int getXa()      {  return this.xa;  }
        public int getYa()      {  return this.ya;  }
        public int getDira()    {  return this.dira;  }
        public int getXb()      {  return this.xb;  }
        public int getYb()      {  return this.yb;  }
        public int getDirb()    {  return this.dirb;  }
    }
    
  3. キャラクタ−Aを動かす Char_A.java です。
    //★ 情報を共有してキャラクタ−Aを動かす    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.io.*;
    
    public class Char_A extends JFrame implements KeyListener, ActionListener
    {   Image   imgA, imgB;
        Dimension  size;
        int     key_T[] = { 0,0,0,0 };      //UP, RIGHT, DOWN, LEFT
        int     xA= 200, yA= 200, dirA= 0;
        int     xB= 300, yB= 200, dirB= 0;
        int     num= 0;
        Timer   time;
        posbean bean;
    
        // Main
        public static void main(String args[])
        {   new Char_A();  }
    
        // Constructor
        Char_A()
        {   super("Character Move A");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            setBackground(Color.gray);
            setSize(800,600);
            size = getSize();
    
            imgA = getToolkit().getImage("chr47.gif");
            imgB = getToolkit().getImage("chr53.gif");
            bean= new posbean();
    
            addKeyListener(this);
            time = new Timer(100, this);
            time.start();
            setVisible(true);
        }
    
        // Timer Event
        public void actionPerformed(ActionEvent evt)
        {   Object source = evt.getSource();
            if (source == time)
            {   if (isShowing())    action();  }
        }
    
        // キャラクタの移動
        public void action()
        {
            Load();
            xB= bean.getXb();
            yB= bean.getYb();
            dirB= bean.getDirb();
            if (key_T[0]==1)        // UP
            {   if (yA>30)      yA-= 5;
                dirA= 0;
            }
            else if (key_T[1]==1)   // RIGHT
            {    if (xA<760)    xA+= 5;
                 dirA= 1;
            }
            else if (key_T[2]==1)   // DOWN
            {    if (yA<560)    yA+= 5;
                 dirA= 2;
            }
            else if (key_T[3]==1)   // LEFT
            {    if (xA>5)      xA-= 5;
                 dirA= 3;
            }
            bean.setXa(xA);
            bean.setYa(yA);
            bean.setDira(dirA);
            Save();
    
            num^= 1;
            repaint();
        }
    
        // Paint
        public void paint(Graphics g)
        {   int yoff;
            g.setColor(getBackground());
            g.fillRect(0, 0, size.width, size.height);
            if (imgA!=null)
            {   yoff= (dirA*2+num)*32;
                g.drawImage(imgA,xA,yA,xA+32,yA+32,0,yoff,32,yoff+32,this);
            }
            if (imgB!=null)
            {   yoff= (dirB*2+num)*32;
                g.drawImage(imgB,xB,yB,xB+32,yB+32,0,yoff,32,yoff+32,this);
            }
        }
    
        // KeyEvent Listener
        public void keyPressed(KeyEvent e)
        {   int i;
            for(i=0; i<4; i++)  key_T[i]= 0;
            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) { }
        public void keyTyped(KeyEvent e) { }
    
        // オブジェクトの読み込み
        public void Load()
        {   try
            {   FileInputStream inFile = new FileInputStream("share.txt");
                ObjectInputStream in = new ObjectInputStream(inFile);
                bean = (posbean)in.readObject();
                in.close();
                inFile.close();
            }
            catch(Exception ex)
            {   System.out.println("share.txt が見つかりません");   }
        }
    
        //  オブジェクトをファイルに保存
        public void Save()
        {   try
            {   FileOutputStream outFile = new FileOutputStream("share.txt");
                ObjectOutputStream out = new ObjectOutputStream(outFile);
                out.writeObject(bean);
                out.close();
                outFile.close();
            }
            catch(Exception ex)
            {   ex.printStackTrace();   }
        }
    }
    
  4. キャラクタ−Bを動かす Char_B.java です。
    キャラクタが代わるだけで、ほとんど Char_A.java と同じです。
    //★ 情報を共有してキャラクタ−Bを動かす    前田 稔
            ・・・
    public class Char_B extends JFrame implements KeyListener, ActionListener
            ・・・
        // キャラクタの移動
        public void action()
        {
            Load();
            xA= bean.getXa();
            yA= bean.getYa();
            dirA= bean.getDira();
            if (key_T[0]==1)        // UP
            {   if (yB>30)      yB-= 5;
                dirB= 0;
            }
            else if (key_T[1]==1)   // RIGHT
            {    if (xB<760)    xB+= 5;
                 dirB= 1;
            }
            else if (key_T[2]==1)   // DOWN
            {    if (yB<560)    yB+= 5;
                 dirB= 2;
            }
            else if (key_T[3]==1)   // LEFT
            {    if (xB>5)      xB-= 5;
                 dirB= 3;
            }
            bean.setXb(xB);
            bean.setYb(yB);
            bean.setDirb(dirB);
            Save();
    
            num^= 1;
            repaint();
        }
            ・・・
    
  5. Char_A.java と Char_B.java を同時に起動して、それぞれのウインドウから操作して下さい。
    Char_A.java のウインドウからは猫を、Char_B.java のウインドウからは恐竜を動かすことが出来ます。

プログラムの説明

  1. キャラクタ−Aとキャラクタ−Bの情報を保存する Beans です。
    x, y がキャラクタの座標で、dir が向き(前後左右)です。
    xa, ya, dira がキャラクタ−A用で、xb, yb, dirb がキャラクタ−B用のプロパティです。
    それぞれのプロパティに対して getメソッドと setメソッドを定義しています。
    Beans で情報を共有する方法は Beans でデータを共有 を参照して下さい。
    private int xa, ya, dira;
    private int xb, yb, dirb;
  2. キャラクタ−Aを動かす Char_A.java の説明です。
    key_T[] は、キー操作(前後左右)を記憶する領域です。
    x, y がキャラクタの座標で、dir が向き(前後左右)です。
    キャラクタ−A用とキャラクタ−B用を定義しています。
    num は、二枚の画像を切り替える領域です。
    bean は、二個のウインドウの情報を共有する Beans Class です。
        int     key_T[] = { 0,0,0,0 };      //UP, RIGHT, DOWN, LEFT
        int     xA= 200, yA= 200, dirA= 0;
        int     xB= 300, yB= 200, dirB= 0;
        int     num= 0;
        Timer   time;
        posbean bean;
        
  3. "chr47.gif" と "chr53.gif" の画像をロードします。
    どちらも 32*32 の Sprite が縦に8枚並んだ画像です。
    bean で生成して、タイマ割り込みでキャラクタを動かします。
        imgA = getToolkit().getImage("chr47.gif");
        imgB = getToolkit().getImage("chr53.gif");
        bean= new posbean();
    
        addKeyListener(this);
        time = new Timer(100, this);
        time.start();
        
  4. Beans をロードして、相手方(キャラクタ−B)の座標を取得します。
    次に、キーの操作を検出して、キャラクタの座標を移動します。
    キャラクタはキーを離した後も、その方向に動き続けます。
    停止するときは、前後左右以外のキーを押して下さい。
    キャラクタ−Aの座標情報を設定して、Save() で Beans を更新します。
    num^= 1; で画像を切り替えながら repaint(); で描画します。
        // キャラクタの移動
        public void action()
        {
            Load();
            xB= bean.getXb();
            yB= bean.getYb();
            dirB= bean.getDirb();
            if (key_T[0]==1)        // UP
            {   if (yA>30)      yA-= 5;
                dirA= 0;
            }
                ・・・
            bean.setXa(xA);
            bean.setYa(yA);
            bean.setDira(dirA);
            Save();
    
            num^= 1;
            repaint();
        }
        
  5. Load() メソッドで Beans をロードします。
    Save() メソッドで Beans をセーブします。
  6. Char_B.java は、キャラクタが代わるだけで、ほとんど Char_A.java と同じです。

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