terça-feira, 6 de outubro de 2015

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

Antes de começar gostaria de dizer que fiquei impressionado com os games que a galera me mostrou feitas com base nas primeiras liçoes e muita pesquisa. e mais uma vez desculpem por deixar o blog criando teia de aranha...

Essa lição vai falar de ARMAS !!! vamos começar com algumas rotinas de tiro e espada.

Além disso melhorias nos códigos para diminuir bugs do que foi mostrado até aqui.

Atenção nos comentários em laranja !

Arquivo licao4.sh

#!/bin/bash
setterm -cursor off
# Adicionei esse trap para desfazer as alterações no final da execução.
trap "stty $(stty -g);setterm -cursor on" EXIT
#Esse stty serve para não imprimir na tela o que é digitado, também adicionei o time para limitar o tempo de leitura do teclado.
stty -echo time 2 || exit $?
clear
echo "Use a w s d para movimentar e j para atirar k para usar espada"
x=0
y=1
a=0
#Adicionei as variáveis t, e i para controle das armas
t=0
i=0



#Na variável inimigo coloquei um numero que será a localização do inimigo, em seguida imprimi o inimigo e o personagem na tela.
inimigo="1030"
tput cup 1 0
echo -n "o"
tput cup `echo $inimigo | cut -c1-2` `echo $inimigo | cut -c3-4`
echo -n "X"

until [ $a = q ];do
read -s -n 1 a
######## Leitura do Teclado ####
#Adicionei a pequena função limpa, para não ficar utilizando o comando clear, deixando os frames menos bugados, por conta dessa mudança tive que adicionar aquele stty para não ficar sujando a tela com caracteres conforme os botões são pressionados. profissionalmente isso se chama buffering ou algo assim...
limpa(){
tput cup $y $x
echo -n " "
}

if [ $a = a ];then
#sempre que eu aperto o botão de movimento primeiramente ele limpa o vulgo "buffer"...
limpa
let "x = x - 1"
fi
if [ $a = d ];then
limpa
let "x = x + 1"
fi
if [ $a = w ];then
limpa
let "y = y - 1"
fi
if [ $a = s ];then
limpa
let "y = y + 1"
fi
#Aqui temos o botão k para uso da espada... muita calma nessa hora reparem que pego o valor de x, somo 1 para exibir a espada na frente do personagem "o", além disso coloquei a localização do inimigo na variável i, subtraindo 1 para melhorar a observação do evento...
if [ $a = k ];then
let "t = $x + 1"
let "i = $inimigo - 1"
#Se a espada atingir o inimigo, eu imprimo o inimigo com metade da espada no peito... tem que ter imaginação.... espero 2 segundos e termino a execução...
if [ "$y$t" -eq $i ];then
tput cup $y $t
echo -n "+X"
tput cup 1 1
echo "Voce Matou o Inimigo na Espada! Ele Morreu !"
sleep 2
a=q
#Se não acertar imprimo a espada inteira na frente do personagem, e espero 0.5 segundos imprimo o buffer em branco no mesmo lugar... seria ele demorando um pouco para guardar a espada pq ela é pesada...
else
tput cup $y $t
echo -n "+-"
sleep 0.5
tput cup $y $t
echo -n "  "
fi
fi
#O botão j é uma arma que atira, começa com o mesmo principio da espada mas o tiro tem que ir longe então usei mais um until para fazer ele correr na tela até certo ponto ou até atingir o inimigo.
if [ $a = j ];then
let "t = $x + 1"
let "i = $inimigo - 1"
#Tiro correndo na tela reparem que imprimindo " -" vou apagando o anterior e fazendo ele avançar
until [ $t -ge 100 ] || [ "$y$t" -eq $i ];do
tput cup $y $t
echo -n " -"
#usei o sleep pois dependendo do super computadores atuais seria difícil ver o tiro....
sleep 0.003
let "t = t + 1"
done
#Esse if verifica se o tiro acertou o inimigo
if [ "$y$t" -eq $i ];then
tput cup 1 1
echo "Voce Matou o Inimigo na Bala! Ele Morreu !"
sleep 2
a=q
fi
#no final da rotina de tiro eu limpo a bala que sobrou na tela.
tput cup $y $t
echo -n "  "
fi

################################

######## Inimigo ###############
#Coloquei esse exemplo de colisão com o inimigo se vc encostar nele vc morre.
if [ "$y$x" = "$inimigo" ];then
clear
setterm -cursor on
echo "VC encostou no inimigo ! voce morreu !"
echo FIM
exit
fi

################################

##### Movimento da Bolinha #####
#Mantive esse movimento mas também pode ser transformado em função e embarcado nos ifs de movimento.
tput cup $y $x
echo -n "o"
done
################################

clear
echo FIM


-----fim----

Atenção na próximas estarei começando a falar de scrolling, cores, movimento para os inimigos, listeners, e chegaremos em um pequeno game para jogar online via sessão de putty ou rede.