Okay, so player “B”'s X coord jumps between player “A”'s and it’s own By player “B” I mean the non-client controlled player, and “A” is the player your client controls. So on client #2 player #1 would jump between player#2’s X coord and it’s own. My test case is a little big, but it’s the bare minimum to reproduce the bug. also it requires Slick2d.
How can I fix this bug?
Client:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
public class TestClient extends BasicGame{
ClientThread ct;
int playerNum = 0;
int[] playerX;
int[] enemy;
public TestClient()
{
super("Test Client");
}
public static void main(String[] args)
throws SlickException
{
AppGameContainer app =
new AppGameContainer(new TestClient());
app.setDisplayMode(640, 480, false);
app.setTargetFrameRate(60);
app.start();
}
@Override
public void render(GameContainer gc, Graphics g) throws SlickException {
g.fillRect(playerX[0], 0, 50, 50);
g.fillRect(playerX[1], 0, 50, 50);
g.drawString("px:" + playerX[playerNum], 10, 10);
g.drawString("ex:" + playerX[enemy[playerNum]], 10, 25);
g.drawString("p#:" + playerNum, 10, 40);
}
@Override
public void init(GameContainer gc) throws SlickException {
playerX = new int[2];
playerX[0] = 50;
playerX[1] = 200;
enemy = new int[2];
enemy[0] = 1;
enemy[1] = 0;
ct = new ClientThread(playerX);
ct.start();
ct.setPriority(Thread.MAX_PRIORITY);
playerNum = ct.playerNum;
}
@Override
public void update(GameContainer gc, int delta) throws SlickException {
Input input = gc.getInput();
if(input.isKeyDown(Input.KEY_A))
{
playerX[playerNum]-=2;
}
if(input.isKeyDown(Input.KEY_D))
{
playerX[playerNum]+=2;
}
}
}
class ClientThread extends Thread implements Runnable{
DatagramSocket socket;
DatagramPacket packet;
int playerNum;
int playerX[];
int[] enemy;
boolean loop = true;
int port;
byte [] addr;
InetAddress address;
public ClientThread(int playerX[]){
super("ClientThread");
this.playerX = playerX;
enemy = new int[2];
enemy[0] = 1;
enemy[1] = 0;
try{
port = 4444;
addr = new byte[] {(byte) 76,(byte) 121,(byte) 76,(byte) 188};
address = InetAddress.getByAddress(addr);
byte[] buf = new byte[10];
socket = new DatagramSocket();
DatagramPacket packet = new DatagramPacket(buf, 10, address, 4444);
System.out.println("send" + address.toString());
socket.send(packet);
byte[] buf2 = new byte[255];
packet = new DatagramPacket(buf2, buf2.length);
socket.receive(packet);
ByteBuffer receiveBuf = ByteBuffer.wrap(packet.getData());
this.playerNum = receiveBuf.getInt();
System.out.println("#:"+this.playerNum);
}
catch(Exception e){
e.printStackTrace();
}
}
public void run(){
try{
while(loop){
try{
ByteBuffer sendBuf = ByteBuffer.allocate(255);
sendBuf.putInt(playerX[playerNum]);
DatagramPacket packet = new DatagramPacket(sendBuf.array(), sendBuf.array().length, address, port);
System.out.println("send" + address.toString());
socket.send(packet);
System.out.println("sent");
byte[] buf = new byte[255];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
ByteBuffer receiveBuf = ByteBuffer.wrap(packet.getData());
playerX[enemy[playerNum]] = receiveBuf.getInt();
System.out.println("playerX[enemy[playerNum]] "+playerX[enemy[playerNum]] );
this.sleep(1);
}
catch(Exception e){
e.printStackTrace();
//socket.close();
}
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
Server:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class TestServer {
static DatagramSocket socket;
static int[] playerX;
public void doStuff(){
int MAX_PLAYERS = 2;
int playerNum = 0;
playerX = new int[2];
byte [] addr = new byte[] {(byte) 0,(byte) 0,(byte) 0,(byte) 0};
InetAddress player1IP = null;
try {
player1IP = InetAddress.getByAddress(addr);
} catch (UnknownHostException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
int player1Port = -1;
boolean listening = true;
try {
socket = new DatagramSocket(4444);
} catch (SocketException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while(playerNum < 2){
byte[] buf = new byte[255];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
System.out.println("Waiting for packet from player: " + playerNum + "\n");
try {
socket.receive(packet);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(packet.getAddress().toString().compareTo(player1IP.toString()) != 0 || packet.getPort() != player1Port){
if(playerNum == 0){
player1IP = packet.getAddress();
player1Port = packet.getPort();
}
System.out.println("Waiting to connect with player: " + playerNum + "\n");
new ClientThread(this, socket, packet,playerNum, playerX).start();
//stops here.
System.out.println("Connected with player: " + playerNum + " Now incrementing" + "\n");
playerNum++;
System.out.println("Incremented to: " + playerNum+ "\n");
}
}
while(true){}
}
public static void main(String[] args){
TestServer t = new TestServer();
t.doStuff();
//serverSocket.close();
// System.exit(0);
}
}
Client thread (Server)
import java.io.IOException;
import java.net.*;
import java.nio.ByteBuffer;
public class ClientThread extends Thread implements Runnable{
int playerNum;
int enemy[];
DatagramSocket socket;
InetAddress address;
TestServer ts;
int port;
public ClientThread(TestServer ts, DatagramSocket socket, DatagramPacket packet, int playerNum, int playerX[]){
super("ClientThread");
address = packet.getAddress();
port = packet.getPort();
this.socket = socket;
this.playerNum = playerNum;
this.ts = ts;
enemy = new int[2];
enemy[0] = 1;
enemy[1] = 0;
ByteBuffer sendBuf = ByteBuffer.allocate(255);
System.out.println("#:"+playerNum);
sendBuf.putInt(playerNum);
DatagramPacket packet2 = new DatagramPacket(sendBuf.array(), sendBuf.array().length, address, port);
try {
socket.send(packet2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run(){
try{
System.out.println("Thread" + playerNum + ": " + "Accepted. Now creating I/O.\n");
while(true){
byte[] buf = new byte[255];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
ByteBuffer recieveBuf = ByteBuffer.wrap(packet.getData());
//System.out.println("Threadxx#"+playerNum+": x:" + recieveBuf.getInt());
ts.playerX[playerNum] = recieveBuf.getInt();
//System.out.println("Thread#"+playerNum+": x:" + recieveBuf.getInt());
ByteBuffer sendBuf = ByteBuffer.allocate(255);
sendBuf.putInt(ts.playerX[enemy[playerNum]]);
System.out.println("Thread#"+playerNum+": ex:" + ts.playerX[enemy[playerNum]]);
DatagramPacket packet2 = new DatagramPacket(sendBuf.array(), sendBuf.array().length, address, port);
socket.send(packet2);
this.sleep(1);
}
}
catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
}