terça-feira, 22 de janeiro de 2013

Trabalhando com eventos


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