updates pushing while Blobs moving

git-svn-id: svn://anubis/gvsu@98 45c1a28c-8058-47b2-ae61-ca45b979098e
This commit is contained in:
josh 2008-04-13 20:21:06 +00:00
parent 7795f9bc1c
commit 45611181de
6 changed files with 156 additions and 31 deletions

View File

@ -78,16 +78,18 @@ public class BlobWars extends JFrame
m_writer = new BufferedWriter( m_writer = new BufferedWriter(
new OutputStreamWriter(m_socket.getOutputStream())); new OutputStreamWriter(m_socket.getOutputStream()));
m_writer.write("NAME:" + m_nameField.getText() + "\n"); m_writer.write("NAME:" + m_nameField.getText() + "\n");
m_writer.flush();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, JOptionPane.showMessageDialog(null,
"Error connecting: " + e.getMessage()); "Error connecting: " + e.getMessage());
return; return;
} }
(new Thread(new ClientHandler())).start();
m_connectButton.setEnabled(false); m_connectButton.setEnabled(false);
m_nameField.setEnabled(false); m_nameField.setEnabled(false);
m_serverField.setEnabled(false); m_serverField.setEnabled(false);
m_panel.requestFocusInWindow(); m_panel.requestFocusInWindow();
(new Thread(new ClientHandler())).start();
m_timer = new javax.swing.Timer(50, m_handler); m_timer = new javax.swing.Timer(50, m_handler);
} }
@ -100,6 +102,7 @@ public class BlobWars extends JFrame
br = new BufferedReader( br = new BufferedReader(
new InputStreamReader(m_socket.getInputStream())); new InputStreamReader(m_socket.getInputStream()));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
return; return;
} }
@ -111,9 +114,15 @@ public class BlobWars extends JFrame
line = br.readLine(); line = br.readLine();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
break;
} }
if (line == null)
break;
System.out.println("GOT LINE: " + line); System.out.println("GOT LINE: " + line);
} }
/* TODO: disconnected logic */
System.out.println("client disconnected");
// SwingUtilities .... doDisconnect();
} }
} }
@ -136,15 +145,19 @@ public class BlobWars extends JFrame
{ {
case KeyEvent.VK_UP: case KeyEvent.VK_UP:
m_writer.write("UP\n"); m_writer.write("UP\n");
m_writer.flush();
break; break;
case KeyEvent.VK_DOWN: case KeyEvent.VK_DOWN:
m_writer.write("DOWN\n"); m_writer.write("DOWN\n");
m_writer.flush();
break; break;
case KeyEvent.VK_LEFT: case KeyEvent.VK_LEFT:
m_writer.write("LEFT\n"); m_writer.write("LEFT\n");
m_writer.flush();
break; break;
case KeyEvent.VK_RIGHT: case KeyEvent.VK_RIGHT:
m_writer.write("RIGHT\n"); m_writer.write("RIGHT\n");
m_writer.flush();
break; break;
} }
} catch (Exception ex) {} } catch (Exception ex) {}

View File

@ -73,10 +73,13 @@ public class BlobWarsServer
tokens.add(st.nextToken()); tokens.add(st.nextToken());
} }
String[] arr = tokens.toArray(new String[1]); String[] arr = tokens.toArray(new String[1]);
if (arr.length < 2) if (arr.length < 1)
return; return;
if (arr[0].equals("NAME")) if (arr[0].equals("NAME"))
{ {
if (arr.length < 2)
return;
System.out.println("Player '" + arr[1] + "' signed on.");
m_world.addPlayer(arr[1]); m_world.addPlayer(arr[1]);
m_socketToPlayerName.put(cu.socket, arr[1]); m_socketToPlayerName.put(cu.socket, arr[1]);
return; return;
@ -121,18 +124,17 @@ public class BlobWarsServer
m_clientUpdates.clear(); m_clientUpdates.clear();
} }
/* step the BlobWars world */
m_world.step(); m_world.step();
/* push updates to clients */ /* calculated updated players */
HashMap<String, Player> pushPlayers = HashMap<String, Player> pushPlayers =
new HashMap<String, Player>(); new HashMap<String, Player>();
HashMap<Integer, Shot> pushShots = HashMap<String, Player> players = m_world.getPlayers();
new HashMap<Integer, Shot>();
if (m_lastPlayers == null) if (m_lastPlayers == null)
pushPlayers.putAll(m_world.getPlayers()); pushPlayers.putAll(m_world.getPlayers());
else else
{ {
HashMap<String, Player> players = m_world.getPlayers();
for (String name : players.keySet()) for (String name : players.keySet())
{ {
if (!m_lastPlayers.containsKey(name)) if (!m_lastPlayers.containsKey(name))
@ -142,11 +144,16 @@ public class BlobWarsServer
pushPlayers.put(name, players.get(name)); pushPlayers.put(name, players.get(name));
} }
} }
m_lastPlayers = PlayerClone(players);
/* calculate updated shots */
HashMap<Integer, Shot> pushShots =
new HashMap<Integer, Shot>();
HashMap<Integer, Shot> shots = m_world.getShots();
if (m_lastShots == null) if (m_lastShots == null)
pushShots.putAll(m_world.getShots()); pushShots.putAll(m_world.getShots());
else else
{ {
HashMap<Integer, Shot> shots = m_world.getShots();
for (Integer shotid : shots.keySet()) for (Integer shotid : shots.keySet())
{ {
if (!m_lastShots.containsKey(shotid)) if (!m_lastShots.containsKey(shotid))
@ -156,6 +163,7 @@ public class BlobWarsServer
pushShots.put(shotid, shots.get(shotid)); pushShots.put(shotid, shots.get(shotid));
} }
} }
m_lastShots = ShotClone(shots);
/* write updated info to each client */ /* write updated info to each client */
String sendLine = ""; String sendLine = "";
@ -172,10 +180,11 @@ public class BlobWarsServer
for (Socket client : m_socketToPlayerName.keySet()) for (Socket client : m_socketToPlayerName.keySet())
{ {
try { try {
BufferedWriter br = new BufferedWriter( BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter( new OutputStreamWriter(
client.getOutputStream())); client.getOutputStream()));
br.write(sendLine, 0, sendLine.length()); bw.write(sendLine, 0, sendLine.length());
bw.flush();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -212,26 +221,15 @@ public class BlobWarsServer
String line; String line;
try { try {
line = br.readLine(); line = br.readLine();
} catch (IOException ioe) { } catch (Exception e) {
// TODO: remove this line to not print stack trace for // e.printStackTrace();
// a client that disconnects, and remove socket from
// HashMap after for() loop
ioe.printStackTrace();
break; break;
} }
if (line == null)
break;
System.out.println("SERVER GOT LINE: " + line); System.out.println("SERVER GOT LINE: " + line);
if (line.equals("QUIT")) if (line.equals("QUIT"))
{
synchronized (m_socketToPlayerName)
{
if (m_socketToPlayerName.containsKey(m_socket))
m_socketToPlayerName.remove(m_socket);
try {
m_socket.close();
} catch (Exception e) {}
}
break; break;
}
ClientUpdate cu = new ClientUpdate(); ClientUpdate cu = new ClientUpdate();
cu.socket = m_socket; cu.socket = m_socket;
cu.message = line; cu.message = line;
@ -240,6 +238,44 @@ public class BlobWarsServer
m_clientUpdates.add(cu); m_clientUpdates.add(cu);
} }
} }
/* end of client handling loop, remove client from world */
synchronized (m_socketToPlayerName)
{
if (m_socketToPlayerName.containsKey(m_socket))
{
System.out.println("Player '" +
m_socketToPlayerName.get(m_socket) +
"' signed off.");
m_world.removePlayer(m_socketToPlayerName.get(m_socket));
m_socketToPlayerName.remove(m_socket);
}
try {
m_socket.close();
} catch (Exception e) {}
} }
} }
} }
public HashMap<String, Player> PlayerClone(HashMap<String, Player> orig)
{
HashMap<String, Player> newhm = new HashMap<String, Player>();
for (String name : orig.keySet())
{
Player p = orig.get(name).clone();
newhm.put(name, p);
}
return newhm;
}
public HashMap<Integer, Shot> ShotClone(HashMap<Integer, Shot> orig)
{
HashMap<Integer, Shot> newhm = new HashMap<Integer, Shot>();
for (Integer id : orig.keySet())
{
Shot s = orig.get(id).clone();
newhm.put(id, s);
}
return newhm;
}
}

View File

@ -45,6 +45,11 @@ public class BlobWarsWorld
return true; return true;
} }
public void removePlayer(String name)
{
m_players.remove(name);
}
public void shoot(String playerName) public void shoot(String playerName)
{ {
if (!m_players.containsKey(playerName)) if (!m_players.containsKey(playerName))
@ -89,7 +94,9 @@ public class BlobWarsWorld
if (!m_players.containsKey(playerName)) if (!m_players.containsKey(playerName))
return; return;
Player p = m_players.get(playerName); Player p = m_players.get(playerName);
p.dr = PLAYER_SPIN_SPEED; p.dr += PLAYER_SPIN_SPEED;
if (Math.abs(p.dr) < 0.001)
p.dr = 0;
} }
public void moveRight(String playerName) public void moveRight(String playerName)
@ -97,7 +104,9 @@ public class BlobWarsWorld
if (!m_players.containsKey(playerName)) if (!m_players.containsKey(playerName))
return; return;
Player p = m_players.get(playerName); Player p = m_players.get(playerName);
p.dr = -PLAYER_SPIN_SPEED; p.dr -= PLAYER_SPIN_SPEED;
if (Math.abs(p.dr) < 0.001)
p.dr = 0;
} }
public Vector<GameItem> collidesWith(GameItem gi) public Vector<GameItem> collidesWith(GameItem gi)

View File

@ -1,10 +1,12 @@
MAINCLASS := BlobWars MAINCLASS := BlobWars
all: $(patsubst %.java,%.class,$(wildcard *.java)) all:
javac *.java
%.class: %.java .PHONY: runserver
javac $^ runserver:
java $(MAINCLASS)Server
.PHONY: run .PHONY: run
run: run:

View File

@ -1,5 +1,7 @@
public class Player extends GameItem import java.util.*;
public class Player extends GameItem implements Cloneable
{ {
public static final double DEFAULT_RADIUS = 0.06; public static final double DEFAULT_RADIUS = 0.06;
public static final double COLLIDE_DAMAGE = 0.002; public static final double COLLIDE_DAMAGE = 0.002;
@ -22,6 +24,18 @@ public class Player extends GameItem
this.dy = 0; this.dy = 0;
} }
public Player clone()
{
Player p = new Player(name);
p.radius = radius;
p.health = health;
p.r = r;
p.dr = dr;
p.dx = dx;
p.dy = dy;
return p;
}
public boolean equals(Player other) public boolean equals(Player other)
{ {
return this.name.equals(other.name) && return this.name.equals(other.name) &&
@ -38,4 +52,26 @@ public class Player extends GameItem
return String.format("%s:%.3f:%.3f:%.3f:%.3f:%.3f:%.3f:%.3f:%.3f", return String.format("%s:%.3f:%.3f:%.3f:%.3f:%.3f:%.3f:%.3f:%.3f",
name, radius, health, x, y, r, dr, dx, dy); name, radius, health, x, y, r, dr, dx, dy);
} }
public void fromString(String s)
{
StringTokenizer st = new StringTokenizer(s, ":");
Vector<String> tokens = new Vector<String>();
while (st.hasMoreTokens())
{
tokens.add(st.nextToken());
}
String[] arr = tokens.toArray(new String[1]);
if (arr.length != 9)
return;
name = arr[0];
radius = Double.parseDouble(arr[1]);
health = Double.parseDouble(arr[2]);
x = Double.parseDouble(arr[3]);
y = Double.parseDouble(arr[4]);
r = Double.parseDouble(arr[5]);
dr = Double.parseDouble(arr[6]);
dx = Double.parseDouble(arr[7]);
dy = Double.parseDouble(arr[8]);
}
} }

View File

@ -1,5 +1,7 @@
public class Shot extends GameItem import java.util.*;
public class Shot extends GameItem implements Cloneable
{ {
public static final double DEFAULT_RADIUS = 0.03; public static final double DEFAULT_RADIUS = 0.03;
public static final double SHOT_DURATION = 3.0; public static final double SHOT_DURATION = 3.0;
@ -19,6 +21,14 @@ public class Shot extends GameItem
this.dy = 0; this.dy = 0;
} }
public Shot clone()
{
Shot s = new Shot(id, createTime, x, y);
s.dx = dx;
s.dy = dy;
return s;
}
public boolean equals(Shot other) public boolean equals(Shot other)
{ {
return this.createTime == other.createTime && return this.createTime == other.createTime &&
@ -34,4 +44,23 @@ public class Shot extends GameItem
return String.format("%d:%.3f:%.3f:%.3f:%.3f:%.3f", return String.format("%d:%.3f:%.3f:%.3f:%.3f:%.3f",
id, radius, x, y, dx, dy); id, radius, x, y, dx, dy);
} }
public void fromString(String s)
{
StringTokenizer st = new StringTokenizer(s, ":");
Vector<String> tokens = new Vector<String>();
while (st.hasMoreTokens())
{
tokens.add(st.nextToken());
}
String[] arr = tokens.toArray(new String[1]);
if (arr.length != 6)
return;
id = Integer.parseInt(arr[0]);
radius = Double.parseDouble(arr[1]);
x = Double.parseDouble(arr[2]);
y = Double.parseDouble(arr[3]);
dx = Double.parseDouble(arr[4]);
dy = Double.parseDouble(arr[5]);
}
} }