2015-05-08 6 views
-1

Я делаю игру на Java, а метод repaint() ошибочно работает очень странно. В принципе, мне нужно перекрасить доску, прежде чем перейти к движению ИИ. Вот мой метод, где я звоню его:Метод перетаскивания не работает вовремя

public void mouseClicked(MouseEvent e) { 
    mouseX = e.getX(); 
    mouseY = e.getY(); 

    int button = e.getButton(); 
    if (button == MouseEvent.BUTTON1 || button == MouseEvent.BUTTON3) { 
     int mouseR = (mouseY/SIZE); 
     int mouseC = (mouseX/SIZE); 

     if (mouseR >= 0 && mouseC >= 0 && 
       mouseR < board.length && mouseC < board[0].length) { 
      if (board[mouseR][mouseC] == 3) { 
       makeMove(mouseR, mouseC, playerColor); 
       getValidMoves((playerColor % 2) + 1); 
       repaint(); 
       getAIMove(); 
      } 
     } 

    } 
    repaint(); 
} 

getAIMove() разработан таким образом, он ждет в течение нескольких секунд, прежде чем сделать этот шаг, так что игрок может видеть результаты своего хода, прежде чем они видят те из AI. К сожалению, хотя я звоню repaint() до getAIMove(), происходит следующее: игрок нажимает, куда они хотят двигаться. Кажется, что ничего не происходит в течение нескольких секунд, затем результаты перемещения игрока и ход AI отображаются на экране. Что происходит?

+0

Я думаю, вы должны переосмыслить дизайн приложения на более стандартный игровой цикл. Ваша перекраска не должна зависеть от логики игры или ввода пользователя .http: //entropyinteractive.com/2011/02/game-engine-design-the-game-loop/ – JohannisK

+0

у вас есть repaint() в конце вашего метод тоже, перерисовать() getAIMove() repaint() автоматически – JRowan

+0

@JRowan Да, я пробовал разные вещи, потому что я не знал, что происходит. Я выберу это, когда я отредактирую для эффективности и т. Д. Сейчас я просто пытаюсь заставить код работать :) – KnightOfNi

ответ

2

Весь код в вашем обработчике событий mouseClicked() будет работать на специальной AWT/Swing Thread.

repaint() не перекрашивать GUI сразу - это графики перерисовки (см this article), который также будет работать на свинг нить - но не до тех пор, обработчик события завершения - свинг нить может сделать только одну вещь время!

Таким образом, вы не увидите результатов getAIMove() до тех пор, пока впоследствии.

Вы, вероятно, нужно запустить getAIMove() логику в отдельном фоновом потоке, а затем обновить графический интерфейс (который должен быть сделан в свинг потоке, используя SwingUtilities.invokeLater() или класс SwingWorker помощника.)

Или можно запланировать AI для запуска в потоке Swing, используя invokeLater() - он будет запускаться после первого repaint(). Однако этот метод нежелателен (если AI не очень быстрый), потому что ваш графический интерфейс будет не отвечать на запросы, пока поток Swing не станет свободным для обработки рецензий.

Смотрите также учебники Java по этим темам:

+0

Спасибо за этот ответ! Знание того, что происходило «под капотом», действительно помогло мне решить мою проблему. – KnightOfNi

0

друг, и я понял, маленький трюк, чтобы бить очередь описываемую @ ДНК - вот мой новый код:

public void mousePressed(MouseEvent e) 
    { 
     mouseX = e.getX(); 
     mouseY = e.getY(); 

     int button = e.getButton(); 
     if(button == MouseEvent.BUTTON1 || button == MouseEvent.BUTTON3) 
     { 
     int mouseR = (mouseY/SIZE); 
     int mouseC = (mouseX/SIZE); 

     if(mouseR >=0 && mouseC >= 0 && mouseR < board.length && mouseC < board[0].length) 
     { 
      if (board[mouseR][mouseC] == 3){ 
       makeMove(mouseR, mouseC, playerColor); 
      } 
     } 

     } 
     repaint(); 
    } 

    public void mouseReleased(MouseEvent e) 
    { 
     int button = e.getButton(); 
     if(button == MouseEvent.BUTTON1 || button == MouseEvent.BUTTON3) 
     { 
     int mouseR = (mouseY/SIZE); 
     int mouseC = (mouseX/SIZE); 

     if(mouseR >=0 && mouseC >= 0 && mouseR < board.length && mouseC < board[0].length) 
     { 
      if (board[mouseR][mouseC] == playerColor){ 
       getValidMoves((playerColor % 2) + 1); 
       getAIMove(); 
       getValidMoves(playerColor); 
      } 
     } 

     } 
     repaint(); 
    } 

Выполняя движение игрока при нажатии мыши и ожидая, чтобы движение AI двигалось до тех пор, пока мышь не будет отпущена, программе разрешено заполнять нить Swing и перерисовывать ее. Спасибо за всю твою помощь!

Смежные вопросы