quinta-feira, 12 de março de 2015

ScrollArea e Qt: uma briga contante

O Qt tem muita coisa bacana, e a documentação é bem completa e útil. Mas as vezes é bem difícil descobrir como se faz algo "simples". Dessa vez eu estava tentando capturar o evento de rolagem do mouse (a "rodinha" ou mouse wheel) para permitir ao usuário efetuar zoom na imagem em exibição. A organização visual é de fato simples: eu tenho um componente (widget) customizado que contém uma QScrollArea e dentro dela uma QLabel com a imagem.

O problema é que o QScrollArea já captura e trata esse evento do mouse: ele usa pra rolar tanto vertical (a rodinha do mouse usada sozinha) como horizontalmente (a rodinha do mouse usada quando a tecla Alt está pressionada) quando a imagem é maior do que a área de visualização. E então, ele simplesmente não repassa o evento para que ele possa ser capturado pelo componente externo. Também não há nenhum sinal que possa ser conectado a um método para fazer isso.

Afortunadamente, eu encontrei essa postagem muito bacana que sugere o uso de filtros de evento para fazer justamente isso: fazer com que o QScrollArea simplesmente não receba o evento, que assim não vai ser tratado e continuará a ser encaminhado até o componente mais externo. Bom, eu não queria ter que reimplementar todo o tratamento de rolagem já muito bem realizado pelo QScrollArea, então eu usei o método QApplication::keyboardModifiers() para ignorar o evento apenas quando a tecla Ctrl estiver pressionada (pois ai sim eu aplicarei o zoom intencionado).

Eis o exemplo de código:

// +-----------------------------------------------------------
ChildWindow::ChildWindow(QWidget* pParent) :
    QWidget(pParent)
{
. . .
// Make the scroll ignore the mouse wheel events
// (they will be handled at this class scope). 
m_pScrollArea->viewport()->installEventFilter(this);
. . .
}

// +-----------------------------------------------------------
bool ChildWindow::eventFilter(QObject *pObject, QEvent *pEvent)
{
// Ignore the mouse wheel events if the Ctrl key is pressed
bool bCtrl = QApplication::keyboardModifiers() &
Qt::ControlModifier;
if(pEvent->type() == QEvent::Wheel && bCtrl)
{
pEvent->ignore();
return true;
}
return false;
}

// +-----------------------------------------------------------
void f3::ChildWindow::wheelEvent(QWheelEvent *pEvent)
{
QPoint oPixels = pEvent->pixelDelta();
  QPoint oDegrees = pEvent->angleDelta() / 8;
QPoint oSteps = oDegrees / 15;

QPoint oDelta = !oPixels.isNull() ? oPixels : oDegrees;

// Scale the image based on the wheel delta
scaleImageBy(oDelta);

pEvent->accept();
}

terça-feira, 3 de fevereiro de 2015

Como converter vídeos para diferentes formatos de forma fácil e prática

Se você também precisa converter algum vídeo (no meu caso, a necessidade decorre do fato do meu equipamento multimídia ser um tanto antigo e só aceitar o formato AVI), precisa conhecer a ferramenta FFmpeg. Trata-se de um aplicativo de código aberto, disponível para múltiplas plataformas, e que permite fazer inúmeras coisas bacanas - entre elas converter rapidamente e com qualidade entre vários formatos de arquivos de vídeo.

sábado, 17 de janeiro de 2015

Executando o Ubuntu em tela cheia no Hyper-V

Se você já precisou usar o Hyper-V (no Windows 8, por exemplo) rodando uma máquina virtual do Ubuntu já deve ter percebido que o modo de tela cheia as vezes não usa toda a tela do seu monitor, e a configuração do Ubuntu mostra uma resolução máxima bem menor do que aquela que o seu monitor suporta.

Fuçando na Internet descobri uma maneira de configurar o Ubuntu para que ele force uma resolução que você deseja diretamente como um parâmetro do kernel (traduzido da fonte original):

1. No Ubuntu rodando dentro da máquina virtual, abra um terminal e digite (você também pode editar o arquivo 'grup' no editor de sua preferência se não curtir muito usar o vi):

sudo vi /etc/default/grub

2. Procure pela linha com o parâmetro GRUB_CMDLINE_LINUX_DEFAULT. Adicione a esse parâmetro o valor "video=hyperv_fb:1280x1024" (a informação com a resolução desejada no seu monitor, sem as aspas). Vai ficar assim:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1280x1024"

3. Salve o arquivo e execute o seguinte comando para atualizar:

sudo update-grub

4. Agora é só reiniciar a sua máquina virtual e tádá! :)

Muito útil!

:wq



quinta-feira, 23 de outubro de 2014

O Guia Leigo da Projeção em Video Games

Artigo fantástico do blog de Radek Koncewicz sobre as diferentes formas de projeção (desenho) em Videogames. Inclui projeção ortográfica (trimétrica, dimétrica e isométrica), oblíqua e em perspectiva.

Link para o original aqui.


segunda-feira, 22 de setembro de 2014

Pernalonga e os Capiras Dançando Quadrilha



"vamos dançar quadrilha!
aos seus lugares!
reverência!
repetir!

as mãos pra cima, contato e rir
balancê no toque-toque
venha no puleiro cocoricó
todos uma voltinha
avança no meio bem bonitinha
caminho da roça com as palminhas
pezinho pra cima, pra baixo pezão
bata com ele, vem tudo no chão
avança, mergulhe, os dois vão pra frente
vamos pra trás e pra frente denovo
dê um pulinho e dê as mãos ao meu povo
todos uma voltinha
balancê com as palminhas
primeiro a direita e depois esquerdinha
encontre seu par com um bom sorriso
balancê em cima do piso

balancê pelo salão
vamos saindo pelo portão
vamos lá fora fazer o quê
todo mundo no balancê

uma voltinha bem bonitinha
puxo sua barba, você puxa a minha
vamos repetir mais uma vez
puxem as barbas no 1 2 3

agora dentro d'água pescando peixinho
mergulhe a cabeça bem direitinho
roda roda sem fugir
mais um mergulho e vamos sair

sacudir como perdigueiro
dar um mergulho lá no chiqueiro
dentro da lama vamos pular
cambalhotas, depois nadar
balancê de mão na mão
dê um sorriso de coração
agora um pouco de bom tempero
pegue na cerca e bata no parceiro

bata com força bem na cabeça
em cima, embaixo, na inteligência
bata também com a vontade
assim que se faz lá na cidade
bate em baixo, bate em cima
um dedo no olho bem na menina
uma voltinha pelo salão
bata com força a cabeça no chão

balancê pelo salão
todo mundo de mão na mão
a porta aberta, vamos entrar
a porta se fecha, vai começar
roda roda sem parar
cuidado agora pra não machucar
vamos com calma e com cuidado
agora sim vai sair quadrado

as mãos pra cima abaixe a mão
agora correr como um alazão
subir ladeira, descer ladeira
levante a cabeça que é sexta-feira
agora não pare siga em frente
dou meia volta inteligente
mão na cabeça e mão no nariz
e vamos dançar que nem um juiz

agora uma reverência de quem dançou, mais uma vez quem não gostou!
E Acabou!"

terça-feira, 16 de setembro de 2014

As minhas opiniões sobre o projeto de implantação de ciclofaixas em São Paulo

Recentemente um jornalista chamado Felipe Machado escreveu este texto em que oferece a sua opinião a respeito das ciclofaixas que estão sendo colocadas pela cidade de São Paulo pela atual gestão da prefeitura. Eu recebi o texto por Facebook, li e o achei bem escrito. Apesar do Felipe ter uma opinião geral distinta da minha, eu achei seu texto útil porque ele oferece diferentes aspectos pontuais que são mais interessantes para uma discussão produtiva do que outros que tenho visto. No texto, o autor diz que gostaria que o prefeito respondesse às questões levantadas e eu compartilho desse desejo. Seria realmente muito bacana se o prefeito pudesse, ele mesmo, respondê-las. Enquanto isso, eu achei que poderia colaborar com a discussão oferecendo a minha própria opinião, sobre esses mesmos pontos.


segunda-feira, 19 de maio de 2014

O Bote Mágico de Zork

Como eu adorava jogar Zork, resolvi reproduzir esse texto que li hoje aqui (reproduzido da página 197, capítulo 8, de "Design de Games: Uma Abordagem Prática", de Paul Schuytema com tradução de Cláudia de Mello Belhassof e publicado em 2008 por Cengage Learning). História massa demais!


P.S.: Você pode fazer download do Zork original da Infocom aqui ou jogar online se preferir - só não sei se ainda dá pra fazer o esqueminha do bote na versão online. :)

:wq



O Bote Mágico de Zork

Designer: Steve Meterzky

Na aventura em texto da Infocom, Zork I, havia um bote salva-vidas de borracha e uma bomba de ar que você podia usar para inflá-lo. Havia, de fato, dois objetos de bote: o bote desinflado (chamado, se bem me lembro, "pilha de plástico") e o bote inflado (denominado, se bem me recordo, "bote de borracha").

Zork (e muitos games subsequentes da Infocom) tinha um limite de quanto "inventário" um jogador poderia carregar. Isso era feito dando a cada objeto um peso e somando o peso total dos objetos no inventário de um jogador. Se você tentasse pegar um objeto que o deixasse acima do limite de peso, a tentativa iria falhar.

Alguns objetos eram recipientes, ou seja, você podia colocar outros objetos dentro deles. A verificação do peso do inventário também considevara esses itens aninhados. O bote, evidentemente, era um recipiente.

Como o bote era composto por dois objetos, se você segurasse o bote inflado e o desinflasse, o bote inflado era transportado para a terra de ninguém e o bote desinflado se transportava para o seu inventário.

Um jogador percebeu que podia carregar o bote com um monte de coisas e, logo após, desinflá-lo, e a contribuição do bote para o limite do inventário não incluiria as coisas que estavam dentro do bote, já que ele estava na terra de ninguém. Quando preciva de algo que estava no bote, o jogador pegava o bote desinflado, inflava-o e lá estava o objeto. Assim, ele era capaz de burlar o limite de inventário.

No início, o implementador de Zork, Marc Blank, ficou horrorizado com esse "bug" e começou a consertá-lo. Mas, depois, decidiu que era um modo tão engenhoso de burlar o limite de inventário que qualquer jogador capaz de pensar nesse modo merecia usá-lo!

terça-feira, 22 de abril de 2014

Mecânicas de jogos em HTML5

Tutorial bacana demais sobre a implementação de mecânicas de jogos (como andar e pular, lançamento de mísseis, flocking, etc).


quarta-feira, 25 de setembro de 2013

Tutorial: Image processing for scientists and engineers

Eis aqui um tutorial (em inglês apenas, sorry) muito f.d@ bacana sobre processamento de imagens. Ele é composto de 6 partes e dá uma visão geral, mas ao mesmo tempo bastante completa, da área de processamento de imagens. Eu cheguei nele procurando informações sobre Gabor filters, que é algo que não é muito explorado diretamente nos livros que eu tenho sobre o assunto. Massa!

O tutorial foi produzido por Patrick Fuller e está disponível em seu blog.

Eis as representações 3D e 2D de um kernel de Gabor. :)
(imagem original do blog de Patrick Fuller)

P.S.: Atenção especial deve ser dada pros scripts que o cara fez pra gerar representações 3D de imagens (como a exibida acima) usando Blender! Código dos scripts aqui.

segunda-feira, 2 de setembro de 2013

Jogos Criados no SPJam 2013

Alguns colegas e eu formamos uma equipe chamada The Peasant Railgun (inspiração do nome aqui) para participar do SPJam 2013 na categoria de jogos analógicos. Este ano o tema principal sorteado foi "Plot Twist" (algo como "reviravolta no enredo") com dois subtemas opcionais: "Cabeça" e "Amarelo".

Surgiram inúmeras ideias, mas duas ficaram tão legais que não resistimos e fizemos dois jogos de tabuleiro! A seguir eu apresento a equipe e os jogos.