updates pushing while Blobs moving
git-svn-id: svn://anubis/gvsu@98 45c1a28c-8058-47b2-ae61-ca45b979098e
This commit is contained in:
parent
7795f9bc1c
commit
45611181de
@ -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) {}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
@ -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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user