1

Slick2D でゲームを作成し、マルチプレイヤーに Kryonet を使用しています。私のアーキテクチャは、すべてのクライアントがゲーム自体をプレイしていないサーバーに接続するように設定されています (同じプログラムでクライアントとサーバーを実行しているプレイヤーとは対照的です)。これは 2D シューティング ゲームであり、クライアントが 1 つだけの場合はすべて正常に動作します。別のクライアントに接続すると、この問題が発生します。

どうやら、クライアントは同時に送受信することはできません。たとえば、両方のクライアントが同時に武器を撃っている場合、そのプレイヤーだけが自分のクライアントを撃っているように見え、他のプレイヤーはアイドル状態です。同様に、両方のプレーヤーが動いている場合、もう一方のプレーヤーはクライアント プレーヤーが停止するまで移動せず、その後、もう一方のプレーヤーは現在の位置にジャンプします。

クライアント リスナーとサーバー リスナーのコードは次のとおりです。

public class ClientGameListener extends Listener {

protected Client owner;
protected MultiplayerClientGameState state;

public ClientGameListener(Client c, MultiplayerClientGameState state) {
    owner = c;
    this.state = state;
}

@Override
public void received(Connection connection, Object obj) {
    if(obj instanceof PositionPacket) {
        state.adjustPlayerPosition((PositionPacket)obj);
    }
    else if(obj instanceof FirePacket) {
        state.scheduleFireListing((FirePacket)obj);
    }
    else if(obj instanceof ToggleWeaponPacket) {
        state.togglePlayerWeapon((ToggleWeaponPacket)obj);
    }
}
}

public class ServerGameListener extends Listener {

protected Server owner;
protected MultiplayerServerGameState state;

public ServerGameListener(Server s, MultiplayerServerGameState state) {
    owner = s;
    this.state = state;
}

@Override
public void received(Connection connection, Object obj) {
    if(obj instanceof PositionPacket) {
        owner.sendToAllExceptTCP(connection.getID(), obj);
    }
    else if(obj instanceof FirePacket) {
        owner.sendToAllExceptTCP(connection.getID(), obj);
    }
    else if(obj instanceof ToggleWeaponPacket) {
        owner.sendToAllExceptTCP(connection.getID(), obj);
    }
}
}

クライアントが同時に情報を送受信できない理由、またはこの問題を克服する方法についてのアイデアはありますか?

4

1 に答える 1