现在学到TankWar的网络版部分了,觉得马老师在处理MissileNewMsg消息的时候弄得太麻烦了,还得处理处理爆炸和MissileDeadMsg消息。我觉得可以不用这个消息,直接给各个客户端发送坦克的Fire也就是开火消息FireMsg,要发送的信息只有两个内容:1,消息类(FireMsg );2,myTank的tankID 。当接收端收到这个消息的时候, 解析出tankID,即:
int tankID;
tankID = dis.readInt();
for(int i = 0; i < gw.tanks.size(); i++) {
if(tankID == gw.tanks.get(i).ID) {
gw.tanks.get(i).fire(); //gw是GameWindow的实例,就是马老师的tc
return;
}
}
当然,FireMsg要坦克调用fire()方法之后发送:
case KeyEvent.VK_SPACE:
fire();
FirewMsg fireMsg = new FirewMsg(this.ID);
gw.tankClient.send(fireMsg); //gw是GameWindow的实例,就是马老师的tc
break;
这样处理的好处是所有的Missile都是本地产生的,不用再处理MissileDeadMsg和爆炸的问题。
关于这个问题,我发邮件问过马老师,他说也可以这样做:)不过MissleDeadMsg是必须的,不然的话可能会不同步。我试了,这样处理后非常流畅,没有感觉延时,可能是客户端太少(只有3个),所以感觉不出来。