1

複数のクライアントが接続しているサーバーがあります。各クライアントには、制御できるボディ (プレーヤー) が 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);
    }
}
4

2 に答える 2

0

JBbSerializer クラスを見ることができます。それはjavadocから:「物理学の世界のあらゆる側面をシリアライズするために使用されるjbox2dのシリアライザ」なので、探していることができるかもしれません。jbox2d-serialization プロジェクト (ダウンロードに含まれているはずです) で探してください。しかし、それは価値があるよりも面倒かもしれません。

于 2013-10-08T04:10:19.717 に答える