Para começar, é necessário que conheçamos o tipo sf::Event. Basicamente, é uma união. Isto significa que apenas um dos seus membros é válido em certo instante. O membro válido é o que corresponde ao tipo de evento. Em palavras mais simples, se o evento for o
KeyPressed
, então você terá que usar um membro correspondente, no caso o event.key.
sf::Event possui a função
pollEvent
(da classe sf::Window). Esta deve ser chamada antes de gerenciar os eventos. Exemplo:sf::Event event;
// enquanto houver novos eventos
while (window.pollEvent(event))
{
// ver o tipo
switch (event.type)
{
// evento fechar janela
case sf::Event::Closed:
window.close();
break;
// evento tecla pressionada
case sf::Event::KeyPressed:
break;
// eventos que não tratamos
default:
break;
}
}
O evento
sf::Event::Closed
é desencadeado quando o usuário tenta fechar a janela (seja pelo teclado ou clicando no botão fechar). Tipicamente é usada a função window.close().
Mas você pode fazer outras coisas antes, como salvar o estado atual ou confirmar o fechamento. Se você não fizer nada, a janela fica aberta.
O evento
sf::Event::Resized
é desencadeado quando o programador ou o usuário redimensiona a janela. O membro associado a esse evento é o event.size
, que contém o novo tamanho da janela. Exemplo:if (event.type == sf::Event::Resized)
{
std::cout << "new width: " << event.size.width << std::endl;
std::cout << "new height: " << event.size.height << std::endl;
}
Os eventos
sf::Event::LostFocus
e sf::Event::GainedFocus
são desencadeados quando a janela ganha ou perde o foco (neste caso ela não reconhece as teclas pressionadas). Não há membros associados a esse evento. Exemplo:if (event.type == sf::Event::LostFocus)
myGame.pause();
if (event.type == sf::Event::GainedFocus)
myGame.resume();
O evento
sf::Event::TextEntered
é desencadeado quando um caractere é digitado. Há uma diferença entre este evento e o evento KeyPressed:
o primeiro interpreta o caractere como um todo, então se for pressionar a tecla de um acento, não vai acontecer nada até que você digite a letra a ser acentuada; já o segundo reconhece o pressionamento do acento como um evento e o da letra como outro.
O membro associado a este evento é o
event.text
, que contém o valor Unicode do caractere digitado. Você pode tanto colocá-lo em uma sf::String ou em um char.
if (event.type == sf::Event::TextEntered)
{
if (event.text.unicode < 128)
std::cout << "ASCII character typed: " << static_cast<char>(event.text.unicode) << std::endl;
}
Existem muitos eventos, que podem ser conferidos no guia oficial (sf::Event). No entanto, vamos tratar de mais alguns nos próximos artigos.
Nenhum comentário:
Postar um comentário