【发布时间】:2013-08-22 10:13:01
【问题描述】:
大家好,我正在制作一款有趣的游戏,我已经通过研究和阅读解决了大部分问题,但现在我陷入了困境。
游戏快速解释: 两个客户端连接到服务器并开始游戏。服务器执行所有计算并在每个周期向客户端发送一个序列化的 GameState 对象。 GameState 只是一堆显示玩家位置的变量和一些 getter/setter。这工作正常。但是,现在我在游戏状态中创建了一个导弹数组列表,导弹是一个单独的对象并且也是可序列化的。客户端和服务器都有相同的 GameState 类和 Missile 类副本。
当客户端按下空格键时会添加导弹,这会被服务器注册。我让服务器在游戏状态的服务器版本中打印导弹的数量。在客户端打印导弹的数量始终为零。这是我尝试仅将相关内容放入其中的一些代码。
服务器将对象发送给播放器,player.objectout只是将对象写入objectoutputstream
public void updatePlayerOutput(){
GameState send = new GameState(gameState);
leftPlayer.playerObjectOut(send);
rightPlayer.playerObjectOut(send);
}
GameState 的主要部分(省略了 getter 和 setter)。左右=player1和player2
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 并使用游戏状态来获取绘制图像的位置
while(true){
gameState = (GameState)(ois.readObject());
panel.setGameState(gameState);
panel.repaint();
updateOutput();
}
另外在相关说明中(可能是我的主要问题的原因),在我链接的代码的第一部分中,我必须创建一个全新的 GameState 对象来发送。为什么是这样?如果我尝试仅发送 gameState 变量,则不会保留任何信息。谢谢:)
【问题讨论】:
标签: java serialization