[Dúvida] - Teclas simultâneas em aplicação e delay de teclas

Olá GUJ!

Não sei se é aqui o local certo para que eu me informe sobre isso. Veja bem, eu ando ultimamente estudando criação simples e básica de jogos. E, estou fazendo um joguinho bem bobo de nave parecido com o clássico “Space Invaders”. Notei que ao programar as teclas de ação para o jogo, elas não respondiam corretamente (como eu esperava).

O que acontece, é que eu descobri que ao segurar uma tecla por exemplo, a tecla tem uma espécie de “delay” para que ela se repita. Veja esse meu exemplo:

Você programa para que as teclas direcionais esquerda e direita movam sua nave para as respectivas direções. Porém, ao segurar para a esquerda por exemplo, a nave anda o que ela deve andar para esquerda, para por um tempo, e só então ela começa a movimentar-se seguidamente para a esquerda. Deixando de forma mais clara, [color=red]se coloco minha nave para movimentar-se -3 para esquerda e +3 para a direita, e seguro para a esquerda, ela anda -3, PARA POR UM SEGUNDO DE SE MOVIMENTAR :cry: , e só depois, ela começa a andar seguidamente para a esquerda diminuindo continuamente -3 da posição atual dela.[/color]

[color=green]Conclui-se que, ela para uma ação que esteja fazendo, e depois de 1 segundo, começa a realizar a nova ação que deve fazer.[/color]

Isso é muito, mas muito estranho. Não sei se isso é problema do próprio computador (eu não entendo muito de sistemas de computador, mas sou um programador amador de Java).

Antes eu estava com um problema de ao apertar mais de uma tecla ao mesmo tempo, a segunda tecla iria sobrepor a primeira, mas resolvi esse problema com valores “booleanos”.

Eu postei um vídeo no YouTube, e gostaria muito mesmo que vocês olhassem para ver do que eu estou falando:

Percebam que fico todo momento apertando mais de uma tecla seguida (dá para ver nos valores “booleanos”), porém, a nave para no momento em que eu teclo uma tecla nova ou desaperto uma. É muito estranho isso e infelizmente eu não estou achando solução alguma para isso. Já procurei aqui no GUJ e infelizmente não achei. procurei algo como “delay de tecla pressionada” ou “tecla delay” ou “delay pressionar” ou “tempo tecla pressionada”, mas nada. Não achei. Por isso preciso de ajuda de forma específica.

Gostaria que dessem uma olhada no vídeo por gentileza, é apenas 1:06 minutos o vídeo.

Desde já agradeço a atenção de todos!

Abraços!

O autorepeat, no caso do Windows, é controlado pelo próprio sistema operacional. Ele não está ativo para as teclas modificadoras (Ctrl, Shift, Alt, AltGr) mas está ativo para as outras.
Por exemplo, na minha máquina, o autorepeat está configurado para 30 teclas por segundo (“keyboard rate”), e ele estará ativo após 1 segundo de pressionamento (“keyboard delay”). Para mexer nesses parâmetros, abra uma tela do DOS e digite os seguintes comandos:

C:\>mode con

Status for device CON:
----------------------
    Lines:          2000
    Columns:        80
    Keyboard rate:  30
    Keyboard delay: 1
    Code page:      850


C:\>mode con rate=30 delay=3

C:\>mode con

Status for device CON:
----------------------
    Lines:          2000
    Columns:        80
    Keyboard rate:  30
    Keyboard delay: 3
    Code page:      850

[quote=entanglement]O autorepeat, no caso do Windows, é controlado pelo próprio sistema operacional. Ele não está ativo para as teclas modificadoras (Ctrl, Shift, Alt, AltGr) mas está ativo para as outras.
Por exemplo, na minha máquina, o autorepeat está configurado para 30 teclas por segundo (“keyboard rate”), e ele estará ativo após 1 segundo de pressionamento (“keyboard delay”). Para mexer nesses parâmetros, abra uma tela do DOS e digite os seguintes comandos:

[code]
C:>mode con

Status for device CON:

Lines:          2000
Columns:        80
Keyboard rate:  30
Keyboard delay: 1
Code page:      850

C:>mode con rate=30 delay=3

C:>mode con

Status for device CON:

Lines:          2000
Columns:        80
Keyboard rate:  30
Keyboard delay: 3
Code page:      850

[/code][/quote]

E aí entanglement!

Olha, eu modifiquei isso que você falou e… Agora ele demora mais ainda para responder! :cry:

Tentei colocar o [color=red]delay=0[/color] e melhorou bastante na velocidade com o qual ele se move. Mas, ainda, está atrasado e a resposta não é imediata. Toda vez que pressiono uma tecla a mais ou solto outra tecla, a nave para por um tempinho até que ela faça a sua nova tarefa. Devo dizer, eu acredito que não preciso modificar isso para jogar jogos comerciais com resposta rápida em repetição de tecla. Tipo, eu tenho instalado aqui Wacraft 2 da Blizzard, e ao usar as teclas direcionais para movimentar a tela do jogo, eu tenho uma resposta imadiata do efeito que o jogo proporciona ao jogar (que, obviamente, é movimentar a tela). Acredito que não seja isso realmente que possa resolver esse problema. Já vi jogos java com resposta imediata com relação a movimentação de uma entidade. Aumentei também o [color=red]rate=50[/color] e ainda assim, melhorou, mas não está satisfatório.

entanglement, obrigado pela ajuda. Não quis parecer ingrato e nem grosso, mas só quero te mostrar que isso infelizmente, não resolveu o problema. Se fui, peço perdão a você por ter sido. Mais uma vez, obrigado pela ajuda. :-o

Obrigado pela atenção de todos, e continuo a aguardar uma resposta.

Abraços!

Normalmente você usa o evento keyPressed e keyReleased para joguinhos, não keyTyped, que é o evento gerado pelo Windows periodicamente.

Obviamente, nesse caso, você precisa tomar um pouco de cuidado - se simplesmente ligar um timer no keyPressed para a cada x milissegundos ele gerar um evento para mover a nave (e no keyReleased para desligar esse timer), você também precisa ver se é necessário tratar algum outro evento (para não acabar acontecendo algo parecido com “tecla presa”.)

Veja o blog do ViniGodoy, que ele é o experiente em jogos.

E aí.

Certo. Agora que você falou, eu realmente lembro do site dele. Seria esse o site?: http://www.pontov.com.br/site/

Vou dar uma passada lá e verificar os tutoriais dele sobre Java. Espero que eu encontre a resposta lá, se eu encontrar, colocarei aqui. Mas, veja como encontra-se o meu código de tratamento de teclas:

[code]// #################################################
// EVENTOS DE TECLADO
// #################################################
@Override
public void keyPressed(KeyEvent evento)
{
if(evento.getKeyCode() == KeyEvent.VK_LEFT)
{
this.teclaSetaEsquerda = true;
}
if(evento.getKeyCode() == KeyEvent.VK_RIGHT)
{
this.teclaSetaDireita = true;
}
if(evento.getKeyCode() == KeyEvent.VK_SPACE)
{
this.teclaEspaço = true;
}
if(evento.getKeyCode() == KeyEvent.VK_A)
{
this.teclaA = true;
}
if(evento.getKeyCode() == KeyEvent.VK_Z)
{
this.teclaZ = true;
}

	this.criarEfeitosDeTeclas();
}

@Override
public void keyReleased(KeyEvent evento) 
{
	if(evento.getKeyCode() == KeyEvent.VK_LEFT)
	{
		this.teclaSetaEsquerda = false;
	}
	if(evento.getKeyCode() == KeyEvent.VK_RIGHT)
	{
		this.teclaSetaDireita = false;
	}
	if(evento.getKeyCode() == KeyEvent.VK_SPACE)
	{
		this.teclaEspaço = false;
	}
	if(evento.getKeyCode() == KeyEvent.VK_A)
	{
		this.teclaA = false;
	}
	if(evento.getKeyCode() == KeyEvent.VK_Z)
	{
		this.teclaZ = false;
	}
	
	this.criarEfeitosDeTeclas();
}

@Override
public void keyTyped(KeyEvent evento)
{
	
}

public void criarEfeitosDeTeclas()
{
	if(this.teclaSetaEsquerda == true)
	{
		this.nave.incPosX(-3 , this.TELA_LARGURA);
	}
	if(this.teclaSetaDireita == true)
	{
		this.nave.incPosX(3 , this.TELA_LARGURA);
	}
	if(this.teclaEspaço == true)
	{
		this.balas[this.balaAtual].setPosX( this.nave.getPosX() - 20);
		this.balas[this.balaAtual].setPosY( this.nave.getPosY() );
		
		if(this.balaAtual < 19)
		{
			this.balaAtual++;
		}
		else
		{
			this.balaAtual = 0;
		}
	}
	if(this.teclaA == true)
	{
		this.nave.incPontosDeVida(1);
	}
	if(this.teclaZ == true)
	{
		this.nave.decPontosDeVida(1);
	}
}[/code]

Bem, se alguém achar algo que possa consertar ou ajudar em meu problema, ficarei feliz. :wink:

Vou lá no site do Vini e se não encontrar a resposta, vou continuar procurando por aqui. :?

Valeu aí! :-o