在多人游戏中处理播放器闪烁
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 等组成,每个循环而不是单独的字符串重复值。
让我知道发生了什么,如果你不能修复它,我可以尝试帮助你重构你的算法。
我做了一个小型多人游戏来学习多人游戏的各个方面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 等组成,每个循环而不是单独的字符串重复值。
让我知道发生了什么,如果你不能修复它,我可以尝试帮助你重构你的算法。