Eventos de teclado simultâneos

3 respostas
Caldaz

Galera o negocio é o seguinte,
preciso de ajuda para fazer um trabalho de faculdade, no qual preciso fazer 1 jogo desses de nave clássicos, com visão de cima, onde a nave se move para esquerda e direita e o fundo se movimenta verticalmente para dar impressão de movimento. Já começamos e até que esta indo tudo direitinho…mas estamos com um problema que não conseguimos resolver! O problema está no evento das teclas, quando vc anda com a nave (com as setas) e atira ao mesmo tempo (barra de espaço) a nave apenas atira, e para de andar, e também o movimento dela não está legal, ela da uma agarrada no início…me parece que ela usa o mesmo movimento que o cursor de texto do windows (quando segura a seta, ele da uma travadinha dpois segue em velocidade constante). O legal seria conseguir andar e atirar ao mesmo tempo, e se possível até andar na diagonal.

Se alguem pudesse nos dar uma luz, qualquer coisa, ficaria mtu grato!

Obrigado, abraços!

3 Respostas

brunogamacatao

Cara, quando você faz um jogo, você não deve tratar os eventos de teclado diretamente no método listener do evento do teclado. Ao invés disso, você deve utilizar uma estrutura que armazene o estado atual das teclas. Outra coisa que se usa bastante no desenvolvimento de jogos de computador é um loop pricipal onde você coloca as chamadas para as funções que tratem da física, detecção de colisões, tratamento de teclado, desenho do jogo, etc. Uma das estruturas mais utilizadas para o tratamento do teclado é um array de boolean representando da tecla do teclado. Ex:

//Array para armazenar o estado do teclado
boolean[] keys = new boolean[1024];

...
//Método listener para quando a tecla é pressionada
public void keyPressed(KeyEvent evt) {
    keys[evt.getKeyCode()] = true;
}

//Método listener para quando a tecla é liberada
public void keyReleased(KeyEvent evt) {
    keys[evt.getKeyCode()] = false;
}

//Método responsável por realizar o tratamento do teclado
public void processKeyboard() {
    //Exemplo de tratamento quando as setas para cima e para a esquerda
    //estiverem pressionadas ao mesmo tempo:
    if (keys[KeyEvent.VK_LEFT] && keys[KeyEvent.VK_UP]) {
        //Faz alguma coisa aqui
    }
    ...
}

...

//Exemplo do loop principal do jogo
public void gameLoop() {
    while(true) {
        processKeyboard();
        processPhysics();
        checkCollisions();
        checkGameLogic();
        repaint();
        try {
            Thread.sleep(50);
        } catch(InterruptedException ex) {}
    }
}

...
ViniGodoy

Dica.
Leia o material desse site: Killer Game Programming in Java

É um dos bons livros sobre o assunto e está inteiramente disponibilizado em PDF pelo autor.

Caldaz

Ae deu certo! Usamos o método processKeyboard() de acordo com oq vc sugeriu e deu certinho bruno!
obrigado mesmo, e tenham um bom fim de semana!

abraços.

Criado 12 de outubro de 2007
Ultima resposta 13 de out. de 2007
Respostas 3
Participantes 3