2012-09-01 51 views
1

所以我正在一个非常简单的多人Java游戏,只有一个你点击屏幕,你的球员直线移动到该点,并显示所有其他连接玩家你的球员的运动,这里有三大类:Java套接字,简单的多人游戏,发送数据

搜索引擎:

import java.applet.Applet; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.ArrayList; 


public class Bots extends Applet implements MouseListener, Runnable{ 

Thread gameLoop; 
ArrayList<Player> players = new ArrayList<Player>(); 

//Socket stuff for multiplayer client 
final static String SERVER_ADDR = "localhost"; 
final static int SERVER_PORT = 1025; 
static Socket socket; 
static volatile BufferedReader br; 
static PrintWriter pw; 


//Double buffer stuff 
Graphics g; 
Image offscreen; 
Dimension dim; 

@Override 
public void run() { 
    //Starts the main game loop 
    Thread t = Thread.currentThread(); 
    //Checks to see if the thread is alive 
    while (t == gameLoop){ 
     try{ 
     Thread.sleep(1000/60); 
     //Repaints the screen 
     players.get(0).move(); 
     repaint(); 

     if (socket != null){ 
      sendMove(); 
     } 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

public void start(){ 
    gameLoop = new Thread(this); 
    gameLoop.start(); 
} 

public void stop(){ 
    gameLoop = null; 
} 

public void init(){ 
    this.setSize(640,480); 
    dim = this.getSize(); 

    addMouseListener(this); 

    //More double buffer stuff 
    offscreen = createImage(this.getSize().width,this.getSize().height); 
    g = offscreen.getGraphics(); 

    //Adds the initial player 
    players.add(new Player(320,240,8,8,"Jeremy")); 
    multiplayer(); 
} 

public void paint(Graphics bufferGraphics){ 
    g = offscreen.getGraphics(); 
    g.clearRect(0,0,dim.width,dim.height); 

    g.setColor(Color.BLACK); 
    for (Player player: players){ 
     g.fillOval(player.x, player.y, player.width, player.height); 
    } 

    bufferGraphics.drawImage(offscreen,0,0,this); 
} 

public void multiplayer(){ 

    try { 
     socket = new Socket(SERVER_ADDR, SERVER_PORT); 
     InputStreamReader isr; 
     isr = new InputStreamReader(socket.getInputStream()); 
     br = new BufferedReader(isr); 
     pw = new PrintWriter(socket.getOutputStream(), true); 
    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    multiplayerThread(); 

} 

public void sendMove(){ 
    //pw.println(players.get(0).name+":X"+players.get(0).x+":Y"+players.get(0).y); 
} 

public void multiplayerThread(){ 
    new Thread(){ 
     public void run() { 
      String line; 
      try { 
       while ((line = br.readLine()) != null) { 
        boolean newClient = true; 
        for (Player player: players){ 
         if (line.startsWith(player.name)){ 
          if (line.startsWith(players.get(0).name)){ 
           //Do nothing 
           newClient = false; 
          } else { 
           String[] tempLine = line.split(":"); 
           player.x = Integer.parseInt(tempLine[1].substring(1)); 
           player.y = Integer.parseInt(tempLine[2].substring(1)); 
           newClient = false; 
          } 
         } 
         System.out.println(line); 
        } 
        if (newClient && !line.contains("Welcome")){ 
         String[] tempLine = line.split(":"); 
         players.add(new Player (Integer.parseInt(tempLine[1].substring(1)),Integer.parseInt(tempLine[2].substring(1)),8,8,tempLine[0].substring(0))); 
        } 

       } 
      } 
      catch (IOException ioe) { 
      } 
     } 
    }.start(); 
} 
@Override 
public void mouseClicked(MouseEvent me) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseEntered(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseExited(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mousePressed(MouseEvent me) { 
    // TODO Auto-generated method stub 
    players.get(0).x2 = me.getX(); 
    players.get(0).y2 = me.getY(); 
    players.get(0).calculateMove(); 
} 

@Override 
public void mouseReleased(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

public void update(Graphics g) 
{ 
    paint(g); 
} 
} 

Player类:

import java.awt.Rectangle; 


public class Player { 

    public String name; 
    public int x; 
    public int y; 
    public int width; 
    public int height; 

    public int x2; 
    public int y2; 
    public int longest; 
    public int numerator; 
    public int shortest; 
    public int dx1,dy1,dx2,dy2; 
    public boolean moving; 

    public Player(int x, int y, int width, int height, String name) { 
     this.x = x; 
     this.y = y; 
     this.x2 = x; 
     this.y2 =y; 
     this.width = width; 
     this.height = height; 
     this.name = name; 
    } 

    public Rectangle getBounds(){ 
     Rectangle r; 
     r = new Rectangle(x - width/2, y-height/2,width,height); 
     return r; 
    } 

    public void move(){ 
     if (this.x2 != this.x && this.y2 != this.y){ 
      this.numerator += this.shortest ; 
      if (!(this.numerator<this.longest)) { 
       this.numerator -= this.longest ; 
       this.x += this.dx1 ; 
       this.y += this.dy1 ; 
      } else { 
       this.x += this.dx2 ; 
       this.y += this.dy2 ; 
      } 
      this.moving = false; 

     } 
    } 

    public void calculateMove(){ 
     int w = x2 - x ; 
      int h = y2 - y ; 
      int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0 ; 
      if (w<0) dx1 = -1 ; else if (w>0) dx1 = 1 ; 
      if (h<0) dy1 = -1 ; else if (h>0) dy1 = 1 ; 
      if (w<0) dx2 = -1 ; else if (w>0) dx2 = 1 ; 
      int longest = Math.abs(w) ; 
      int shortest = Math.abs(h) ; 
      if (!(longest>shortest)) { 
       longest = Math.abs(h) ; 
       shortest = Math.abs(w) ; 
       if (h<0) dy2 = -1 ; else if (h>0) dy2 = 1 ; 
       dx2 = 0 ;    
      } 
      this.shortest = shortest; 
      this.longest = longest; 
      this.numerator = longest >> 1 ; 
      this.dx1 = dx1; 
      this.dy1 = dy1; 
      this.dx2 = dx2; 
      this.dy2 = dy2; 
      this.moving = true; 
      } 

} 

最后我BotsServer类:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.IOException; 
import java.io.PrintWriter; 

import java.net.ServerSocket; 
import java.net.Socket; 

import java.util.ArrayList; 
import java.util.List; 

class BotsServer 
{ 
    private final static int PORT_NO = 1025; 
    private ServerSocket listener; 
    private List<Connection> clients; 
    BotsServer() throws IOException 
    { 
     listener = new ServerSocket(PORT_NO); 
     clients = new ArrayList<Connection>(); 
     System.out.println("listening on port "+PORT_NO); 
    } 
    void runServer() 
    { 
     try 
     { 
     while (true) 
     { 
      Socket socket = listener.accept(); 
      System.out.println("accepted connection"); 
      Connection con = new Connection(socket); 
      synchronized(clients) 
      { 
       clients.add(con); 
       con.start(); 
       con.send("Welcome!"); 
      } 
     } 
     } 
     catch (IOException ioe) 
     { 
     System.err.println("I/O error: "+ioe.getMessage()); 
     return; 
     } 
    } 
    private class Connection extends Thread 
    { 
     private volatile BufferedReader br; 
     private volatile PrintWriter pw; 
     private String clientName; 
     Connection(Socket s) throws IOException 
     { 
     br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     pw = new PrintWriter(s.getOutputStream(), true); 
     } 
     @Override 
     public void run() 
     { 
     System.out.println("test"); 
     String line; 
     try 
     { 
      while ((line = br.readLine()) != null){ 
       System.out.println(line); 
       send(line); 
      } 
     } 
     catch (IOException ioe) 
     { 
      System.err.println("I/O error: "+ioe.getMessage()); 
     } 
     finally 
     { 
      synchronized(clients) 
      { 
       clients.remove(this); 
      } 
     } 

     } 

     private void send(String message) 
     { 
     pw.println(message); 
     } 

    } 
    public static void main(String[] args) 
    { 
     try 
     { 
     System.out.println("ChatServer starting"); 
     new BotsServer().runServer(); 
     } 
     catch (IOException ioe) 
     { 
     System.err.println("unable to create server socket"); 
     } 
    } 
} 

我相信这个问题是在BotsServer类,我把:

System.out.println("test"); 

在运行,但它只是有朝一日能叫当客户第一次连接,是否应该循环?任何帮助都很棒!谢谢!

回答

2

BotServer.ConnectionThreadThreadrun方法仅被调用一次。您的测试打印在run()之内,但不在任何循环内,因此只能按BotServer.Connectionstart()打印一次。所以你看到的行为对我来说很有意义。你为什么认为它应该循环?