在多人游戏中处理播放器闪烁

Processing player flicker on multiplayer

我做了一个小型多人游戏来学习多人游戏的各个方面server/client。当一个玩家连接时,一切都会按预期工作。但是,当第二个客户端连接时,两个播放器将开始闪烁。当玩家移动到彼此之上时,闪烁将停止。我已将原始代码压缩成一个仍然会重现问题的小示例。任何关于为什么会发生这种情况的解释或想法将不胜感激!

这是服务器代码:

import processing.net.*;

Server server;
Client client;
int Clients;
String Coord;

void setup() {
 size(600, 400);
 server = new Server(this, 12345);
}

void getCoord() {
  Coord = "";

  for (int i = 0; i < Clients ; i++) {
        String incoming = client.readStringUntil('\n');
        if (incoming != null) {
           Coord += incoming.trim() + ",";
        }
     }
}

void sendCoord() {
    println(Coord);
      server.write(Coord + "\n");
}
void draw() {
  client = server.available();
  if (client != null) {
    getCoord();
    sendCoord();
  }
}

void serverEvent(Server server, Client client) {
  String incomingMessage = "A new client has connected:" + client.ip();
  println(incomingMessage);
  Clients += 1;
}
void disconnectEvent(Client client) {
  Clients -= 1;
}

这是客户端代码:

import processing.net.*;
Client client;

String Coord[] = new String[100];

void setup() {
 size(600, 400, P3D); 
 client  = new Client(this, "ENTER IP HERE FOR TESTING", 12345);
}

class Ball {
 Float X = width / 2.0;
 Float Y = height / 2.0;

 void processCoord() {
   X = parseFloat(mouseX);
   Y = parseFloat(mouseY);
 }

 void displayBall() {
  fill(0, 0, 0);

  if (Coord.length > 1) {
    if (Coord[0] != null && Coord[1] != null) {
      ellipse(parseFloat(Coord[0]), parseFloat(Coord[1]), 30, 30);
    }
  }

  if (Coord.length > 2) {
    if (Coord[2] != null && Coord[3] != null) {
      ellipse(parseFloat(Coord[2]), parseFloat(Coord[3]), 30, 30);
    }
  }
}
}

class Game {
  void mainGame() {
    background(255, 255, 255);
    imageMode(CENTER);
    ball.processCoord();
    ball.displayBall();
  }
}

Game game = new Game();
Ball ball = new Ball();

void draw() {
  game.mainGame(); 
  String XString = ball.X.toString() + ',';
  String YString = ball.Y.toString() + '\n';
  client.write(XString);
  client.write(YString);

}
void clientEvent(Client client) {
  String inComing = client.readStringUntil('\n');
  if (inComing != null) {
    inComing = inComing.substring(0, inComing.length()-1);
    Coord = inComing.split(",");
    println(Coord);
  }
}

当我 运行 你的代码有两个客户端和一个服务器时,在添加了几个打印后,我意识到在每个循环中服务器都不会写:

x1,y1,x2,y2

这就是我想的(x1,y1,x2,y2 是两个客户端的 x,y 坐标)。

它写了两个循环:

x1,y1,x1,y1

x2,y2,x2,y2

也就是说,两个客户端的坐标是单独发送的,但在每个循环中都在同一个 inComing 字符串中重复。结果,客户端所做的是,它不断地改变每个圆圈的位置。一个循环——它们都在 x1,y1 处。下一个循环,它们都在 x2,y2。这就是为什么当它们在同一点时没有闪烁,因为 x1=x2,y1=y2。

你需要做的是找到一种方法,让服务器在写入任何东西之前肯定会等待,直到 Coord 字符串由 x1、y1、x2、y2、x3、y3 等组成,每个循环而不是单独的字符串重复值。

让我知道发生了什么,如果你不能修复它,我可以尝试帮助你重构你的算法。