クライアントサーバーベースのsandboxgameをプログラミングしていて、奇妙なバグがあります。 サーバーは、プレイヤーを含むArrayListのすべてのエンティティを保存します。 また、Entity-ArrayListにも含まれているプレーヤだけを含むArrayListを保存します。 すべてのティックとすべてのプレーヤーについて、サーバーはプレイヤーの位置、すべてのエンティティのリスト、クライアントベースのティックを行うコマンドを送信します。私はObject-Outputと-InputStreamを使用しています。 サーバーによって送信されたメッセージは、次のように探しています:Java Object-Stream:オブジェクトは送信中に変更されます
-> STPOS:{[email protected]} y-coord is 75.25017862499999, I already checked
-> SDENT:{[[email protected]]} y-coord is 75.25017862499999
-> CLTICK
クライアント入力は次のように思える:このように座標「魔法」の変更
<- STPOS: {[email protected]} y-coord is 75.25017862499999
<- SDENT: {[[email protected]]} y-coord is 60.00158922
<- CLTICK
。
のArrayListのサーバ出力はこのように動作します:(アウト:ObjectOutputStreamの、エンティティ:ArrayListを、エンティティおよびProtocolClassは自分のクラスである)
out.writeObject(new ProtocolClass(PROTOCOL.sendEntities, entities));
クライアント側入力には、次のとおりです。(中:ObjectInputStreamのプレーヤが地面に落ちている場合)初めに
ProtocolClass pc = (ProtocolClass) in.readObject();
[...]
[if pc.protocol equals PROTOCOL.sendEntities]
entities = (ArrayList<Entity>) pc.object;
Y-COORDは、「60」と増加します。 75.25 ...彼が地面に触れるときに彼が持つ座標です。 60.0015 ...は最初に送信された新しいy座標です。したがって、それは最初のダニのために働く。しかし、それは常にそうではなく、しばしば60にとどまります。
1つのストリームを使用するスレッドは1つしかないので、ストリームは非同期的に呼び出されません。すべての「クエリ」はキューに保存されます。私はプロジェクト全体をスキャンしましたが、実際には「SDENT」-Queryを一度だけ送信します。
なぜこのようなことが起こるのかわかりません。送信されたオブジェクトをArrayListにキャストすると、Eclipseで警告が生成されます。「チェックされていないキャスト」。鋳造物の他の場合にはそうではない。 ArrayListにキャストするだけでは違いはありません。
ありがとうございました。 – Andreas