Análise de livro: Instant HTML5 2D Platformer (Packt Publishing)

BookInstantHTML5PlatformerEsse é o primeiro livro da série “[Instant]” da Packt que leio (existem vários livros da mesma série) e de cara você percebe que o livro consiste de uma série de “receitas” sequenciais (não sei se outros títulos da série possuem a mesma estrutura).

O livro foca em desenvolver de maneira progressiva um framework HTML5/JavaScript para jogos 2D, usando um jogo de plataforma como exemplo. Discute o básico como elemento canvas, sprite e animação, input, parallax, física (colisão e pulo), inimigos e objetos, áudio e GUI. Cada receita é composta de duas seções: “How to do it” e “How it works”. A primeira seção possui uma abordagem passo-a-passo para implementar um determinado tópico, com código, enquanto a segunda seção explica um pouco mais sobre o código previamente apresentado.

Conforme mencionado no livro, o autor assume que o leitor já possua conhecimento em HTML e JavaScript (básico para intermediário) e foca apenas no código apresentado no livro. Apesar de não explicar as tecnologias, acredito que o texto e código sejam fáceis para entender e acompanhar, assim como portar o código para outra tecnologia, se você quiser.

Minha opinião sobre o livro é dividida; isto é, ele cobre vários aspectos para começar a desenvolver um jogo 2D, mas não vai além do básico: a seção “How it works” explica o código e inclui pouca teoria; não há nenhuma explicação detalhada sobre o tópico e nem são mencionados eventuais problemas que o leitor pode encontrar. Exemplos: como tocar uma música de fundo em loop? Todos os navegadores suportam áudio? Em um jogo de plataforma (gênero do livro), como lidar com plataformas flutuantes ao invés de definir o jogador numa posição fixa no eixo Y? O jogo em HTML5 roda igual no desktop e em smartphones?

Poderiam existir duas seções adicionais, “There’s more” (mais detalhes teóricos e de implementação) e “See also” (referências para aprofundar os estudos ou mesmo libs JS que poderiam ajudar o desenvolvimento), que já vi em outros livros da mesma editora.

Gostei que o código-fonte aplica orientação a objetos e possui gerenciadores (ObjectManager e AnimationManager). Realmente oferece um ponto de partida para um framework de jogos, apesar de existirem alguns bugs, como uso de frameWidth e frameHeight ao invés de texture.width/.height no AnimationManager.BoundingBox (depois que enviei uma errata pelo site, o autor corrigiu essa parte).

Esse é um bom livro se você é novo em desenvolvimento de jogos e quer começar a desenvolver em HTML5/JS, mas tenha em mente que, por causa da abordagem “short, fast, focused guide” (conforme mencionado no site do livro), você terá que procurar por informações detalhadas em outro lugar.

Link para a página do livro no site da editora.

Be Sociable, Share!

Promoção de fim de ano da Packt (e-books por USD5)

PacktUSD5BonanzaRecebi um press release da editora Packt, que publica e-books e livros impressos sobre diversos assuntos de computação (incluindo desenvolvimento de jogos), informando sobre uma promoção de fim de ano chamada “eBook Bonanza”: de 19/12/2013 até 03/01/2014, qualquer e-book ou vídeo-aula da editora por apenas USD5.

Vi que há vários livros sobre diferentes tecnologias para jogos, como: AndEngine (engine de Android), Cocos2d-X, CryEngine, HTML5, SFML, SDL, UDK, Unity, XNA, entre outros. Para Unity tem vários, inclusive vídeo-aula. Para artistas, há vários livros de Blender, incluindo um escrito pelo brasileiro Allan Brito (Blender 3D Architecture, Buildings, and Scenery). Achei um de ZBrush, um de Mudbox e um de modo também.

Eu, em particular, gosto dos livros de OpenGL (inclusive notei que pre-order também estão na promoção, tem um sobre GLSL lá).

Segue press release (em inglês) com link para mais informações:

Packt’s $5 eBook Bonanza is back!
Following on from the success of last year’s festive offer, the publisher will be celebrating the holiday season with an even bigger $5 Bonanza.

From December 19th, customers will be able to get any eBook or Video from Packt for just $5. This sale covers every title in the 1700+ range and customers can grab as many as they like until January 3rd 2014 – more information is available at http://bit.ly/1jdCr2W

Be Sociable, Share!

A Tétrade Elementar (Jesse Schell) ou os elementos básicos de um jogo

ElementalTetradAo realizar um estudo sobre game design, referenciei o trabalho de Jesse Schell, o ótimo livro “The Art of Game Design: A Book of Lenses” (lançado no Brasil pela Elsevier sob o título “A Arte de Game Design: o livro original”). Um conceito legal que ele descreve é a Tétrade Elementar (Elemental Tetrad), composta pelos quatro elementos básicos de um jogo: mecânica, história, estética e tecnologia (segundo o autor).

Schell indica que um elemento não é mais importante que o outro, pois cada um suporta o outro, e deve (ou deveria) estar presente em todos os jogos. Basicamente, temos o funcionamento do jogo (mecânica), a sequência de eventos (história), o áudio-visual e emoções (estética) e a mídia (tecnologia), sendo a estética o elemento mais visível para o jogador e tecnologia o menos visível.

Com essa relação, ele mostra a figura da Tétrade Elementar. Para aqueles que algum dia precise reproduzí-la (como eu precisei), estou deixando para download o arquivo que criei (MS PowerPoint 2007) para reproduzir a figura (contendo versão en-US e pt-BR). Por quê PPT? Porque achei que seria mais fácil e rápido aproveitar os recursos que o software oferecia para criar a figura, podendo posteriormente alterar texto, posição, tamanho, etc. sem muito trabalho. Sei também que muita gente que escreve artigos ou faz apresentações já possui e usa ferramentas similares.

Quem quiser se aprofundar mais no assunto, recomendo bastante o livro! Para a versão pt-BR, recomendo uma leitura cuidadosa, pois algumas traduções não ficaram boas (além de alguns erros aqui e ali).

Para download do PPT com a reprodução da figura, clique aqui.

Be Sociable, Share!

Os 10 mandamentos do rei da biblioteca (de programação)

Nesses últimos dias muita gente comentou sobre o rei do camarote. Eu assisti o vídeo e… bom… Mas o que isso tem a ver com qualquer coisa desse blog?

Duas frases chamaram a minha atenção, acho que pela quantidade de piadas que apareceram na minha timeline do Facebook: “Isso agrega a tudo” e “Comprar um Boing e colocar um piloto de teco-teco para pilotar”. E como esses tempos eu escrevi review de alguns livros e amigos me pediram indicações de livros de programação, acho que as coisas se misturaram um pouco… e então, sei lá exatamente por qual motivo (acho que o vídeo acabou afetando meu cérebro), resolvi fazer uma versão focada em livros, criando:

“Os 10 mandamentos do rei da biblioteca (de programação)”


10m-Book#1 Livros
Você tem que estudar os melhores livros das melhores editoras, que são: AK Peters/CRC Press, Morgan Kaufmann, Addison Wesley, O’Reilly, Packt Publishing, The Pragmatic Bookshelf


10m-Polishop#2 Poltrona
Você tem que ter uma poltrona, uma poltrona confortável. E a poltrona massageadora que vende na Polishop é um mito né, um sonho de consumo de qualquer pessoa, que chama atenção, que toda mulher gosta.


10m-PersonalLibrary#3 Biblioteca pessoal
Quando você está na biblioteca pública ou da faculdade, você é mais um. Todo mundo quer ter sua biblioteca pessoal, é uma questão de “statis”, algo que todo leitor quer. Pode variar desde empilhar algumas caixas de feira e colocar seus livros lá dentro até ao infinito… e além, como alguns exemplos desse site aqui.


10m-YouveGotMail#4 Serviços exclusivos: Amazon e pequenas livrarias (contraditório…)
Na Amazon você cria sua própria wishlist, tem descontos exclusivos e até algoritmos que geram recomendações baseadas nas suas compras e itens vistos, assim como em pequenas livrarias que você tem atendimento mais humano e dependendo pode até se tornar amigo(a) do(a) dono(a).


10m-Tirinhas-DoisIdiotas#5 Integridade física: sua e dos livros
Ao ler um livro, é bom estar confortável em uma poltrona e estar num ambiente bem iluminado, pra manter sua integridade física. Sobre os seus livros, infelizmente, algumas pessoas acabam – por bobeira, acidente ou inveja – não cuidando dos livros que você emprestou, dos seus bens.


10m-Tea#6 Café ou chá
Vou ser muito sincero, eu gosto mais de tomar vodka, mas café e chá caem bem melhor pra uma leitura. E tem toda uma preparação com o coador, o pó, o aroma, colocar no fogo…


10m-Knuth#7 Clássicos
Outra coisa importante é você ter livros clássicos (The Art of Computer Programming, The Mythical Man-Month, Effective C++, …), de autores famosos (Knuth, GoF, Cormen, Stroustrup, Meyers, …), na sua biblioteca pessoal, isso com certeza agrega a tudo, aos seus estudos, sua formação, tudo.


10m-Estudar#8 Estudos
Não faz sentido você ter tudo aquilo ali e não estudar nem praticar. É como você licenciar uma game engine C++ e colocar um “programador HTML5″ pra programar.


Uma coisa que acho que é pesada pra falar: Eu já li bastante.

100m-Banheiro



10m-MarshallAmp#9 Música
As músicas que gosto de ouvir quando estou lendo um livro são: … Muitas vezes é difícil se concentrar na leitura ouvindo música =P.


10m-Kindle#10 Kindle
Quem tem biblioteca pessoal, tem que ter um Kindle. Se você não tem um Kindle, não é legal, você tem que ter, tem que ler, colocar seus mobi’s, livros…


Quem não queria sentar numa poltrona confortável, ler bem, estar numa biblioteca cheia de conhecimento, bebendo um chá ou cafezinho…?

Imagens:
Pessoal (#1, #3, #6, #9)
http://www.pronz.com.br (#5, #8)
http://www.polishop.com.br/14313_poltrona-massageadora-luxury/p (#2)
http://nomorepopcorn.wordpress.com/2011/01/19/shot-for-shot-the-shop-around-the-corneryouve-got-mail/ (#4)
http://www.computerhistory.org/fellowawards/hall/bios/Donald,Knuth/ (#7)
http://www.amazon.com.br/gp/feature.html?docId=1000841461&ie=UTF8 (#10)
http://reidocamarote.tumblr.com/ (gif)

Be Sociable, Share!

Análise de livro: Getting Started with C++ Audio Programming for Game Development (Packt Publishing)

BookCppAudioProgramming

Esse é um livro introdutório para desenvolvedores C++ (intermediário) que querem iniciar em programação de áudio, mais especificamente usando FMOD. O autor começa apresentando no primeiro capítulo alguns conceitos universais de áudio, como volume, pitch, frequência, bit depth e formatos de arquivos de áudio. Em seguida, introduz o FMOD e explica como adiciona-lo a um projeto (Visual Studio C++), como iniciar o FMOD, carregar e reproduzir áudio e verificar erros. Após essa introdução do FMOD, há um projeto para criar um simples gerenciador de áudio através de uma classe C++. No capítulo 3, o autor expande o gerenciador para incluir controle de áudio, isto é, playback, controle de volume, pitch, panning, agrupamento de canais.

Com o básico de áudio explicado, o autor parte para áudio 3D e como trabalhar com áudio posicional, reverb e efeitos no FMOD. Ao trabalhar com áudio posicional, o desenvolvedor precisa lidar com oclusão e obstáculos que afetam a maneira como o áudio é percebido pelo jogador. Este é um tópico que poderia ser explorado com mais detalhes pelo autor, pois ele comenta sobre o assunto em apenas duas páginas. O mesmo vale para efeitos via DSP (processamento de sinais digitais), que é comentado nas 3 últimas páginas do mesmo capítulo de áudio 3D.

A ferramenta FMOD Designer também é apresentada. É uma ótima ferramenta da Firelight Technologies (desenvolvedora do FMOD) para aqueles que são mais focados em design. O autor explica como criar eventos simples de som (como efeitos de passos e vidro quebrando), evento multi-trilha (passos interativos, motor de carro) e música interativa, além de como chamar os eventos via código. Para projetos maiores ou que precisam de algo além do controle básico de áudio, essa ferramenta é obrigatória (ou ao menos valerá muito a pena usa-la).

O último capítulo envolve programação de áudio em baixo nível, isto é, como trabalhar com os bytes de um arquivo de som digital – carregar, tocar, alterar propriedades, etc. Embora FMOD ainda seja usado para o controle de áudio, o leitor tem uma visão “por trás dos panos” sobre APIs de áudio de alto nível.

Com ~100 páginas, esse é um bom livro introdutório para desenvolvedores que não estão familiarizados com programação de áudio, principalmente porque não há muitos livros sobre o assunto (há alguns que focam em programação DirectSound/XACT, mas essas tecnologias parecem estar mortas -ou estão morrendo- e são apenas para plataforma Microsoft). É um livro de C++, mas desenvolvedores de outras linguagens (como C#) também podem se beneficiar do conteúdo, uma vez que o FMOD suporta outras linguagens. A decisão do autor em usar o FMOD é boa também: é uma tecnologia multiplataforma, suporta vários formatos de áudio e é adotado em vários jogos de sucesso, por empresas e game engines (como Unity e UE3). Eu já trabalhei em um jogo multiplataforma usando FMOD para áudio e os resultados foram muito bons.

Para iniciar com programação de áudio, acho que o conteúdo e tamanho do livro estão OK, embora o autor poderia se aprofundar mais em áudio 3D e efeitos via DSP (e incluir código de áudio 3D na classe gerenciadora de áudio; o código-fonte só está disponível para os capítulos 2, 3 e 6).

Vale a pena mencionar que o FMOD Studio não é discutido no livro e, para qualquer tarefa não relacionada a áudio (gerenciamento de janela, render e input), o autor usa o SFML (Simple and Fast Multimedia Library).

Gostaria de ver outro livro do autor/editora com assuntos mais avançados de programação de áudio, como mais detalhes sobre como trabalhar com áudio 3D (e suas implicações), efeitos DSP em tempo real, áudio dinâmico e performance. Seria bom também ver um projeto que inclui FMOD Designer (ou FMOD Studio) e código, não apenas exemplos no livro.

Be Sociable, Share!

Análise de livro: Windows Phone 8 Game Development (Packt Publishing)

No meu antigo blog, vez e outra fazia breves análises sobre livros de desenvolvimento de jogos e artbooks. Nesse novo blog, não cheguei a fazer nenhuma análise – até agora. Eu até poderia escrever sobre algum livro que tenho ou que comprei recentemente, mas… Bom, há alguns dias atrás, surgiu a oportunidade de eu escrever um review, pois a editora Packt Publishing me enviou a versão digital do Windows Phone 8 Game Development (Marcin Jamro) para avaliar. Espero que com essa análise, eu volte a escrever mais sobre livros.

BookWindowsPhone8GameDevelopment

Conforme a descrição do livro, este é um guia prático para desenvolvimento de jogos para Windows Phone 8. Diferente de alguns livros que apresenta um “Hello, World!” para cada tópico apresentado, o autor escolheu desenvolver o projeto de um jogo completo (apresentado no primeiro capítulo), que é incrementado a cada capítulo.

O autor mostra uma visão geral da plataforma Windows Phone 8, do ciclo de vida dos aplicativos, assim como das diferentes maneiras de desenvolver (managed, nativa e híbrida). A abordagem híbrida, usada no livro, me chamou a atenção, pois como desenvolvedor cross-platform acostumado com C++ (ou mesmo C#/XNA), acho interessante ter uma maneira mais fácil/rápida de criar a UI ao mesmo tempo em que é possível desenvolver nativo para performance e processamento mais pesado.

Nesse sentido, o livro usa um misto de C#, C++, C++/CX, XAML e Direct3D, algo que achei meio incomum. C# e XAML para UI, C++/CX e Direct3D para o core do jogo, com uma classe Direct3DInterop fazendo a comunicação entre código nativo e gerenciado.

A abordagem passo-a-passo é boa para iniciantes e há algumas dicas que podem economizar tempo de desenvolvedores com mais experiência (mesmo avançados que vêm de outras plataformas). Há um capítulo sobre o padrão de projeto MVVM (model-view-view model), aplicado ao jogo, e o último capítulo lida com a parte de publicação.

Sobre tópicos atuais, o livro trabalha com localização, mapas, geolocalização, web services e redes sociais (usando API’s do Facebook e Twitter). O jogo desenvolvido no livro também implementa leitor de RSS. Duas features que gostaria de ver rodando em aparelhos reais são realidade aumentada e reconhecimento de voz, pois pareceram ser fáceis de implementar.

Há duas coisas que poderiam ter no livro:
- Algumas features são implementadas só com código gerenciado: o autor poderia explicar brevemente como implementar nativamente ou dar direções (apesar que há alguns links no apêndice), ou mesmo implementar a versão nativa e disponibilizar no código-fonte do livro;
- Apesar de ser um livro de Windows Phone 8, poderia ter alguma discussão (ou comparação) sobre como cada feature do aparelho/SO está relacionado com os concorrentes (iOS e Android), pois atualmente é muito comum o lançamento de apps e jogos em diferentes SO’s e stores.

No geral, o livro cumpre o que promete e recomendaria para qualquer um que tem interesse em aprender a desenvolver jogos para Windows Phone 8.

Be Sociable, Share!

SBGames 2013, Post-mortem (Q&A)

Depois do último post-mortem, teve uma sessão de perguntas e respostas. Infelizmente a bateria do meu celular acabou e não foi possível gravar o final da sessão:

Renato Degiovani finalizou com algo como: “Se o seu jogo não está vendendo, o problema não é as pessoas, mas o seu jogo.”

Be Sociable, Share!

Quando alocação de memória falha (C++)

Talvez por costume com linguagem C e trabalhar com legacy code (alocando com malloc), já vi (e também fiz) isso em alguns projetos:

#include <iostream>

int main(int argc, char *argv[])
{
  const int MB = 1048576;

  char *mem = new char[2047 * MB];

  if (mem)
  {
    std::cout << "Almost 2GB of memory successfully allocated!" << std::endl;
    delete[] mem;
  }
  else
  {
    std::cout << "Bad allocation!" << std::endl;
  }
}

Verificar se a variável mem é válida após alocar memória é algo correto a se fazer, não? Quase. No código C++ acima, o else nunca será executado: quando os quase 2GB alocados acima são realmente alocados, o if é executado. Mas quando não é possível alocar a memória, o que ocorre é uma exceção (std::bad_alloc) e o else não é executado.

Poderia reescrever com um try-catch:

#include <iostream>

int main(int argc, char *argv[])
{
  const int MB = 1048576;

  try
  {
    char *mem = new char[2047 * MB];

    if (mem)
    {
      std::cout << "Almost 2GB of memory successfully allocated!" << std::endl;
      delete[] mem;
    }
  }
  catch(const std::bad_alloc &exception)
  {
    std::cerr << "Exception: " << exception.what() << std::endl;
    return 666;
  }
}

Ou então poderia alocar usando new(std::nothrow), que retorna um ponteiro null quando não é possível alocar memória:

#include <iostream>

int main(int argc, char *argv[])
{
  const int MB = 1048576;

  char *mem = new(std::nothrow) char[2047 * MB];
  
  if (mem)
  {
    std::cout << "Almost 2GB of memory successfully allocated!" << std::endl;
    delete[] mem;
  }
  else
  {
    std::cout << "Bad allocation!" << std::endl;
    return 666;
  }
}
Be Sociable, Share!