Sorteando: Unreal Tournament 3

February 16, 2010

Pessoal,

Depois de algumas sugestões pelo blog e por msn, eis que surge o primeiro sorteio daqueles 3 jogos que falei anteriormente. Para esse primeiro escolhi dar o Unreal Tournament 3 via Steam e para quem quiser participar basta fazer o seguinte:

Está vendo a foto aí em cima? (Clique na foto para aumentar) Pois bem, essa minha amiga quer porque quer um desenho dela esmagando o gato (reparem bem como ela está zipando metade do corpo dele haha). Pode ser realista, pode ser estilizado, digital, lápis, etc, vai do seu estilo ou idéia para o desenho.

O prazo para entrega é daqui um mês, ou seja, dia 16/03/2010, podendo se estender a data até que tenhamos pelo menos 4 desenhos (isto é, se até dia 16/03/2010 não tivermos 4 desenhos, vamos deixar o concurso rolando até termos no mínimo 4 desenhos). O vencedor será aquele cujo desenho minha amiga gostar mais.

Para participar, envie um link do seu desenho pelos comentários e -importante- não se esqueça de colocar um e-mail válido nos comentários para que eu possa entrar em contato com o ganhador. Esse e-mail só fica visível para mim.

(Montalvo, se você estiver lendo isso aqui, me desculpe, sei sua opinião sobre concursos. Pensei nesse sorteio mais como algo entre amigos e colegas internautas :))

Sorteando 3 jogos…

January 30, 2010

No último dia de 2008, resolvi guardar R$0,30 por dia durante um ano e com o valor total comprar um prêmio para um concurso ou coisa do tipo aqui no blog. Apesar de ultimamente escrever pouco aqui, eu não me esqueci disso.

Pois bem, o prêmio seria de aproximadamente R$110, mas ano passado comprei algumas coisas e percebi que fiquei com 3 jogos que já tenho ou que não iria jogar. São eles:

Half-Life 2, Unreal Tournament 3 e World of Warcraft Burning Crusade. Os dois primeiros custam 20 dólares cada no Steam e uma key do WOW:Burning Crusade está sendo vendido em média por R$45 no Mercado Livre. A soma dos 3 jogos dá mais que os R$110 que eu guardei ao longo do ano, mas isso não importa. O importante é que tenho esses 3 jogos que não vou jogar e como tinha dito ano passado que ia criar um concurso com prêmio, nada mais justo eu acho.

Mas até agora não pensei em nada, se vai ser um concurso, um sorteio aleatório, whatever. E nem como os vencedores serão escolhidos (a única coisa que pensei é que quero que 3 pessoas diferentes ganhem um dos jogos).

Então peço para vocês leitores enviarem sugestões (pelos comentários) de como posso elaborar o sorteio dos jogos. E se puderem divulgar em outros blogs e sites também, seria bacana.

Conto com suas colaborações!

Feliz 2010, atrasado…

January 26, 2010

Como podem perceber, faz meses que não escrevo nada no blog. Estamos em 2010 e somente no fim de janeiro é que resolvo escrever. Não que eu não quisesse ter feito isso antes, mas…

Para quem está curioso em saber o que ando fazendo e porque não estou atualizando o blog periodicamente, vamos a um resumo de um resumo do semestre anterior:

- Continuo trabalhando na Glu Mobile, agora como Game Developer do Studio Sao Paulo;
- Ajudei na etapa final do War mobile, jogo oficial do tabuleiro da Grow, lançado em outubro do ano passado;
- Voltei a dar aulas, dessa vez em nível universitário;
- Perdi várias horas todos os dias na porcaria de trânsito de SP, com isso, consegui preencher mais um sketchbook de ~90 páginas com rabiscos feitos enquanto dirigia;
- Quando sobrou um tempo livre, tentei dedica-lo a minha vida pessoal para que eu não ficasse doido;
- Nesse pouco tempo livre que me sobrou, resolvi reservar algumas horinhas para jogos do WiiWare e indies para PC (ah sim, ano passado ganhei um Wii e pretendo indicar alguns jogos aqui);
- Abri uma conta no twitter (http://twitter.com/andkbr), mas acho que escrevo lá uma vez por mês apenas;
- Nesse exato momento, estou trabalhando em casa puto da vida porque minhas últimas builds pararam de funcionar. Ok, nesse exato momento estou escrevendo isso aqui, mas apenas porque dar um “Rebuild solution” do projeto leva meia hora…

Infelizmente, começamos o ano com uma notícia muito triste: o falecimento em 12/01/2010 do Marcelo Carvalho, ex-presidente da Abragames, sócio da Devworks e que estava ajudando a galera da Hoplon no Taikodom. Foi uma notícia inesperada. A indústria nacional perde um grande apaixonado pela área, um dos primeiros profissionais que conheci quando ingressei na área e que sempre esteve disposto a ajudar e compartilhar seu conhecimento.

Em breve espero escrever mais por aqui…

XNA: minha classe Custom Font (usando bitmap fonts)

July 15, 2009

Nos últimos dois meses tive a honra e prazer de assistir algumas aulas como convidado do curso de XNA da Alpha Channel ministrado pelo prof. Willians Monteiro. Embora tenha participado dos Gamefests e lido uma ou outra coisa sobre a tecnologia, foi a primeira vez que tive contato com o XNA na prática e posso dizer que gostei bastante, tanto é que sempre que há um tempinho livre eu “brinco” com o XNA.

Em uma das aulas ele explicou que no XNA você pode criar e usar fontes através do SpriteFont, mas um porém é que nesse caso você usaria apenas as fontes do sistema e isso claro é uma restrição chata, já que geralmente a tipografia usada nos jogos vai de acordo com a direção de arte. Depois que ele comentou sobre um dos métodos SpriteBatch::draw(), resolvi criar a classe abaixo para escrever textos usando uma fonte bitmap.

No meu exemplo, criei a seguinte imagem:

Como você pode perceber pelos comentários no código, a implementação não ficou lá essas coisas, fiz algo rápido pra aprender. Há features a serem melhoradas e adicionadas (veja algumas sugestões no todo list)… Mas enfim, você captou a idéia né?

Obs.: há pequenas diferenças entre o código original e a listagem abaixo por causa da formatação html. Sugiro baixar o original aqui (incluindo a imagem da fonte).

/*
 * XNA Custom Font Class
 *
 * Written by
 * Andre Kishimoto
 * http://www.tupinihon.com
 *
 * June 20th, 2009
 *
 *
 * Use a bitmap font to draw strings instead of a Sprite Font.
 *
 * Usage example:
 * 

    public class [YourClass] : Microsoft.Xna.Framework.Game
    {
        // …

        // Declare a new CustomFont
        CustomFont customFont;

        protected override void LoadContent()
        {
            // …

            // Create customFont and define its properties
            customFont = new CustomFont(Content, “customfont”, 20, 20, 4, 12);
        }

        protected override void Draw(GameTime gameTime)
        {
            // …
            spriteBatch.Begin();
            // …

            // Draw string using CustomFont class
            customFont.drawString(spriteBatch, “Using CustomFont class”, new Vector2(10, 50), Color.White);

            // …
            spriteBatch.End();
        }

        // …
    }

 *
 * In this example, there is an Asset called customfont (CustomFontExample.png), where each character is 20×20. Its content is as follows:
 * ABCDEFGHIJKL
 * MNOPQRSTUVWX
 * YZ
 * 0123456789
 *
 * As you can see, it has 4 rows and 12 columns, where the last row is used only for numbers (see the code to understand this structure)
 *
 *
 * Todo list (or, things you can try on your own while studying XNA development)
 *
 * - Include proportional typeface fonts (different width for each character)
 * - Add special characters such as ç, ã, ô, é and so on (e.g. used in Spanish and Portuguese strings)
 * - Optimize code
 * - Remove assumption of numbers to be at last row in the bitmap font
 * - Redesign font bitmap scheme
 *
 */

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

public class CustomFont
{
    private Texture2D font;

    private int width;
    private int height;
    private int row;
    private int col;

    public CustomFont()
    {
    }

    public CustomFont(ContentManager content, String name, int w, int h, int row, int col)
    {
        load(content, name, w, h, row, col);
    }

    public void load(ContentManager content, String name, int w, int h, int row, int col)
    {
        font = content.Load<Texture2D>(name);
        this.width = w;
        this.height = h;
        this.row = row;
        this.col = col;
    }

    // I believe this code is not optimized
    public void drawString(SpriteBatch spriteBatch, String text, Vector2 pos, Color color)
    {
        Rectangle currPos = new Rectangle(0, 0, width, height);
        int currIndexY = 0;

        char[] tempText = new char[text.Length];
        tempText = text.ToUpper().ToCharArray();

        // Loop through the whole string, char by char, get correct char location inside the bitmap font and draw it
        for (int i = 0; i < tempText.Length; i++)
        {
            // We assume 0-9 numbers to be at last row in the bitmap font
            if (tempText[i] >= ‘0′ && tempText[i] <= ‘9′)
            {
                currPos.X = (tempText[i] - ‘0′) * width; // Calculate position of the character inside the bitmap font
                currIndexY = row - 1; // Note: fourth row is used for numbers only (in this example)
            }
            else if (tempText[i] >= ‘A’ && tempText[i] <= ‘Z’)
            {
                currPos.X = (tempText[i] - ‘A’) * width; // Calculate position of the character inside the bitmap font
                // Get a value between [0..2] (in this particular example, where there are 3 rows and 12 columns)
                // Note: fourth row is used for numbers only (in this example)
                // Used to get the correct mapping inside the bitmap font
                currIndexY = (currPos.X / (col * width));
            }
            else if (tempText[i] == ‘ ‘)
            {
                // If it is a blank space, just advance imaginary cursor and process next character
                pos.X += width;
                continue;
            }
            else
            {
                // If character is not found, simply advance imaginary cursor and process next character
                pos.X += width;
                continue;
            }

            // Get correct row inside the bitmap font
            currPos.Y = currIndexY * height;

            // Small adjustment to get correct column inside the bitmap font
            if (currPos.X >= col * width)
            {
                currPos.X -= currIndexY * (col * width);
            }

            // Draw the current character
            spriteBatch.Draw(font, pos, currPos, color);

            // Advance imaginary cursor position in X (we assume every character has the same width)
            pos.X += width;
        }

        tempText = null;
    }
}

Download do código original e imagem da fonte: clique aqui.

Dicas (ou pontos de vistas) sobre reuniões

July 9, 2009

Quem nunca participou de reuniões, seja para um trabalho acadêmico ou na profissão? Seguem alguns pontos que aprendi com muitas reuniões e que, ao meu ver, quando aplicadas podem gerar melhores resultados.

1) Tenha certeza de que todos os participantes saibam com antecedência o assunto da reunião.
Assim, os participantes não são pegos de surpresa e podem ir mais preparados para a reunião. Isso é importante principalmente quando o tópico da reunião exige que os participantes lembrem-se de certas informações (comuns ou não no dia-a-dia) ou façam análises sobre determinado assunto. Você ganha tempo na reunião, uma vez que os participantes levam anotações prévias sobre o tópico, e obtém respostas/informações melhor elaboradas.

2) Marque reuniões com antecedência.
Embora diversas reuniões aconteçam “daqui 5 minutos”, o ideal é marcar uma reunião com antecedência para evitar a ausência de participantes, o mau humor e, novamente, melhor preparo dos mesmos. Citei o mau humor porque uma reunião em cima da hora quebra a agenda de muitas pessoas, necessitando alterações de planos. Há quem não liga para isso, mas da minha experiência, isso é raro. Quando uma reunião é marcada antecipadamente, as pessoas alocam um espaço na agenda para a mesma ou avisam sobre a impossibilidade de participar. Com esse “buffer”, pode ser possível remarcar a data/hora da reunião.

3) E lembre os participantes sobre a reunião.
Nem todas as pessoas são bem organizadas como você e nem todos usam o Outlook para marcar os compromissos. Um lembrete aos participantes um pouco antes da reunião vale a pena.

4) Evite longas reuniões.
Geralmente, uma hora é o tempo máximo para que uma reunião seja produtiva, para que os participantes não percam o foco da reunião. Quando as pessoas começam a divagar nos assuntos, a comentar sobre futebol, novela, ou qualquer outra coisa que não seja pertinente à reunião, é bem provável que elas já não estão mais com cabeça para a reunião. Quando uma reunião é longa a ponto de precisar de pausa para um café, considero-a “fail”.

5) Limite a quantidade de tópicos por reunião.
Não apenas para que ela não se torne longa, mas porque quanto maior a quantidade de tópicos, pior para as pessoas se lembrarem das informações. Melhor quebrar uma reunião de horas e vários tópicos em pequenas reuniões com uns 2, 3 pontos a serem abordados, em dias diferentes, para as pessoas poderem processar melhor todas as informações.

6) Caso seja necessário ler documentos, envie-os antes da reunião.
Fazer as pessoas lerem documentos no meio da reunião quando elas poderiam ter recebido e lido os mesmos antes é perder tempo de reunião. Evite esse tipo de problema enviando os documentos para todos os participantes alguns dias (ou horas) antes da reunião. Nem todos irão ler os documentos com antecedência, mas haverá alguns que já chegarão com o assunto da reunião em mente.

7) Convoque apenas as pessoas que realmente precisam estar na reunião.
Não convoque a equipe inteira para discutir um assunto que é pertinente ao grupo A e outro assunto que interessa somente ao grupo B. Ao invés disso, marque duas reuniões, específicas para cada grupo. Todos agradecem.

E você, possui alguma dica ou ponto de vista para compartilhar? Sinta-se à vontade em comentar!

Oportunidades na Glu Mobile

June 23, 2009

Procurando oportunidades na área de jogos em São Paulo? A Glu Mobile está com 3 posições em aberto (game developer, porting engineer e QA tester). Para informações dessas oportunidades e como aplicar, visite este link.

Você tem plano de saúde?

May 18, 2009

(semi off-topic) Vendo colegas de trabalho doentes e eu mesmo precisando ir ao pronto-socorro nessas semanas que se passaram, além de toda a história da gripe suína… Você já analisou o quão importante é ter um plano de saúde? Afinal, sem saúde ou com a saúde prejudicada você não faz quase nada.

Você paga mensalmente qualquer plano de saúde e pode vir aquele pensamento de que “nunca usei e não vou precisar usar”. Então deve ser perda de dinheiro. Isso até você realmente precisar, e isso é algo que não conseguimos prever.

Já viu quanto custa uma consulta médica, mesmo que você fique meros 40 segundos na sala do médico? (sim, já fiquei esse tempo e fiquei pasmo ao saber que uma consulta dessas no particular custaria R$120 à vista)

Pense nisso.

Olha que Blog Maneiro! e Meme 161

April 12, 2009

Post rápido, porque senão sabe-se lá quando eu iria escrever isso, mesmo me sentindo na obrigação de fazê-lo (enfim, estou tirando um peso na consciência hehe). São duas coisas que a famosa dona do blog de nome nonsense para seu conteúdo - Disk Chocolate - escreveu há tempos atrás: Olha que blog maneiro! e Meme 161. Quebrando as regras de memes e da iniciativa sobre blogs maneiros, apenas venho citar que ela me indicou em ambos (muito obrigado!) e vou redigir aqui duas frases para o Meme 161:

“If you must write macros complicated enough to require comments, it is wise to use /* */ commments because C preprocessors that do know about // comments are sometimes used as part of C++ tools.”

“But humans emotions have more than a logical, rational component; they are tightly coupled to behavior and feelings.”

O primeiro vem do clássico The C++ Programming Language: Special Edition (3rd Edition), pelo próprio criador da linguagem C++, Bjarne Stroustrup. Já o segundo é do ótimo livro Emotional Design: Why We Love (or Hate) Everyday Things, do Donald Norman. A regra do meme era transcrever a quinta frase da página 161 em sua íntegra, mas não sabia se contava trechos de código e perguntas de uma palavra como frases completas :P. Na dúvida, ficam essas frases mesmo.

Rabisco no cartão de estacionamento

April 6, 2009

“A puta pelada do estacionamento quebrou seu coração?”, Tati pergunta. Não não, draw.random() com lápis e marcador no cartão de estacionamento :P.

Gamedev é… (07)

April 6, 2009