| Uma das principais características deste tipo de jogo é a sua forma de “contar uma estória”. Diferentemente dos adventures de interpretação (onde a ação do jogador é definida por uma frase), nos jogos point & click toda a narrativa está atrelada a ações claramente definidas no espaço e no tempo do jogo. Como a proposta deste e-book é criar um adventure neste estilo, vamos definir logo de saída o tema. Isso não impede aqueles que desejarem, seguir construindo um modelo próprio. Mantendo a tradição, o jogo irá se passar numa selva e envolverá uma excursão exploratória a uma caverna, cuja entrada está disfarçada em uma grande árvore.
O objetivo não é apenas mostrar a parte técnica de programação do jogo, mas mostrar como construir um enredo que envolva o jogador e o conduza a uma aventura cheia de mistérios e surpresas. Pronto para a jornada? Então vamos... Em primeiro lugar, abra o Delphi e crie um formulário novo, com as seguintes medidas:
Em seguida crie um TPanel, que chamaremos de Tela, com as seguintes propriedades:
Essa será a tela de apresentação do jogo, ou visor, ou seja lá que nome a gente possa dar a ela. Será portanto a representação gráfica do que o jogador estaria vendo. Optei pelo TPanel e não por uma TImage por razões técnicas: o panel é bem mais eficiente para mostrar gráficos, além de servir como suporte para “tocar” arquivos AVIs. E é claro que vamos querer passar filminhos em nossos jogos, não é mesmo? Mas não vamos “desenhar” direto no panel, então criamos um buffer (TBitmap) para usarmos como tela de trabalho. Na área de variáveis globais, colocamos a sua definição:
Criamos o evento OnCreate, do form1, para definir as propriedades do buffer:
E, no embalo para não esquecer depois, criamos o evento OnDestroy, para liberar a memória usada para o buffer
Agora só falta uma procedure para transferir o conteúdo do buffer para o panel usado como visor (MostraTela):
Recapitulando: criamos um visor para o jogo (Tela) e um buffer (Buff) para usar como rascunho, ou seja, tudo aquilo que queremos mostrar ao jogador vai para esse buffer e no final do processo chamamos a procedure MostraTela para transferir esse conteúdo para o visor. Assim aceleramos ao máximo as operações gráficas e evitamos os famigerados flicks de tela. Como eu disse “visor da posição”, podemos então imaginar que por alguma mágica compucabalistica o que o jogador vê é o cenário à sua frente e para que tal cenário realmente exista precisamos de um método de criação. Usaremos scripts de texto, para definir tudo o que for possível de ser feito em nosso jogo. O componente mais óbvio para scripts de texto é o TMemo, então criamos um com as seguintes propriedades:
Obviamente que, num jogo finalizado, não queremos que o jogador veja o script, mas por enquanto isso não é importante. Pelo contrário: nos permitirá analisar e entender melhor o que está acontecendo em nosso sistema. Tendo o script, precisamos agora de alguma forma “executá-lo”. A minha proposta é para algo bem simples: cada linha será um comando e portanto, basta termos um indicador de linha em uso e pronto. Uma procedure definida para isso faria todo esse trabalho:
Note que a procedure vai “percorrer” o script linha a linha e usar uma função (DecodeLin) para decodifica-la (reconhecer o comando ou instrução e fazer o que for preciso). Se ao retornar da função, encontrarmos o valor –1, então o script prosseguirá para a próxima linha. Se for outro valor, então a execução do script salta para a linha indicada. Com vocês então a função DecodeLin:
Ela começa simplesmente ignorando os espaços em branco que encontrar na linha. Assim pode-se usar identação para deixar o script mais claro. Em seguida obtém-se o comando (Cmd), que é definido pela primeira palavra da linha – o primeiro espaço encontrado é portanto um delimitador de campo. Tendo retirado o Cmd da linha, basta identifica-lo e construir a programação necessária. Por exemplo: vamos criar um comando no script para transferir o conteúdo do buffer para o visor Tela. Já temos a procedure, então, basta adotar uma palavra para servir como comando. Proponho “refresh”:
Mas isso não vai provocar nenhum resultado palpável (ou visível), então vamos criar mais um comando. Um que limpe o buffer com uma determinada cor. Digamos “clear”. A sintaxe do comando seria portanto “clear FFFFFF” onde FFFFFF é uma cor definida como um hexadecimal, representando os três componentes RGB (Red, Green, Blue) da cor:
Para ver isso tudo funcionando, coloque no Memo1 o seguinte texto:
Crie um botão em algum lugar do form1 e coloque no evento OnClick dele a ordem para executar o script:
Agora basta clicar no botão e ver... nada acontecer. Há um bug conceitual nessa estrutura e o desafio é descobri-lo. A correção do mesmo poderá provocar um segundo bug e daí seremos obrigados a tomar decisões drásticas. Mas é assim sempre que criamos sistemas interpretativos, ou seja, eles irão se comportar em função de um segundo nível de programação, que em nosso caso são os scripts. Portanto, estude, pense e analise com calma o que está exposto aqui. Use a lista de discussão da TILT ou o workshop virtual para tirar suas dúvidas. |
|||||||||||||