Olá pessoal, tudo bem?
Então, estou fazendo um programa (bot) para um jogo. No entanto, preciso usar a classe Robot para o controle do mouse. (embora esse não seja o problema do tópico)
A situação é a seguinte:
Tenho uma classe que extends JFrame implements KeyListener, quando o usuário aperta F12 ele vai ativar o looping infinito que consequentemente irá chamar toda hora o método limparInventario(), até este ser interrompido. (teoricamente, ele será interrompido quando o usuário apertar F10 ou F11.)
(obs: robot é o objeto da classe Robot. o delay que é settado na primeira linha (é recebido atraves de um JOptionPane) atraves de um atributo int da classe Ouvinte e posteriormente, tal como no código é passado como delay para o objeto robot.)
public void limparInventario()
{
robot.delay(ouvinte.getDelay());
robot.mousePress(InputEvent.BUTTON3_MASK);
robot.mouseRelease(InputEvent.BUTTON3_MASK);
robot.keyPress(32); // 32 == barra de espaço.
robot.keyRelease(32);
}
Fragmento da classe que extends JFrame implements KeyListener
O Problema é o seguinte, o usuário aperta F12, então o programa funciona perfeitamente como eu esperava. mas, se o usuário decidir apertar o F10 para pausar o jogo ou F11 para finalizar o programa não aceita e continua no looping infinito. Acredito que isso seja um problema em relação ao Focus , alguem sabe se é isso mesmo e sabe me indicar uma possível solução?
Se não me engano, esse seu loop deve rodar em outra Thread (se não me engano…) pois acho que ele está ocupando a Thread que trata dos eventos e por isso não está recebendo as informações sobre pressionamento de teclas.
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == e.VK_F12) {
inciaRobo();
return;
}
if(e.getKeyCode() == e.VK_F10) {
paraRobo();
return;
}
if(e.getKeyCode() == e.VK_F11) {
System.exit(0); // cuidado! evite isso (isso mata a JVM)
// procure sair do programa encerrando as Thread e usando um dispose()
return;
}
}
Aí crie dois novos métodos:
private void inciaRobo() {
flag = true;
new Thread(new Runnable() {
public void run() {
while (flag) {
limparInventario();
}
}
}).start();
}
private void paraRobo() {
flag = false;
}
[quote=marcobiscaro2112]Dentro do método keyPressed() deixe assim:
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == e.VK_F12) {
inciaRobo();
return;
}
if(e.getKeyCode() == e.VK_F10) {
paraRobo();
return;
}
if(e.getKeyCode() == e.VK_F11) {
System.exit(0); // cuidado! evite isso (isso mata a JVM)
// procure sair do programa encerrando as Thread e usando um dispose()
return;
}
}
Aí crie dois novos métodos:
[code]
private void inciaRobo() {
flag = true;
new Thread(new Runnable() {
public void run() {
while (flag) {
limparInventario();
}
}
}).start();
}
Você poderia me explicar pq foi necessário criar uma thread, (não estudei isso muito ainda) de forma resumida já basta. ?
Não entendi muito bem quando ali nomédoto do KeyPressed sendo que ele é “void” você pede que ele use o “return” qual seria a função do return nesse sentido?
Uma Thread é uma execução “em paralelo” à outras (entre aspas pois isso depende de algumas circunstâncias; para simplificar, vamos assumir que seja em paralelo) que executa determinada ação. Por exemplo, em um jogo online, existe uma Thread para redesenhar a tela, uma para atualizar valores, uma para tocar sons, uma para tratar da entrada/saída de dados na rede, e assim por diante.
Tudo que você coloca dentro do keyPressed roda na Thread responsável por tratar eventos. Se um loop “prende” a Thread naquele método, eventos posteriores não serão processados. Por isso a necessidade de outra Thread: seu loop roda nessa segunda Thread, enquanto eventos de entrada são processados normalmente.
Isso apenas diz que o método deve interromper sua execução naquele trecho (ou seja, retornar). É uma técnica comum usar um ‘return;’ em métodos void para controle de fluxo (geralmente fica melhor que ‘if … else if … else if … else …’).
Você poderia me explicar pq foi necessário criar uma thread, (não estudei isso muito ainda) de forma resumida já basta. ?
[/quote]
Uma Thread é uma execução “em paralelo” à outras (entre aspas pois isso depende de algumas circunstâncias; para simplificar, vamos assumir que seja em paralelo) que executa determinada ação. Por exemplo, em um jogo online, existe uma Thread para redesenhar a tela, uma para atualizar valores, uma para tocar sons, uma para tratar da entrada/saída de dados na rede, e assim por diante.
Tudo que você coloca dentro do keyPressed roda na Thread responsável por tratar eventos. Se um loop “prende” a Thread naquele método, eventos posteriores não serão processados. Por isso a necessidade de outra Thread: seu loop roda nessa segunda Thread, enquanto eventos de entrada são processados normalmente.
Isso apenas diz que o método deve interromper sua execução naquele trecho (ou seja, retornar). É uma técnica comum usar um ‘return;’ em métodos void para controle de fluxo (geralmente fica melhor que ‘if … else if … else if … else …’).[/quote]