アフィリエイト広告を利用しています

広告

posted by fanblog

ネットワーク対戦型ゲームその3-2

続いてクライアントのプログラムです。

まずはクライアントのメインクラスから



import javax.swing.*;
import java.awt.*;

//ウインドウの原型を生成するクラス
//およびクライアントプログラムのメインクラス
public class MainFrame extends JFrame{

  //コンストラクタ
  public MainFrame(){
    //ウインドウのタイトルセット
    setTitle("TCPClientSample");

    //MainPanelのオブジェクト生成
    MainPanel panel = new MainPanel();

    //MainPanelをウインドウへ適応
    Container contentPane = getContentPane();
    contentPane.add(panel);

    //ウインドウの大きさをMainPanelの大きさにリサイズ
    pack();
  }

  public static void main(String[] args) {
    //自身のオブジェクト生成
    MainFrame frame = new MainFrame();

    //閉じるボタンの終了処理の実装
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //必要な記述
    frame.setVisible(true);

    //ウインドウのサイズを変更可能かどうか
    frame.setResizable(false);

  }
}



次にパネルの設定クラスです。



import java.awt.*;
import java.awt.event.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.*;
import java.io.*;

//ウインドウの詳細設定を行うクラス
//MouseListenerインターフェースを実装することで
//マウスによるイベントを取得することができる
public class MainPanel extends JPanel implements MouseMotionListener{
  private final static int WIDTH = 960;
  private final static int HEIGHT = 540;

  //接続可能なクライアント最大数分配列を用意する
  public int[] x = new int[10];
  public int[] y = new int[10];

  //接続しているクライアントの数を格納する
  public int clientNum = 0;

  //色配列
  private Color[] color = new Color[10];

  ClientThread client;

  public MainPanel(){
    //パネルのサイズ設定
    setPreferredSize(new Dimension(WIDTH, HEIGHT));

    //レイアウトは使用しないのでnull
    setLayout(null);

    //マウスイベントを取得できるようにする
    addMouseMotionListener(this);

    //ClientThreadオブジェクトの生成
    client = new ClientThread(this);
    client.start();

    //color配列の初期化
    color[0] = Color.RED;
    color[1] = Color.BLUE;
    color[2] = Color.YELLOW;
    color[3] = Color.GREEN;
    color[4] = Color.PINK;
    color[5] = Color.GRAY;
    color[6] = Color.MAGENTA;
    color[7] = Color.ORANGE;
    color[8] = Color.CYAN;
    color[9] = Color.BLACK;
  }

  //描画メソッド
  public void paintScreen(){

    Graphics2D g2 = (Graphics2D) this.getGraphics();

    //グラフィックオブジェクトに白色を設定する
    g2.setColor(Color.WHITE);

    //背景を白で初期化
    g2.fillRect(0, 0, getWidth(), getHeight());

    for(int i=0; i<clientNum; i++){

      //色をセットする
      g2.setColor(color[i]);

      //塗りつぶした円を描画する
      g2.fillOval(x[i]-10, y[i]-10, 20, 20);
    }

  }

  //マウスでドラッグしたときに呼ばれる
  @Override
  public void mouseDragged(MouseEvent e) {

  }

  //マウスがウインドウ内で移動しているときに呼ばれる
  @Override
  public void mouseMoved(MouseEvent e) {
    //サーバに送る文字列を作成する
    //マウスのX座標,マウスのY座標E として送る
    //具体的には
    //156,189E のようになる こうすれば一回の送信で二つの情報を送ることができる
    //また文字列がつながってしまっても
    //156,189E124,389E123, のようにEが区切りとして働くので見分けが付けやすい
    String sendData = e.getX() + "," + e.getY() + "E";
    client.send(sendData);
  }
}




最後にサーバとの通信処理クラスです



import java.net.*;
import java.io.*;

//サーバと通信するクラス
public class ClientThread extends Thread{

  //サーバのIPアドレスまたは同一LAN内ならばホスト名
  private final static String IP = "localhost";

  //サーバのポート番号
  private final static int PORT = 60000;

  //MainPanelのオブジェクト
  public MainPanel panel;

  //ソケット
  private Socket socket;

  //各ストリーム
  private InputStream in;
  private OutputStream out;

  //コンストラクタ
  public ClientThread(MainPanel panel){
    this.panel = panel;
  }

  //スレッド処理
  public void run(){
    try{
      //サーバへ接続
      connect(IP, PORT);

    }catch (Exception e){
      e.printStackTrace();
    }
  }

  //接続かつ受信
  public void connect(String ip,int port) {
    int size;
    String str;
    byte[] w=new byte[1024];

    try {
      //ソケット接続
      socket = new Socket(ip,port);

      in = socket.getInputStream();
      out = socket.getOutputStream();

      //受信ループ
      while (socket!=null && socket.isConnected()) {

        //データの受信
        size = in.read(w);

        if (size <= 0) continue;

        str = new String(w, 0, size, "UTF-8");

        int clientNumber = Integer.parseInt(str.substring(0, str.indexOf(':')));

        //クライアントと接続できた時に もっとも大きなクライアントナンバー+1が今接続している数なので
        //MainPanelのclientNumへ反映する
        if(panel.clientNum < clientNumber+1){
          panel.clientNum = clientNumber+1;
        }

        //サーバから送られてきた各クライアントの座標をMainPanelのx, y配列にセットする
        panel.x[clientNumber] = Integer.parseInt(str.substring(str.indexOf(':')+1, str.indexOf(',')));
        panel.y[clientNumber] = Integer.parseInt(str.substring(str.indexOf(',')+1, str.indexOf('E')));

        //そして再描画する
        panel.paintScreen();

      }
    } catch (Exception e) {
      e.printStackTrace();
      disconnect();
    }
  }

  //送信
  public void send(String message){
    byte[] b = message.getBytes();

    try {
      if(out != null){
      out.write(b);
      out.flush();
      }

    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  //切断
  public void disconnect() {
    try {
      socket.close();
      socket=null;
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}




ネットワーク処理はイメージがしにくいのでプログラムを作りにくいですが
ネットには先人たちの豊富な知識がありますので
たくさんサンプルを読んでみるといいですね〜^^

この記事へのコメント

   
×

この広告は30日以上新しい記事の更新がないブログに表示されております。