ファンシー向けのゲームを作成していて、調べたり読んだりしてほとんどの問題を解決しましたが、今は行き詰まっています。
ゲームの簡単な説明: 2 つのクライアントがサーバーに接続し、ゲームが開始されます。サーバーはすべての計算を実行し、シリアル化された GameState オブジェクトをクライアントにサイクルごとに送信します。GameState は、プレイヤーの位置といくつかのゲッター/セッターを示す一連の変数にすぎません。これはうまくいきます。しかし、今は gamestate で Missiles の arrayList を作成しました。Missiles は別のオブジェクトで、シリアル化も可能です。クライアントとサーバーの両方に、GameState クラスと Missile クラスの同一のコピーがあります。
クライアントがスペースを押すとミサイルが追加され、これはサーバーによって登録されます。サーバー版のゲームステートでミサイルの数をサーバーに出力させました。クライアント側でミサイルの数を出力すると、常にゼロになります。関連するものだけを入れようとしたコードを次に示します。
オブジェクトをプレーヤーに送信するサーバー、player.objectout は objectoutputstream にオブジェクトを書き込むだけです。
public void updatePlayerOutput(){
GameState send = new GameState(gameState);
leftPlayer.playerObjectOut(send);
rightPlayer.playerObjectOut(send);
}
GameState の主要部分 (getter と setter を省略)。左と右 = プレイヤー 1 とプレイヤー 2
public class GameState implements Serializable {
private double leftX;
private double leftY;
private double rightX;
private double rightY;
private ArrayList<Missile> missiles;
public GameState(){
missiles = new ArrayList<Missile>();
}
public GameState(GameState game){
leftX = game.getLeftX();
leftY = game.getLeftY();
rightX = game.getRightX();
rightY = game.getRightY();
missiles = game.getMissiles();
}
ミサイルクラス
public class Missile implements Serializable {
private double x;
private double y;
private double dX;
public Missile(double inX, double inY, double inDX){
x = inX;
y = inY;
dX = inDX;
}
public Missile(Missile inMissile){
x = inMissile.getX();
y = inMissile.getY();
dX = inMissile.getDX();
}
最後に、クライアントが読み取る場所。panel は JPanel であり、gamestate を使用して画像を描画する場所を取得します
while(true){
gameState = (GameState)(ois.readObject());
panel.setGameState(gameState);
panel.repaint();
updateOutput();
}
また、関連するメモ (おそらく私の主な質問の理由) では、リンクしたコードの最初のセクションで、送信する完全に新しい GameState オブジェクトを作成する必要があります。どうしてこれなの?gameState 変数をそのまま送信しようとすると、情報が保持されません。ありがとう :)