複数のクライアントが接続しているサーバーがあります。各クライアントには、制御できるボディ (プレーヤー) が 1 つありますが、衝突が発生する可能性があるため、一部の動きが制限されている理由を知るために、他のすべてのボディを確認する必要があります。
私の解決策は、「World」オブジェクトをオブジェクトの入出力ストリームに渡すことです。次に、処理を使用して各ボディを解析して描画します。ここに私が得ているエラーがあります:
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
明らかに、ソケットを介して渡される前に、ワールドをシリアル化/シリアル化可能にする必要があります。どうすればそれを行うことができますか?単にワールドを送信する代わりに、ボディごとに 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);
}
}