2012年10月29日
ネットワーク対戦型ゲームその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();
}
}
}
ネットワーク処理はイメージがしにくいのでプログラムを作りにくいですが
ネットには先人たちの豊富な知識がありますので
たくさんサンプルを読んでみるといいですね〜^^
【ゲームプログラミングの最新記事】
投稿者:Sert|22:23|ゲームプログラミング
この記事へのコメント