Sauerbraten: Um Minigame em CubeScript


CubeScript:
 O Sauerbraten, como alguns outros jogos Cube, possui sua própria versão de uma "linguagem" interna, chamada Cubescript. Cubescript é responsável por fazer funcionar Binds e Menus, mas não se limita a isso, pois todo comando que existe no jogo (e são muitos) podem ser usados/executados simultaneamente com ações em Cubescript. Para cuidar dos Menus, são utilizados os comandos Gui, que são responsáveis pela parte gráfica do Cubescript, como botões, textos, tabs...

O Minigame:
 Utilizando apenas Cubescript, consegui criar um pequeno minigame que roda diretamente em um Gui menu dentro do Sauerbraten, com direito a Sprites, ações (correr, pular, idle...) e cenários.







Sprites:
 Para criar os Sprites, eu fiz várias capturas do playermodel Ironsnoutx10k em vários momentos, andando para trás, frente, pulando, parado e morrendo.

Animações

 Retirando o fundo dessas imagens, salvando em png e renomeando todas em números crescentes começando por 1, consegui fazer um loop entre elas facilmente. Funciona com um comando que é executado a cada X milissegundos, e que a cada vez adiciona um numero em uma variável (sprite), e esse numero é restaurado para o valor inicial quando chega a um limite, o limite é a quantidade de sprites. Com essa variável chamada sprite que se atualiza com um numero crescente a cada X tempo, e com as imagens utilizando números crescentes como nome, basta agora mostrar essas imagens no Gui menu, e para isso utilizei o comando Guiimage.

Guiimage procura imagens em um arquivo customizável, e o mostra no menu com uma escala também customizável. Com Concatword (que serve para juntar valores das variáveis/comandos, removendo os espaços) o Guiimage irá procurar pelas imagens com o nome $sprite.png ($ serve para pegar o valor da variável, nesse caso o valor de sprite, que são números que se atualizam em ordem crescente), e aí ficou mais ou menos o seguinte:

guiimage (concatword "pasta/para/imagens" $sprite ".png") [ ] 5

Note que $sprite está no lugar do nome real da imagem, e logo em seguida está o formato da imagem, os colchetes é onde deve ser adicionado o comando que deve ser executado ao clicar na imagem com o mouse, nesse caso nenhum comando será executado, o numero no final é o tamanho da imagem. Como Guiimage está dentro de um Gui menu, ela se atualizará sempre, e sempre vai procurar por imagens com o nome do valor de $sprite. Fácil, em?.

Cenários:
 Os Cenários usam um sistema semelhante as sprites: A cada vez que o jogador chega em uma certa posição na direita, um numero é adicionado a uma variável, e cada numero representa uma imagem, o diferente aqui é que se o jogador for pelo lado esquerdo, a cada limite um numero deve ser removido da variável. O Sprite do personagem também deve ser setado totalmente na direita, se o player foi pra esquerda na cena anterior, ou totalmente para a esquerda, se o player foi para a direita na cena anterior.

Passando atrás de caixa do cenário:

 Eu tive essa ideia após tirar a screenshot do mapa, e percebi que ficaria estranho o personagem passar ali na frente, e então recortei somente a caixa e a salvei separadamente. A imagem da caixa é separada, e está acima da layer do personagem e do cenário (layers dependem da posição do código em seu Gui menu, quanto mais baixo, mais em cima o item ficará), tentei alinhar ela perfeitamente com a imagem original. O cenário que ela aparece é o numero 5, por tanto ela fica invisível em todos os números diferentes do 5, isso não é muito complicado de fazer utilizando if.


Se movendo e pulando:
 Utilizando Guistrut, Guialign e Guilist, é possível alinhar qualquer item em qualquer local de um Gui menu (não irei explicar a função de cada um quando usados juntos, por funcionar diferente dependendo do que deseja fazer). Guialign simplesmente alinha o conteúdo em um lado do menu, funciona como o text-align em html (guialign -1 [] esquerda, guialign 0 [] centro, guialign 1 [] direita).

Guilist alinha todos os itens em uma mesma linha, por exemplo um Guititle e um Guitext serem mostrados na mesma linha.
Guistrut adiciona espaços entre os itens, e é ele que faz a mágica acontecer.
 Utilizando esses 3 comandos em conjunto consegui fazer o sprite se mover sempre para um lado, ou até pular. Também utilizei eles para alinhar os textos da tela, os ícones e a caixa.

Ícones/botões de movimento:
Os botões também são imagens, com ações dentro dos colchetes (explicado acima) que simplesmente tornam variáveis como pode_andar e pode_pular true ou false.

Ideias futuras:
Pretendo adicionar inimigos e itens colecionáveis (scores), também um inventário e animação de morte. Algumas casas dos cenários serão "visitáveis".

Problemas:
 O jogo só funciona dentro do Sauerbraten, claro. Se alguém um dia criar um "fork" separado, onde só exista a versão do Sauer de CubeScript e gui menus, tenho certeza que funcionará (hmm isso me deu uma ideia...).
Imagens ficam vermelhas ao serem selecionadas com o mouse, mesmo sem ação nenhuma aplicada a elas.


Não há grandes problemas, tudo é possível de se fazer (me arrisco a dizer que, com uma gambiarra de maptitle, é possível até fazer um jogo multiplayer!). Possibilidade de aplicar valores a variáveis, mover itens na tela, mostrar imagens e tocar efeitos sonoros já faz ser possível criar vários tipos de games...

O jogo ainda não tem objetivos, por isso não vale a pena colocar para download por agora.

Dica: Criei um canal no Discord para a galera compartilhar scripts e dúvidas, chama-se CubeScript Guys, o invite está aqui.



Comentários

Cube BR - 2017/2018   [<>]
Todos os direitos são... não, aqui não tem direitos.