quarta-feira, 17 de outubro de 2012

Lição 3 - Programação de Jogos em ShellScript


A lição 3 também é interessante e fundamental. com o conceito da lição 3 já é possível sair por ai programando algum joguinho. tentei deixar esse assunto o mais simples possível. estarei falando de 2 coisas.

1) Mapas
2) Colisões

Mapas
Para um jogo fazer sucesso é interessante ter um mecanismo de mapa bem simples, que possa até possibilitar ao jogador criar um mapinha para se divertir. no meu exemplo o mapa pode ser desenhado em um simples arquivo de texto.

Colisões
Colisões são praticamente algo que fazem as coisas acontecerem. exemplo, bater o carrinho, levar um tiro, pegar algo, etc...

Vamos começar desenhando um mapa, crie um arquivo com o nome map.layout se quer usar outro nome ok... mas lembre-se disso na parte do código.

Desenhe o que quizer no mapa
Exemplo
nome do arquivo: map.layout
conteúdo:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
X                                                       X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

tudo que não for uma area em branco será considerado uma parede no joguinho 

agora vamos ao código
nome do arquivo: game.sh
conteudo:
#!/bin/bash
setterm -cursor off
a=0
m=0
n=0
C=0
x=2
y=2
tput cup 0 0
cat map.layout
tput cup $y $x
echo -n "o"

until [ $a = q ];do
read  -n 1 a
clear
cat map.layout
######## Leitura do Teclado ####
if [ $a = a ];then
let "m = x"
let "n = y + 1"
C=`cat map.layout | awk "NR == $n" | cut -c"$m"`
if [ -z $C ];then
let "x = x - 1"
fi
fi

if [ $a = d ];then
let "m = x + 2"
let "n = y + 1"
C=`cat map.layout | awk "NR == $n" | cut -c"$m"`
if [ -z $C ];then
let "x = x + 1"
fi
fi

if [ $a = w ];then
let "m = x + 1"
let "n = y"
C=`cat map.layout | awk "NR == $n" | cut -c"$m"`
if [ -z $C ];then
let "y = y - 1"
fi
fi

if [ $a = s ];then
let "m = x + 1"
let "n = y + 2"
C=`cat map.layout | awk "NR == $n" | cut -c"$m"`
if [ -z $C ];then
let "y = y + 1"
fi
fi

################################
tput cup $y $x
echo -n "o"
done
###############################
clear
setterm -cursor on
echo FIM






Comentários do código
1)
x=2
y=2
#iniciei x e y com o valor 2, para nao começar com o player em uma parede.
2)
tput cup 0 0
cat map.layout
#imprimi o mapa
3)
if [ $a = a ];then
let "m = x"
let "n = y + 1"
C=`cat map.layout | awk "NR == $n" | cut -c"$m"`
if [ -z $C ];then
let "x = x - 1"
fi
fi
# A cada movimento eu verifico no mapa se tem alguma coisa naquela posição.
lembrando que o tput trabalha de 0 até ...
o awk e cut trabalham de 1 até ...

então usei o let com algumas variáveis para adaptar, mesmo assim ficou bem simples e leve.