Окна клиента и сервера пустые - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь проверить связь игрока между клиентом и сервером. Я делаю это, создавая игровую среду, в которой также отображается позиция другого игрока. Они подключаются правильно, но оба окна белые. Если я прекращаю только одну программу, тогда другая отображает игровую площадку. Также в слушателе действия, который слушает таймер, только отправляет данные и не продолжается. Могу ли я получить помощь для правильного отображения окон и исправления слушателя действий? Вот код клиента:

открытый класс SamplePlayerClient1 {приватное статическое окно JFrame = новый JFrame («Клиент Sample Player 1»);

private static class Ground extends JPanel {
    private static final long serialVersionUID = 1L;
    private int px = 50, py = 235, ex, ey, key;
    private DataWriter writer;
    private DataReader reader;

    private ActionListener timerListener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                writer.send(px, py);
                System.out.println("data sent");
                ex = reader.read().x;
                ey = reader.read().y;
                System.out.println("Data read");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            repaint();
        }
    };

    private Timer animator = new Timer(30, timerListener);

    private KeyAdapter keyListener = new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
            key = e.getKeyCode();

            if(key == KeyEvent.VK_UP) {
                py -= 8;

                if(py < 0) {
                    py = 0;
                }
            } else if(key == KeyEvent.VK_DOWN) {
                py += 8;

                if(py > 430) {
                    py = 430;
                }
            } else if(key == KeyEvent.VK_LEFT) {
                px -= 8;

                if(px < 0) {
                    px = 0;
                }
            } else if(key == KeyEvent.VK_RIGHT) {
                px += 8;

                if(px > 455) {
                    px = 455;
                }
            }
        }
    };

    Ground() throws UnknownHostException, IOException {
        Socket soc = new Socket(InetAddress.getByName("192.168.0.3"), 9998);
        System.out.println("client 2 connected");
        writer = new DataWriter(soc);
        reader = new DataReader(soc);
        animator.start();
        addKeyListener(keyListener);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        requestFocus();
        g.setColor(Color.BLACK);
        g.fillRect(px, py, 30, 30);

        g.setColor(Color.RED);
        g.fillRect(ex, ey, 30, 30);
    }
}

private static class DataWriter {
    private OutputStreamWriter writer;
    private String point = "";

    DataWriter(Socket soc) throws IOException {
        writer = new OutputStreamWriter(soc.getOutputStream());
    }

    void send(int x, int y) throws IOException {
        point = "" + x;
        point += ",";
        point += y;
        point += "\n";
        writer.write(point);
        writer.flush();
    }
}

private static class DataReader {
    private InputStreamReader is;
    private BufferedReader reader;
    private String point = "";

    DataReader(Socket soc) throws IOException {
        is = new InputStreamReader(soc.getInputStream());
        reader = new BufferedReader(is);
    }

    Point read() throws IOException {
        point = reader.readLine();
        int x = Integer.parseInt(point.split(",")[0]);
        int y = Integer.parseInt(point.split(",")[1]);
        return new Point(x, y);
    }
}

public static void main(String [] args) throws UnknownHostException, IOException {
    Ground ground = new Ground();

    window.setContentPane(ground);
    window.setSize(600, 600);
    window.setLocation(0, 0);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);
}

}

1 Ответ

0 голосов
/ 02 ноября 2019

Я не вижу проблемы, но я видел, что:

ex = reader.read().x;
ey = reader.read().y;

Это читает две строки и отбрасывает y из первой и x из второй.

Должно быть:

Point p = reader.read();
ex = p.x;
ey = p.y;

Пир может не генерировать точку для чтения каждый раз, когда вы ее записываете, поэтому чтение точек из пира не должно происходить в обработчике событий, который записывает точку ввсматриваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...