У меня есть сервер, к которому подключаются несколько клиентов. У каждого клиента есть одно тело (игрок), которым он может управлять, но может быть столкновение, поэтому им нужно будет видеть тела всех остальных, чтобы знать, почему некоторые из их движений ограничены.
Мое решение состоит в том, чтобы передать объект «Мир» через поток ввода/вывода объекта. Затем я разбираю и рисую каждое тело с помощью обработки. Вот ошибка, которую я получаю:
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.jbox2d.dynamics.World
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at Client.setup(Client.java:30)
at processing.core.PApplet.handleDraw(PApplet.java:2280)
at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
at processing.core.PApplet.run(PApplet.java:2176)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.NotSerializableException: org.jbox2d.dynamics.World
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at Player.sendWorld(Player.java:57)
at Server.draw(Server.java:54)
at processing.core.PApplet.handleDraw(PApplet.java:2305)
... 3 more
Очевидно, что World должен быть сериализован/сериализуем, прежде чем его можно будет передать через сокет. Есть идеи, как я это сделаю? Мне нужно будет сделать для каждого тела, создать xml/json, а затем передать это вместо того, чтобы просто отправить мир?
Сервер отключен
public void sendWorld(World world) {
try {
out.writeObject(world);
out.flush(); // or maybe out.reset()
} catch (IOException e) {
e.printStackTrace();
}
}
Клиент вошел
try {
bodySocket = new Socket(serverHostname, port);
in = new ObjectInputStream(bodySocket.getInputStream());
Object next = in.readObject();
System.out.println("Getting world");
if (next instanceof World) {
this.world = (World) next;
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host: " + serverHostname);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for " + "the connection to: "
+ serverHostname);
e.printStackTrace();
System.exit(1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Отрисовка клиента
public void draw() {
// Background
background(100);
// Bodies (includes floors, walls, and players)
for (Body body = world.getBodyList(); body != null; body = body
.getNext()) {
Vec2 playerLoc = body.getPosition();
rectMode(PApplet.RADIUS);
fill(255, 100);
rect(playerLoc.x, fieldBottom - playerLoc.y, 10, 10);
}
}