我目前正在Java课程中为我的最终项目设计Pictionary游戏。它使用基本的Echo Server来回送从发送方到接收方的数据。每个GUI都有自己的DrawCanvas,但只有艺术家才能绘制,其他人都会观看。
画布的所有数据都存储在ArrayLists中,一个用于行,一个用于颜色,一个用于行粗细。发送数据时,将其打包到信封中并发送到服务器。
Envelope类本质上是(String key,Object data),因此您可以使用字符串对信封进行ID识别,并在另一端解包数据。
多个客户端可以毫无问题地观看艺术家绘图。艺术家画布不断地将点(通过sendStartPoint()和sendPoint())发送到其他客户端,这些客户端将重建到另一端的画布中。但是,如果客户端在绘制完东西后加入,则需要使用所有画布数据进行更新,否则它们只会看到加入后添加的内容。为此,使用sendCanvas()和loadCanvas()方法。
我遇到的问题是即使sendCanvas()发送了所有数据,客户端也只接收绘制的第一行数据。
除了下面发布的DrawCanvas类中的内容之外,这是唯一的其他数据处理 - 信封未打包。
我可以发布其他类的更多代码,如果有帮助的话。
仅限信封的其他处理
if (e.getKey().equals("draw")){
ArrayList<Object> data = (ArrayList<Object>)e.getData();
ArrayList<ArrayList<Point>> lines = (ArrayList<ArrayList<Point>>)data.get(0);
ArrayList<Color> colors = (ArrayList<Color>)data.get(1);
ArrayList<Integer> thickness = (ArrayList<Integer>)data.get(2);
clientUI.draw(lines, colors, thickness);
}
DrawCanvas
private ArrayList<ArrayList<Point>> lines = new ArrayList<ArrayList<Point>>();
private ArrayList<Color> colorList = new ArrayList<Color>();
private ArrayList<Integer> thicknessList = new ArrayList<Integer>();
private Color color = Color.BLACK;
private int thickness = 3;
private ChatClient chat;
MouseAdapter ma;
{ // Mouse Listener Block
ma = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
addLine();
lines.get(lines.size() - 1).add(e.getPoint());
//sendCanvas();
sendStartPoint();
repaint();
}// end mousePressed
public void mouseReleased(MouseEvent e) {
lines.get(lines.size() - 1).add(e.getPoint());
//sendCanvas();
sendPoint();
repaint();
}// end mouseReleased
public void mouseDragged(MouseEvent e) {
lines.get(lines.size() - 1).add(e.getPoint());
//sendCanvas();
sendPoint();
repaint();
}// end mouseDragged
};
} // End Mouse Listener Block
// Stores all the data required to build entire canvas
public void loadCanvas(ArrayList<ArrayList<Point>> newLines, ArrayList<Color> newColors, ArrayList<Integer> newThickness){
System.out.println("RECEIVED CANVAS");
this.lines = newLines;
this.colorList = newColors;
this.thicknessList = newThickness;
repaint();
}
// Sends all of the data required to build entire canvas
public void sendCanvas(int id){
System.out.println("SENDING CANVAS");
ArrayList<Object> temp = new ArrayList<Object>();
temp.add(lines);
temp.add(colorList);
temp.add(thicknessList);
temp.add(id);
try {
chat.sendToServer(new Envelope("draw", temp));
} catch (IOException e1) {
System.out.println("Error sending canvas");
}
}
// Adds new blank line to hold points, updates attributes
public void addLine(){
lines.add(new ArrayList<Point>());
colorList.add(color);
thicknessList.add(thickness);
}
答案 0 :(得分:0)
我设法使我的计划有效。它没有为某些数据传输的原因提供答案,但只是将其作为事实接受并以此为基础。
如下所示,我更改了sendCanvas()方法,以便在自己的信封中发送每一行。
public void sendCanvas(int id){
for (int i = 0; i < lines.size(); i++){
System.out.println("SENDING CANVAS " + i);
ArrayList<Object> temp = new ArrayList<Object>();
temp.add(lines.get(i));
temp.add(colorList.get(i));
temp.add(thicknessList.get(i));
temp.add(id);
try {
chat.sendToServer(new Envelope("draw", temp));
} catch (IOException e1) {
System.out.println("Error sending canvas");
}
}
我没有让DrawCanvas使用loadCanvas()重建它,而是更新了现有的addLine()方法:
public void addLine(ArrayList<Point> line, Color c, int t){
lines.add(line);
colorList.add(c);
thicknessList.add(t);
repaint();
}
我知道这可能不是解决这个问题的最佳方法,但我的时间紧迫而且有效。