Detecção de Toques com XNA 4.0

Com a vinda da versão 4.0 do XNA veio também o suporte do XNA ao Windows Phone 7, que será oficialmente lançado nesta segunda-feira(11/10/2010).
image
Uma das novas features mais interessantes é a capacidade de detectar facilmente pontos de toque na tela do dispositivo. A nova API de toques é muito simples de ser utilizada e, para qualquer pessoa que já utilizou as APIs de input do teclado, do mouse ou do gamepad, será um belo Déjà vu.
Para recuperar e utilizar os dados da API de toques, basta utilizar o método estático TouchPanel.GetState() que retorna um objeto do tipo TouchCollection. Este objeto é uma coleção de objetos do tipo TouchLocation. Cada TouchLocation corresponde a um ponto de toque na tela. Lembrando que os dispositivos com Windows Phone 7 devem suportar no mínimo 4 pontos de toque simultâneos.
Cada TouchLocation contêm 3 propriedades úteis: Id, Position e State. A propriedade Id é bem simples, um código de identificação, normalmente um número extenso. Este número é preservado enquanto o ponto existe. Position é um Vector2, com as coordenadas X e Y do centro do ponto de toque. State é uma variável do tipo enumerado TouchLocationState que pode ser:
  1. Invalid: Ponto inválido. O estado só esta Invalid quando você tenta recuperar um estado anterior de um ponto sendo que este ponto acabou de ocorrer.
  2. Moved: Este ponto foi atualizado, mudou de posição, ou pressionado no mesmo ponto.
  3. Pressed: Este ponto é novo, acabou de ocorrer.
  4. Released: Este ponto foi solto, liberado, ou seja, não esta mais sendo pressionado.
É válido lembrar que as APIs de toque do XNA 4 só funcionam para o Windows Phone 7. Não importa se você esta no Windows7, com uma tela multitoque. Se você executar o método TouchPanel.GetState() no Windows ou no XBox360, a API retorna um TouchCollection vazio, sempre! É um stub, ele não faz NADA, apenas retorna o TouchCollection vazio.
O último método interessante da API é o TouchLocation.TryGetPreviousLocation. Este método não é estático. Você o chama a partir de uma instância de TouchLocation passando um parâmetro de saida(out) do tipo TouchLocation. A função retorna neste parâmetro o ponto que ele era anteriormente. Como dito anteriormente, o ponto terá a propriedade State igual a Invalid quando o ponto que chamou a função for um ponto novo, ou seja, State igual a Pressed e o valor da propriedade Id será o mesmo do ponto anterior. O tipo de retorno da função é bool, retornando verdadeiro somente se o ponto que ele retorna no parâmetro de saida é válido.
Com esta configuração de estados e a função TryGetPreviousLocation você consegue descobrir quando um ponto foi criado e quando ele deixou de existir.
Como visto, a API é muito simples de se utilizar. Segue aqui um exemplo de código que testa todas as funcionalidade descritas.
C#
  1. protected override void Update(GameTime gameTime)
  2. {
  3. TouchCollection touchCollection = TouchPanel.GetState();
  4. if (touchCollection.Count > 0)
  5. {
  6. TouchLocation touchLocation1 = touchCollection.First();
  7. TouchLocation touchLocationAnterior;
  8. if (!touchLocation1.TryGetPreviousLocation(out touchLocationAnterior))
  9. {
  10. Debug.WriteLine(“Ponto anterior não existia!”);
  11. }
  12. if (touchLocation1.State == TouchLocationState.Moved && touchLocationAnterior.State == TouchLocationState.Pressed)
  13. {
  14. Debug.WriteLine(“Ponto novo criado(“ + touchLocation1.Position.ToString() + “). ID = “ + touchLocation1.Id.ToString());
  15. }
  16. if (touchLocation1.State == TouchLocationState.Released && touchLocationAnterior.State == TouchLocationState.Moved)
  17. {
  18. Debug.WriteLine(“Ponto não mais presente(“ + touchLocationAnterior.Position.ToString() + “). ID = “ + touchLocationAnterior.Id.ToString());
  19. }
  20. }
  21. base.Update(gameTime);
  22. }
Por hoje é só! Espero que este post tenha tirado as dúvidas de vocês em relação a esta nova API de toques. Em breve irei comentar sobre a API de gestos, que facilita a criação de interfaces naturais ao usuário, como por exemplo Tap, Hold, Flick, Pinch, entre outros.
Obrigado pelo seu tempo e até o próximo post,
Alexandre Z. Chohfi
Anúncios

Escolhendo entre Reach e HiDef no XNA 4.0

Uma das novas features do XNA 4.0 é que agora devemos escolher entre dois profiles de configuração: Reach ou HiDef. Estas pré-configurações foram criadas para facilitar a distribuição de games criados em XNA. Visto que as configurações dos computadores onde o jogo será executado são diferentes umas das outras, os profiles ajudam a selecionar um mínimo de capacidades do hardware que viabilizam a sua utilização.

Por padrão, games criados para Windows e XBox360 utilizam a configuração HiDef, enquanto games criados para Windows Phone 7 utilizam Reach. Projetos criados para Windows Phone 7 NÃO podem ser alterados para a configuração HiDef, devido a limitações do hardware dos dispositivos que executam o Windows Phone 7. Isso não quer dizer que você não possa criar jogos em 3D, ou que os jogos criados em Reach são piores graficamente que jogos criados em HiDef. Entretanto, você pode (e, na minha opinião, deve) alterar a configuração de jogos criados para Windows e XBox360 para Reach.

Reach como o próprio nome já diz, visa “alcançar” a grande maioria dos dispositivos atuais. Se a sua placa de vídeo for antiga, você provavelmente deve usar Reach.

HiDef significa High Definition, ou seja, alta definição. Este profile é para placas de vídeo mais novas.

Se você estiver criando jogos simples, em 2D principalmente, e não utilizar nada muito complexo, provavelmente o seu jogo funciona em Reach. Defini-lo como HiDef apenas inviabilizaria muitos computadores de rodares o jogo, portanto sempre que criar um projeto jogo (Game ou Game library, de Windows ou XBox360) mude o profile para Reach. Se, durante o desenvolvimento, você receber uma exceção indicando que a funcionalidade X não funciona em Reach, ai sim você deve alterar o seu projeto para HiDef, obviamente somente em projetos Windows e XBox360.

Para não deixar a explicação muito superficial, segue uma tabela que indica as limitações de cada profile:

  Reach HiDef
Plataformas Windows Phone 7, Xbox 360 e qualquer computador Windows com uma placa de vídeo com suporte ao DirectX 9 e no mínimo shader model 2.0. Xbox 360 e qualquer computador Windows com uma placa de vídeo com suporte ao DirectX 10 (ou equivalente, veja abaixo)
Shader Model 2.0  (mas o Windows Phone não suporta shaders customizados) 3.0+ (o Xbox 360 suporta extensões de shader customizadas como vfetch, que não estão disponíveis para Windows)
Tamanho máximo de texturas 2048 4096
Tamanho máximo de cubmap 512 4096
Tamanho máximo de texturas de volume Não suporta 256
Suporte a texturas com tamanhos não potência de 2 Limitado. Não se pode usar modo de endereçamento wrap, nem mipmaps, nem compressão DXT quando não é potência de 2 Sim
Suporte a cubemaps com tamanhos não potência de 2 Não Sim
Suporte a texturas de volume com tamanhos não potência de 2 Texturas de volume não são suportadas Sim
Número máximo de primitivas desenhadas por chamada da função Draw 65535 1048575
Formato do Index Buffer 16 bits 16 e 32 bits
Formato do elemento de Vertex Color, Byte4, Single, Vector2, Vector3, Vector4, Short2, Short4, NormalizedShort2 e NormalizedShort4 Todos os formatos do Reach mais HalfVector2 e HalfVector4
Formato de texturas Color, Bgr565, Bgra5551, Bgra4444, NormalizedByte2, NormalizedByte4, Dxt1, Dxt3 e Dxt5 Todos os formatos do Reach mais Alpha8, Rg32, Rgba64, Rgba1010102, Single, Vector2, Vector4, HalfSingle, HalfVector2 e HalfVector4. Formatos de textura com ponto flutuante não suportam filtragem
Formato de texturas de Vertex Texturas de vértice não são suportadas Single, Vector2, Vector4, HalfSingle, HalfVector2 e HalfVector4
Formatos de Render Targets Variavel (veja abaixo) Variavel (veja abaixo)
Render Targets multiplos Não suporta Até 4. Todas devem ter a mesma profundidade de bits. Suporta alpha blending e escrita independente de mascaras por render target
Queries de occlusion Não suporta Sim
Blend com alpha separado (Separate alpha blend) Não suporta Sim
Blend.SourceAlphaSaturation Apenas para SourceBlend, não para DestinationBlend Sim
Número máximo de vertex streams 16 16
Tamanho máximo do stream stride 255 255

 

Lembrem-se que o XNA é desenvolvido em cima do DirectX 9 então, quando digo que para se utilizar HiDef a sua placa de vídeo deve ter suporte ao DirectX 10, não é nem pelo suporte em si mas o profile HiDef, necessita de uma GPU com praticamente as mesmas funcionalidade de um XBox360: MRT, formatos de surfaces com ponto flutuante, vertex tecture fetch, etc, mas no DX9 estas funcionalidades são opcionais. Em teoria, é possível que uma placa de vídeo com suporte somente ao DX9 consiga funcionar para HiDef, mas na prática isso não ocorre, então em vez de falar que HiDef precisa de todas estas funcionalidades na placa de vídeo, é mais fácil dizer que ele necessita de uma placa com DX10.

Você provavelmente vai notar que o suporte aos formatos de RenderTarget ainda podem variar. Agora existe um novo mecanismo de fallback, ou seja, o framework tentará prover o formato pedido, mas, se ele não for suportado, ele escolhe o mais próximo suportado, procurando pelo formato com a profundidade de bits, número de canais, etc, mais similar. Na grande maioria das vezes isso não gera problema algum.

Estes formatos de vertex element, presentes no Game Studio 3.1, não são mais suportados no Game Studio 4.0 por nenhum profile: Rg32, Rgba32, Rgba64, UInt101010 e Normalized101010.

Estes formatos de texturas, presentes no Game Studio 3.1, não são mais suportados no Game Studio 4.0 por nenhum profile: Dxt2, Dxt4, Bgr555, Bgr444, Bgra2338, Bgr233, Bgr24, Bgr32, Bgra1010102, Rgba32, Rgb32, NormalizedShort2, NormalizedShort4, Luminance8, Luminance16, LuminanceAlpha8, LuminanceAlpha16, Palette8, PaletteAlpha16, NormalizedLuminance16, NormalizedLuminance32, NormalizedAlpha1010102, NormalizedByte2Computed, VideoYuYv, Video UyVy, VideoGrGb, VideoRgBg e Multi2Bgra32.

Agora o Game Studio 4.0 mudou definitivamente a ordenação dos bytes dos formatos de cores de BGRA para RGBA. Se você já encontrou com problemas ao fazer isso, saberá facilmente converter o seu código para o XNA 4.0, apenas mudando a ordem dos bytes.

 

Uma das coisas mais importantes é notar que agora o XNA 4.0 não suporta mais placas de vídeo com suporte apenas ao Shader Model 1.1! Apenas Shader Model 2.0 para Reach e 3.0+ para HiDef!

 

Em desenvolvimento para Windows, na maioria dos casos, você só tem que saber que se utilizar HiDef como padrão, você estará limitando o número de usuários capazes de executar o seu jogo, portanto use Reach e, se for indispensável, mude para HiDef.

 

Espero que tenha ajudado. Agradeço muito ao Shawn Hargreaves, especialista do time de desenvolvimento do XNA pelos posts em seu blog que nos informou de todas essas alterações.

Referências:

http://blogs.msdn.com/b/shawnhar/archive/2010/03/12/reach-vs-hidef.aspx

http://blogs.msdn.com/b/shawnhar/archive/2010/07/19/selecting-reach-vs-hidef.aspx

 

Abraços a todos e até o próximo post,

      Alexandre Z. Chohfi

Palestra FATEC Itaqua

Nesta ultima quinta-feira, a convite do meu colega MSP Luiz Pena, fui até Itaquaquecetuba no III Encontro de Gestão e Tecnologia e palestrei sobre desenvolvimento de jogos com XNA. Foi realmente cansativo. Duas palestras, uma as 9 da manha e outra as 19, ambas com duração de 2 horas, e um mini-curso de 5 horas, das 13 às 18.
Foi muito legal conhecer o pessoal da Fatec! Seguem algumas fotos do evento.

XNA 3.1 lançado!

 XNA3_1

É isso mesmo! XNA 3.1!

Este update não muito esperado pela comunidade está realmente incrível!

Agora o XNA também oferece suporte a vídeos! Além disso, houveram melhorias no Content Pipeline, facilitando ainda mais o desenvolvimento de tipos customizados de objetos.

Outra grande melhoria, foi o suporte completo ao XACT3, facilitando mais a integração da programação de jogos com o desenvolvimento dos efeitos de audio!

Baixe agora mesmo o XNA 3.1: http://www.microsoft.com/downloads/details.aspx?FamilyID=80782277-d584-42d2-8024-893fcd9d3e82&displaylang=en

Para ver a notícia completa: http://creators.xna.com/en-us/news/xnagamestudio3.1

Até o próximo post,

              Alexandre Z. Chohfi

XNA 3.0 Beta!

O XNA 3.0 Beta finalmente lançou! Depois de 4 meses com a TCP lançada, os criadores do XNA, lançam o Beta desta versão da plataforma de desenvolvimento de jogos da Microsoft.

Infelizmente ainda não foi lançado a versão final, que terá suporte às 3 plataformas: computadores, XBox360 e Zune. Nesta versão, da mesma forma como na CTP, o suporte ao desenvolvimento para XBox360 está bloqueado. Se voce tem um projeto feito em XNA2.0 e gostaria de continuar desenvolvendo ele, voce tem 2 escolhas: transformar o seu projeto para rodar em PCs, transferindo para a versão 3.0 e quando lançar a versão final do XNA3.0 transferir de volta para XBox360, ou continuar utilizando o XNA2.0. De qualquer forma o seu desenvolvimento não será prejudicado.

Baixe agora mesmo o XNA3.0Beta e aproveita as novas funcionalidades! Não se esqueça que voce deve utilizar o Visual Studio 2008 (Standard Edition ou melhor), ou baixar o e instalar o Visual C# 2008 Express Edition de graça!

Para baixar o XNA 3.0Beta: http://www.microsoft.com/downloads/details.aspx?FamilyID=63f74eeb-02ef-4339-9dcb-0cb58362bd7c&displaylang=en

Para ver a notícia completa: http://creators.xna.com/en-us/3.0beta_mainpage

Obrigado e até a próxima,

             Alexandre Z. Chohfi

XNA 3.0 CTP!

 xna
 
Depois de quase meio ano com a versão 2.0, é lançando a versão 3.0 do XNA, a plataforma de desenvolvimento de jogos da Microsoft.
Com os novos recursos desta versão, o XNA não se limita apenas ao desenvolvimento de jogos para PC e Xbox 360, mas inclui também a plataforma Zune. Ou seja, agora ficou ainda mais fácil criar os seus próprios jogos e jogá-los em qualquer lugar.
Lembrando que esta versão é um Community Technical Preview(Prévia Técnica da Comunidade), ou seja, é uma versão beta, quase pronta para ser distribuída. Ela está com a previsão do lançamento oficial para a temporada americana de feriados de 2008, ou seja, entre o começo de junho e o final de agosto deste ano.
Finalmente o XNA está suportando o Visual Studio 2008(Standard e Express), mas infelizmente, na versão CTP não está liberado o suporte ao XBox 360, ou seja, para conseguirmos desenvolver para ambas as plataformas, temos que ter o XNA 2.0(que só funciona no Visual Studio 2005) e o 3.0(que só funciona no Visual Studio 2008). Fora este pequeno contratempo, nós já podemos desenvolver para Zune, o que abre um leque gigante de possibilidades para esta ferramenta.
Obrigado e até a próxima,
             Alexandre Z. Chohfi