Tutorial de SugarCube

principal

Um tutorial para criar jogos de Twine usando o SugarCube.

Baixe o tutorial aqui: Tutorial de SugarCube

Sumário

Introdução

Tutorial básico

  1. Como usar o SugarCube no Twine 2
  2. Criando, editando e linkando passagens
  3. Usando variáveis
  4. Publicando seu jogo

Tutorial avançado

  1. Etiquetas
  2. Estilo da fonte e cor do fundo
  3. A barra lateral
  4. Incluindo imagens
  5. Incluindo áudio
  6. Aleatoriedade
  7. Criando uma caixa de texto
  8. Criando uma caixa de diálogo
  9. Criando novas macros
  10. Matrizes
  11. Melhorando as práticas de programação
  12. Usando o modo de depuração

Conclusão

Introdução

Existem alguns tutoriais de Twine em Português disponíveis na internet, mas a maioria deles se foca no formato padrão, chamado Harlowe. Como o Twine é de código aberto, existem diferentes formatos criados para ele, cada um com uma linguagem e funcionalidades próprias. Embora não seja tão diferente do Harlowe, o formato SugarCube oferece algumas vantagens:

  1. Uma barra lateral facilmente modificável.
  2. Um sistema de “save e load” embutido.
  3. Mais facilidade para criar seus próprios scripts.
  4. Mais opções na depuração de bugs.
  5. Sua interface está totalmente traduzida para Português.

Sendo assim o SugarCube é uma boa opção para quem pretende criar jogos um pouco mais sofisticados usando o Twine. Este tutorial é dividido em duas partas: O tutorial básico é passo-a-passo de como criar um jogo simples usando o SugarCube. O tutorial avançado apresenta algumas noções de programação de jogos no Twine.

O que é Twine?

Twine 2 é uma ferramenta de código aberto para criação de narrativas interativas não-lineares. Pode ser usado para criar jogos de texto, também chamados de ficções interativas no estilo “livro-jogo”, como é chamado no Brasil. O programa salva o arquivo final no formato HTML, como nas páginas de internet. O resultado é um hipertexto no qual clicamos numa opção dada pelo jogo para determinar o andamento da narrativa, que pode ter diversos desdobramentos e finais diferentes, além de regras, variáveis e condições. Por ser em formato HTML, o arquivo funciona em qualquer navegador sem precisar ser baixado ou instalado. Pode ser jogado no PC ou no celular e em qualquer sistema operacional. Também pode incluir imagens e sons e outros recursos possíveis na estrutura HTML, CSS e JavaScript.

O que é SugarCube?

SugarCube é um dos formatos mais usados no Twine. Ele é mais flexível que o formado padrão, facilitando a criação de novas funcionalidades.

Um dos diferenciais do SugarCube é oferecer uma barra lateral facilmente modificável, que por padrão mostra o nome da história e apresenta dois botões: um para salvar e carregar o progresso do jogo, e outro para recomeçar a história. No tutorial avançado mostrarei como modificar a barra lateral do SugarCube e adicionar novos elementos. Veja nas imagens abaixo uma comparação entre a aparência do Harlowe e do SugarCube:

harlowe
Exemplo de jogo no formato Harlowe
sugarcube
O mesmo jogo no formato SugarCube

Como usar o SugarCube no Twine 2

Primeiro, visite o site twinery.org, baixe e instale o Twine 2, ou use online. Se decidir usar online, lembre-se que os arquivos do seu jogo ficam salvos no cache do navegador, e não no seu dispositivo, então tome cuidado e exporte os arquivos sempre que puder. Após iniciar o programa, você verá uma tela assim (a interface do Twine 2 está disponível em Português):

tela 1

Começando uma nova história

Os projetos no Twine 2 são chamados de histórias. Clique no botão + História para iniciar um novo projeto. Escreva “Tutorial” no título, clique em +Adicionar e você será conduzida para a tela do projeto, onde você pode visualizar as “passagens”, que são as partes da sua história. O modo como essas partes se conectam é o que cria a estrutura da sua história.

Mudando para o formato SugarCube

Como dito na introdução, o formato padrão do Twine para novas histórias é o Harlowe. Para selecionar o SugarCube como formato padrão para suas novas histórias, clique na opção Formatos da tela inicial, selecione a última versão do SugarCube e feche a janela.

seleção formato

Você também pode mudar o formato de uma história já criada a qualquer momento, mas se você já escreveu algum código nela, é possível que aconteçam alguns erros na hora de jogar. Por isso é importante selecionar o formato antes de começar a escrever o código. Para mudar o formato da sua história, clique no nome da história, no canto inferior esquerdo, e depois na opção Mudar formato da história, como indicado na imagem abaixo:

formato

Mudando o idioma do SugarCube para Português Brasileiro

Se você jogar ou testar sua história agora, verá que a interface do SugarCube está em Inglês. Os botões da barra lateral são Saves e Restart, e todo resto das mensagens de interface também estará em Inglês. A tradução para Português do Brasil está disponível, mas é preciso adicionar a tradução via código.

Primeiro, visite o site do SugarCube e baixe o arquivo da tradução na seção Downloads, subseção Localizations. Ou simplesmente clique aqui pra baixar. É um arquivo .zip, e o conteúdo é o arquivo pt-BR.min.js, que é uma extensão para código do JavaScript. Você precisa abrir esse arquivo com um editor de texto (como o Bloco de Notas), e copiar o texto inteiro (Ctrl+A seguido de Ctrl+C). Agora clique no nome da história e na primeira opção, Editar JavaScript da História e cole o conteúdo (Ctrl+V). Feche a janela e pronto. Agora os botões da barra lateral são Salvar e Recomeçar, e todo resto da interface estará em Português.

Criando, editando e linkando passagens

Quando você começa uma nova história, ela já tem uma passagem inicial. Essa passagem é marcada com o símbolo inicio que indica que é nela que o jogo começa.

tela 2

Mova o mouse sobre a passagem e você verá as seguintes opções:

op

Da esquerda para direita, cada ícone representa:

  1. Excluir a passagem
  2. Editar a passagem
  3. Testar a passagem
  4. Mais opções

Você também pode clicar duas vezes na passagem para editá-la.

Ao clicar em “…” (Mais opções), você verá:

op 2

A primeira opção, Start Story Here serve para mudar a passagem onde começa o jogo. As outras são para mudar o tamanho da representação da passagem na tela de projeto. Essa mudança não altera em nada na execução do jogo e serve apenas para você organizar e visualizar melhor a estrutura da sua narrativa.

Edite a passagem e você verá uma nova janela. A primeira linha é para o nome da passagem, a segunda para etiquetas (ver tutorial avançado), e o resto é o texto da passagem, aquilo que aparece na tela do jogo quando a passagem é acessada, com exceção dos códigos. Mude o nome da passagem para Entrada do Teatro e o texto para algo assim:

Você está em um salão espaçoso, esplendidamente decorado em vermelho e dourado, com lustres brilhantes no alto. Além da porta para a rua, há portas à direita e à esquerda.

[[Sair do teatro]]
[[Entrar na porta da direita]]
[[Entrar na porta da esquerda]]

 

Note os [[colchetes duplos]]. Todo texto que você coloca entre colchetes duplos se torna um link para outra passagem. Se uma passagem com o nome especificado entre os colchetes ainda não existe, ela será criada automaticamente. Feche a janela de edição da passagem agora e você verá algo assim:

tela 3

Você acabou de criar três novas passagens, e a passagem Entrada do Teatro está “linkada” a elas, como indicam as setas no diagrama.

Agora edite a passagem chamada Sair do teatro e adicione o seguinte texto:

Você acabou de chegar e, além disso, o tempo lá fora parece que está piorando.

[[Voltar|Entrada do Teatro]]

Note a barra vertical | entre Voltar e Entrada do Teatro. O texto à esquerda da barra é o que vai aparecer na tela do jogo (o link clicável), e o texto à direita é o nome da passagem que está sendo linkada. Agora feche novamente a janela de edição e perceba o que mudou:

tela 4

Você não criou nenhuma passagem nova, mas adicionou um link de retorno para a mesma passagem, indicado pela seta com direcional duplo. Clique em Jogar, no canto inferior direito, e teste o que acontece se você tenta sair do teatro. O jogo não permite, nos obrigando a voltar para a entrada. Todo jogo é limitado por barreiras desse tipo, elas indicam as coisas nas quais deveríamos nos focar. No caso, é fazer algo dentro do teatro.

Agora, experimente excluir a passagem Entrar na porta da direita, selecionando a opção para excluir, ou selecionando a passagem (clicando nela uma vez) e apertando a tecla Delete. Você verá algo assim:

tela 5

O link para a passagem continua existindo, mas a passagem não foi encontrada pelo programa, então a seta leva a um X. Na execução do jogo, o link continuará existindo, mas terá uma cor diferente, e se clicado, levará a uma mensagem de erro. Agora clique em +Passagem, no canto inferior direito, e adicione uma nova passagem ao jogo. Toda passagem começa sem nenhum link. Clique e arraste essa nova passagem para o lugar onde ficava a passagem que você deletou. Agora edite-a e escreva Entrar na porta da direita no nome dela (exatamente como antes, observando as maiúsculas e espaços). Aproveite e adicione o seguinte texto:

Está escuro como breu.

[[Voltar|Entrada do Teatro]]
[[Esperar]]

Feche a janela e veja o que aconteceu. O link da primeira passagem voltou a funcionar, se tornou um link de via dupla, e outra passagem foi adicionada.

tela 6

Edite a passagem Esperar e adicione o seguinte para criar um final trágico para a história, fazendo uma referência ao clássico jogo Zork:

Você é devorade por um Grue. Você deveria saber que ficar no escuro é perigoso em jogos de texto.

Fim.

A história não está completa, mas já tem um final possível. Agora você sabe criar, editar e linkar passagens no Twine. Mas que tal tornar as coisas um pouco mais interessantes?

Usando variáveis

Na programação, variáveis são valores que um programa armazena quando executado. Aprender a manipular variáveis no Twine permite criar jogos mais complexos e interessantes.

Para começar, crie uma nova passagem (+Passagem) e mude o nome dela para StoryInit (observe o I maiúsculo). Deixe essa passagem de lado, ela não vai linkar com nenhuma outra. Ela serve para declarar variáveis que serão usadas no jogo. No texto da passagem, escreva:

<<set $capa = 1>>

Os caracteres << e >>, indicam uma macro, como são chamados os comandos no SugarCube. A macro set serve para fixar um valor numa variável. Ela é seguida do nome da variável, $capa, o operador lógico de identidade, = ou to, e um valor numérico ou alfabético. No caso, vamos criar uma variável numérica com valor igual a 1. O cifrão ($) deve sempre ser o primeiro caractere de uma variável permanente. As variáveis temporárias, que são “esquecidas” quando se acessa outra passagem, devem começar com “_“. Para nossa história, usaremos apenas uma variável permanente.

As variáveis não aparecem no texto da passagem durante o jogo a menos que especifiquemos isso. O valor da variável é exibido no texto da passagem no lugar do nome da variável. O valor da variável também pode ser exibida por meio da macro <<print $variável>>. Quando não é o caso, o valor das variáveis fica nos “bastidores” da história, mas pode ser rastreado no modo de depuração (ver o tutorial avançado).

Agora experimente adicionar o seguinte texto na passagem Entrar na porta da esquerda:

As paredes desta pequena sala nitidamente já estiveram cheias de pequenos ganchos para pendurar roupas, embora agora apenas um pequeno gancho de bronze permaneça afixado. <<if $capa == 0>>Sua capa de chuva está pendurada no gancho.<</if>>

<<if $capa == 1>>[[Pendurar sua capa de chuva no gancho|Entrar na porta da esquerda][$capa to 0]]<</if>>
[[Voltar|Entrada do Teatro]]

Estamos agora usando a macro if, uma macro de controle para criar uma condicional lógica. Como toda macro do SugarCube, ele precisa estar entre << e >>, mas diferente de set, ela pode conter outras macros dentro dela, e o final precisa ser indicado por um <</if>>. Tudo que está entre o <<if>> e o <</if>> só acontece se a condição, definida pelo if for verdadeira. Como definimos a variável $capa com o valor 1, inicialmente a frase “Sua capa de chuva está pendurada no gancho.” não irá aparecer no texto da passagem, mas a opção “Pendurar sua capa de chuva no gancho” irá. Quando essa opção é selecionada, a passagem é repetida (ela está linkada a si mesma), e a variável $capa é mudada para o valor 0. Links com essa estrutura são chamados de setter links, porque eles “setam” uma variável para um valor no momento que o link é clicado. Agora o texto indicando que a capa está no gancho irá aparecer no texto da passagem. O operador == ou is, é usado nesse caso ao invés do = ou to. O comando “if $capa == 0” poderia ser traduzido como “se a capa é igual a 0, então…“.

Há muitas outras macros que você pode usar, set e if são apenas os mais básicos. Para conhecer outras macros e funções, consulte a documentação do SugarCube (em Inglês).

Finalizando a história

Você agora pode criar o final “vitorioso” dessa história. Edite novamente a passagem inicial, e mude a segunda opção, [[Entrar na porta da direita]], para:

<<if $capa == 1>>[[Entrar na porta da direita]]<<else>>[[Entrar na porta da direita|Teatro]]<</if>>

A macro else é um complemento do if. Ela indica o que acontece quando a condição NÃO é verdadeira: se a capa for 1, vá para a passagem Entrar na porta da direita, se a capa NÃO for 1, vá para a passagem Teatro. O texto do link, visível na tela do jogo, porém, continua o mesmo. Também é possível usar a macro elseif se você quiser encaixar mais de uma condição: se a condição não for verdadeira, então veja se esta é. Mas lembre-se de sempre fechar com /if.

Edite a nova passagem, Teatro, com o seguinte texto:

O teatro, muito mais rústico do que você imaginaria depois da opulência da entrada, está completamente vazio, aparentemente em reforma. Parece haver algum tipo de mensagem escrita na serragem que cobre o chão.

[[Ler a mensagem]]
[[Voltar|Entrada do Teatro]]

Agora edite a passagem Ler a mensagem com sua mensagem final, por exemplo:

A mensagem na serragem diz:

VOCÊ VENCEU

Pronto, você fez um jogo simples, com dois finais possíveis. Veja como ficou a estrutura final:

final

Note a seta de looping na passagem Entrar na porta esquerda. Isso acontece porque ela está linkada para ela mesma.

Agora a história precisa de um nome melhor do que “Tutorial”, não é mesmo? Clique no nome da história, no canto inferior esquerdo, e depois na opção Renomear História. Mude o título da história para “A Capa da Escuridão”, e pronto, você tem uma história completa. Aliás, essa história foi baseada no Cloak of Darkness, um site que compara diferentes ferramentas de criação de ficção interativa. Teste sua história para ver se não acontece nada inesperado.

No mesmo menu, clique em Publicar para Arquivo para salvar seu jogo no formato HTML. Você pode enviar esse arquivo para outras pessoas, ou publicar na internet. Elas não precisam ter o Twine instalado para jogar sua história, apenas de um dispositivo com navegador de internet, mesmo que não esteja conectado na internet. Você pode abrir o arquivo do seu jogo e modificá-lo em outro local usando o Twine. Basta usar a opção Importar de Arquivo na tela inicial.

Para baixar o arquivo do jogo criado nesse tutorial, clique aqui: A Capa da Escuridão.zip.

Publicando seu jogo

Quando criar seu próprio jogo, eu recomendo postá-lo no itch.io. Isso possibilita jogar direto do site, sem fazer o download. E desde 2019, o itchio também está disponível em Português.

Depois de incluir no itch.io, considere também incluir no IFDB (Interactive Fiction Database). Descubra o IFID (número de identificação único para cada ficção interativa) do seu jogo na opção Estatísticas da História, e liste seu jogo na maior base de dados de ficções interativas do mundo, para que possa ser facilmente encontrado por outras pessoas. Infelizmente o IFDB não se encontra disponível em Português, mas é importante incluir as ficções interativas brasileiras nele.


Tutorial avançado

Agora vamos dar algumas dicas para quem pretende se aprofundar um pouco mais no SugarCube e no Twine.

Etiquetas

Como você viu no tutorial básico, toda passagem tem um espaço para adição de etiquetas, entre o título e o texto. Para adicionar uma etiqueta, basta clicar em +Etiqueta e digitar um nome para ela. Você também pode selecionar uma cor para sua etiqueta, clicando nela e selecionando uma das 7 cores disponíveis. Etiquetas tem três funções básicas:

  1. Destacar passagens importantes ou incompletas para fácil visualização e revisão.
  2. As passagens marcadas com uma mesma etiqueta fazem parte de uma classe, e podem ser modificadas em conjunto, como vamos demonstrar mais adiante.
  3. Algumas etiquetas especiais são usadas para modificar a função da passagem. Por exemplo, a etiqueta bookmark marca uma passagem como um ponto para o menu Pular para…, sobre o qual falaremos adiante. A etiqueta widget indica que a passagem será usada pela macro <<widget>> para definir uma nova função. Também falaremos mais sobre isso depois.

Estilo da fonte e cor do fundo

Para mudar a fonte e o fundo da sua história, você vai precisar conhecer alguns códigos de CSS (“Cascading Style Sheets” ou “Folhas de Estilo em Camadas”), que definem a apresentação de documentos em HTML. Clique no nome da história e depois na opção Editar Folha de Estilos da História, e adicione o seguinte:

body {
background-color: white;
color: black;
font-family: Futura,Impact,Helvetica,sans-serif;
font-size: 125%;
}

A palavra body indica a camada que estamos editando, que no caso se refere a todo o texto do jogo. As instruções para alterar uma camada devem ficar entre { } e são separadas por ponto e vírgula. Se você quiser alterar somente um elemento da página, aqui vão alguns nomes de camadas importantes:

  • a modifica o texto de links todos os links clicáveis.
  • .passage a modifica os links da passagem (sem mudar os da barra lateral).
  • a :hover modifica os links apenas quando você passa o mouse sobre eles.

Você pode modificar apenas passagens marcadas com uma determinada etiqueta, por exemplo:

.escuridão {
background-color: black;
color: white;
font-size: 100px;
}

Isso muda apenas as passagens com a etiqueta “escuridão”. Note que é preciso adicionar um ponto antes do nome da etiqueta, assim: .escuridão

Mudando o estilo de apenas algumas palavras na passagem

Você também pode mudar o estilo de trechos específicos do texto de uma passagem usando o marcador de estilo personalizado, @@. Por exemplo, se você substituir a palavra “FIM” na passagem Esperar pelo seguinte código, ela vai aparecer em vermelho.

@@color:red;FIM@@

Outros marcadores de estilo são:

//Itálico//
''Negrito''
__Sublinhado__
==Riscado==
^^Sobrescrito^^
~~Subscrito~~

Você também pode usar * no começo de uma linha para criar listas não numeradas e # para criar listas numeradas.

Cores

Como deve ter visto, background-color se refere à cor do fundo e color à cor da fonte. Você pode usar o nome padrão de uma cor (em Inglês) ou os códigos hexadecimais da cor. Para uma lista completa de nomes e códigos de cores, visite color hex.

Fontes

O atributo font-family indica uma lista de fontes o Twine vai tentar usar na história ou trecho da história, em ordem de prioridade. É preciso indicar os nomes corretos da fontes que pretende usar. Nem todas as fontes estão disponíveis em todos os computadores. Veja uma lista de fontes seguras aqui. Você também pode importar uma fonte do Google Fonts. Por exemplo, para importar a fonte Liu Jian Mao Cao para sua história, você teria que adicionar a seguinte linha no COMEÇO da Folha de Estilos:

@import url('https://fonts.googleapis.com/css?family=Liu+Jian+Mao+Cao&display=swap');

E então incluir uma linha como “font-family: Liu Jian Mao Cao, cursive;” na camada em que deseja usar a fonte.

O atributo font-size indica o tamanho da fonte. Você pode usar várias medidas de tamanho, como % (porcentagem), px (pixels) ou vmin (tamanho relativo à menor medida da tela).

Para mais efeitos e estilos de texto, consulte este site.

A barra lateral

Como padrão, a barra lateral do SugarCube se parece com isso:

barra

Note as imagens no topo da barra. As duas primeiras, acima do título, são botões de navegação, para retornar ou avançar para passagens já visitadas. Há também um botão para recolher/expandir a barra lateral. Se você marcar alguma passagem com a etiqueta bookmark, haverá um terceiro botão de navegação entre os outros dois, com um símbolo de um raio. Clicar nele abre o painel de pontos de salto, que permite retornar rapidamente para pontos marcados com a etiqueta bookmark que já tenham sido visitados.

Removendo a barra lateral inteiramente

Se você não quer uma barra lateral de modo algum no seu jogo, você pode incluir a seguinte linha na passagem especial StoryInit, criada no tutorial básico:

<<run UIBar.destroy()>>

A macro <<run>> é usada para executar algumas funções do SugarCube. Outras funções da barra lateral que podem ser usadas do mesmo modo:

  • UIBar.hide() esconde a barra, sem mudar o texto da passagem de posição.
  • UIBar.show() mostra novamente a barra se estiver escondida.
  • UIBar.stow() apenas recolhe a barra. É possível expandir ela de novo com o botão.
  • UIBar.unstow() expande a barra se ela estiver recolhida.

UIBar.isHidden()UIBar.isStowed() podem ser usadas com a macro if para verificar se a barra está escondida ou recolhida. Elas retornam valores booleanos, ou seja, true se for verdadeiro, false se for falso. Assim, o seguinte código recolhe a barra caso ela esteja expandida, e expande caso ela esteja recolhida:

<<if UIBar.isStowed()>><<run UIBar.unstow()>><<else>><<run UIBar.stow()>><</if>>

Se pretende usar a barra lateral ativamente na sua história, há várias coisas que você pode fazer com ela. Por exemplo:

Modificando elementos da barra lateral

Assim como você viu na seção Estilo da fonte e cor do fundo, você pode modificar o estilo de cada elemento da barra lateral usando as seguintes camadas na Folha de Estilos:

  • #ui-bar é a barra lateral por inteiro.
  • #story-title é apenas o título da história na barra lateral.
  • #menu são os itens do menu da barra lateral.
  • #menu-item-saves é apenas o item Salvar do menu.
  • #menu-item-restart é apenas o item Recomeçar do menu.
  • #ui-bar-tray são todos os botões do topo da barra.
  • #ui-bar-toggle é apenas o botão de recolher/expandir.
  • #ui-bar-history são apenas os botões de navegação.

Se você quer remover algum elemento da sua barra, basta adicionar display: none na camada desse elemento. Por exemplo, para remover os botões de navegação, o código seria:

#ui-bar-history{
display:none
}

Você também pode usar os comandos

Adicionando elementos na barra lateral

Você pode adicionar elementos na sua barra lateral criando novas passagens e dando os seguintes nomes especiais a elas:

  • StoryBanner pode ser usado para incluir uma imagem ou texto logo acima do título da história. Veja mais adiante como adicionar imagens.
  • StorySubtitle adiciona um subtítulo para a história, com a versão atual por exemplo. O subtítulo fica logo abaixo do título.
  • StoryAuthor é usado para adicionar o nome da pessoa que escreveu a história logo abaixo do título ou subtítulo.
  • StoryCaption é usado para adicionar informações gerais sobre a personagem ou o andamento da história. Você pode incluir variáveis nessa passagem, como por exemplo uma lista objetos no inventório da personagem. A exibição só é atualizada quando uma passagem é carregada.
  • StoryMenu adiciona novos botões personalizados no menu, logo acima de Salvar. Adicione links no texto da passagem e cada linha com um link criará um botão correspondente no menu da barra lateral.
  • StoryShare adiciona um botão chamado Compartilhar no menu, logo abaixo de Recomeçar. Inclua links para o website ou página do jogo nessa passagem. Ao clicar no botão, abre-se uma lista dos links. Por exemplo, o link [[Caos e Amor|https://janosbiro.itch.io/]] leva para a minha página no itchio.

Para editar o conteúdo desses elementos, basta editar o texto da passagem correspondente.

Incluindo imagens

Se você quer que sua história tenha elementos audiovisuais além de texto, isso também é possível usando o Twine 2.

Incluindo imagens

Você pode incluir uma imagem no seu jogo usando o código [img[texto alternativo|endereço da imagem]]. O texto alternativo é mostrado caso a imagem não carregue, e é um atributo opcional. Por exemplo, você pode incluir o seguinte código no TOPO do texto da passagem Entrada do Teatro:

[img[https://contrafatual.files.wordpress.com/2019/11/46832-fr_5.jpg]]

Você também pode usar o seguinte código:

<img src="https://contrafatual.files.wordpress.com/2019/11/46832-fr_5.jpg" width="500" height="300" alt="Entrada do Teatro">

A imagem será exibida como demonstrado abaixo:

tela img.jpg

A vantagem de usar o segundo código entre < > é que ele permite redimensionar o tamanho da imagem. O atributo scr se refere à URL (endereço web) da imagem. O atributo width e height são, respectivamente, comprimento e altura da imagem em pixels. Você pode usar um % para indicar que o valor é relativo ao tamanho da tela. O atributo alt é o texto alternativo (opcional). Se você não indicar comprimento e altura, a imagem carregará no seu tamanho completo, que pode não caber na tela.

Por padrão, as imagens seguem o alinhamento à esquerda, como o texto. Você pode centralizar as imagens na tela adicionando o seguinte código na sua Folha de Estilos:

img {
display: block;
margin-left: auto;
margin-right: auto;
}

Você pode usar a camada img para formatar as imagens com outros efeitos de CSS que se apliquem a elementos gráficos.

Você também pode usar imagens armazenadas no seu computador. Basta inserir o endereço do arquivo de imagem no seu dispositivo, o qual pode ser absoluto ou relativo à pasta na qual o arquivo do jogo está sendo executado. Por exemplo, se o arquivo da imagem acima estivesse na mesma pasta do arquivo sendo executado, o comando seria:

<img src="46832-fr_5.jpg" width="500" height="300" alt="Entrada do Teatro">

Você também pode usar GIFs animados nas imagens, mas observe que eles demoram mais tempo para carregar.

Não é recomendado usar imagens às quais você não possui direitos, ou endereços de sites que você não controla. Considere citar a fonte das imagens nos créditos do jogo.

Fontes sugeridas de imagens gratuitas: Public Domain Pictures, Pexels, e StockSnap. Para mais recursos específicos para jogos, incluindo gráficos e sons, veja Open Game Art e os recursos gratuitos disponíveis no itchio. O site Ezgif também é muito útil para criar e editar GIFs animados.

Usando imagens como links

Você pode usar imagens como links clicáveis com o código [img[texto alternativo|endereço da imagem][link]]. Por exemplo, o código para usar a imagem acima como link para a passagem Sair do teatro seria assim:

[img[46832-fr_5.jpg][Sair do teatro]]

A imagem clicável também pode ser um setter link, ou seja, pode modificar uma variável ao ser clicada, por exemplo:

[img[46832-fr_5.jpg][Sair do teatro][$capa to 0]]

Você também pode usar macros mais complexas a partir do click na imagem usando a macro <<link>>. Por exemplo:

<<link [img[46832-fr_5.jpg][Sair do teatro]]>><<if $capa is 0>><<set $capa to 1>><</if>><</link>>

Incluindo áudio

Para incluir áudio nos seus jogos, é preciso antes carregá-los no cache da página adicionando a macro <<cacheaudio “ID da faixa” “endereço do arquivo de áudio”>> na passagem StoryInit. O melhor formato para arquivos de áudio no Twine é o formato .ogg. Para carregar um arquivo chamado test.ogg, que está na mesma pasta do arquivo do jogo, adicione o seguinte código na passagem StoryInit:

<<cacheaudio "teste som" "test.ogg">>

O endereço do arquivo pode ser da internet também. Para tocar o áudio durante o jogo, use a macro <<audio “ID da faixa” play>> em qualquer passagem, EXCETO na inicial. Por limitações da engine, o áudio não toca logo na primeira passagem. Você pode contornar esse problema criando uma passagem inicial que serve de “capa” para a história, com um link para iniciar de fato a história, e então tocar o áudio que você quer a partir do link ou da outra passagem. Por exemplo:

<<audio "teste som" play>>

O ação play é somente um dos argumentos disponíveis para a macro audio. Outros argumentos úteis:

  • fadein inicia a reprodução da faixa no volume mais baixo e sobe para o mais alto no intervalo de 5 segundos.
  • fadeout inicia a reprodução da faixa no volume mais alto e desce para o mais baixo no intervalo de 5 segundos.
  • goto passagem leva para a passagem com o nome especificado quando a reprodução da faixa terminar.
  • loop repete a faixa ao terminar normalmente.
  • mute silencia o volume da faixa sem alterar o nível do volume geral.
  • pause pausa a reprodução da faixa. Ela recomeça do ponto onde pausou se houver outro comando para tocar.
  • stop termina a reprodução da faixa. Ela começa do começo se houver outro comando para tocar.
  • time segundos define o tempo de reprodução atual da faixa para o número especificado de segundos, de 0 (início) até a duração máxima.
  • unloop deixa de repetir a faixa.
  • unmute deixa de silenciar a faixa.
  • volume nível define o volume da faixa para o nível especificado, de 0 (silencioso) a 1 (mais alto). Por exemplo, 0.5 é 50% do volume máximo.

Você também pode usar esses argumentos em grupos de faixas. Os grupos pré-definidos são:

  • :all todas as faixas.
  • :looped as faixas em repetição.
  • :muted as faixas silenciadas.
  • :paused as faixas pausadas.
  • :playing as faixas que estão tocando.

Note que todo grupo de áudio começa com dois pontos e precisa estar entre aspas no código da macro. Assim, o código para abaixar o volume de todas as faixas para 30% seria:

<<audio ":all" volume 0.3>>

As faixas são executadas quando a passagem é carregada. Você pode atrasar a execução de uma faixa de áudio usando a macro <<timed segundos>>. Por exemplo:

<<timed 2s>><<audio "teste som" play>><</timed>>

Isso faz com que o áudio leve 2 segundos para tocar depois da passagem ser carregada.

Para baixar músicas gratuitas e efeitos sonoros para usar no seu jogo eu recomendo: Incompetech e Freesound.

Aleatoriedade

Você pode usar a função either() para criar uma lista de expressões e selecionar uma delas aleatoriamente. Por exemplo:

<<print either("Bom dia!", "Boa tarde!", "Boa Noite!")>>

O resultado é uma dessas três frases, escolhida aleatoriamente.

Você pode usar a função either() em conjunto com a macro <<set>> para definir o valor de uma variável aleatoriamente, e então usar a macro <<if>> para definir eventos aleatórios. Por exemplo:

<<set $frase to either("Bom dia!", "Boa tarde!", "Boa Noite!")>>\
<<if $frase is "Bom dia!">>\
O porteiro me desejou bom dia, embora seja noite.
<<elseif $frase is "Boa tarde!">>\
O porteiro me desejou boa tarde, embora seja noite.
<<elseif $frase is "Boa Noite!">>\
O porteiro me desejou boa noite, e eu respondi: Boa noite.
<</if>>

Note que a barra invertida “\” é usada para evitar criar quebras de linha desnecessárias.

Você também pode usar a função random(min, max) para gerar números aleatórios mais rapidamente. Por exemplo, random(2, 12) vai retornar um valor de 2 a 12, e random(1, 12) vai retornar um valor de 1 a 12. O valor mínimo pode ser omitido, e nesse caso será considerado como 0. Por exemplo, random(12) vai retornar um valor de 0 a 12. Você também pode usar operações matemáticas, como por exemplo:

<<set $resultado to random(1, 6) + random(1, 6) + random(1, 6)>>
Você joga 3 dados, e o resultado é <<print $resultado>>

Criando uma caixa de texto

Além de clicar em links com o mouse, talvez você queira que a pessoa escreva algum texto usando o teclado. Você pode fazer isso com a macro <<textbox “$variável” “padrão” “passagem”>>. O seguinte exemplo cria uma caixa de texto para o nome da personagem, que será salvo na variável $nome, e ao pressionar enter, carregará uma passagem chamada Começo do jogo. O código seria assim:

Qual o seu nome? <<textbox "$nome" "Escreva seu nome" "Começo do jogo" autofocus>>

Note o termo autofocus no final da macro. Ele é opcional e serve para que sua caixa de texto ganhe foco automático quando a passagem carregar, ou seja, o cursor vai estar automaticamente na caixa de texto. De outro modo, seria preciso clicar na caixa antes de editá-la. Declare a variável $nome na passagem StoryInit com <<set $nome to “”>> para evitar erros. O valor “Escreva seu nome” é o padrão, e vai aparecer inicialmente na caixa de texto. Se você quer uma caixa de texto inicialmente vazia, use “” como padrão. O link para carregar uma nova passagem também é opcional.

Criando uma caixa de diálogo

É possível criar uma janela de aviso ou exibir uma informação durante o jogo sem afetar a área de texto principal. Por exemplo, o seguinte código cria uma janela com o título “Aviso” e a mensagem “Isso é um jogo.“, que aparece no centro da tela, com efeito de esmaecimento:

<<run Dialog.setup("Aviso"); Dialog.wiki("Isso é um jogo."); Dialog.open()>>

Veja como ela se parece no jogo:

aviso

Para fechar a mensagem, basta clicar no X ou em qualquer lugar fora da caixa de diálogo.

Você pode adicionar o texto de uma passagem inteira na janela usando os métodos Story.get() e .processText(). Por exemplo, o código abaixo exibe a passagem Sair do teatro na janela:

<<run Dialog.setup("Aviso"); Dialog.wiki(Story.get("Sair do teatro").processText()); Dialog.open()>>

Note que, nesse caso o link carrega a passagem na tela principal do jogo, mas não fecha a janela da caixa de diálogo. Para isso acontecer, seria preciso incluir uma instrução <<run Dialog.close()>> no dentro da macro <<link>>, assim:

<<link [[Voltar|Entrada do Teatro]]>><<run Dialog.close()>><</link>>

Criando novas macros

Finalmente, você pode criar uma macro customizada usando a macro <<widget>>. Suponha que você criou um código relativamente grande, envolvendo uma ou mais macros, que você quer usar várias vezes durante a história. A melhor opção é criar uma passagem com a etiqueta widget. Escolha o nome que quiser para essa passagem, ela não será linkada com nenhuma outra. No texto dessa passagem é onde ficam armazenadas suas macros personalizadas. Você pode criar, por exemplo, uma macro para determinar se um ataque acertou o alvo, e quanto dano ele causa. Crie uma macro chamada ataque usando o seguinte código na passagem:

<<widget "ataque">>\
<<set $at to (random(6) + $args[0])>>\
<<set $def to (random(6) + $args[1])>>\
<<set $res to ($at - $def)>>\
<<if $res > 0>>\
<<set $dano to random(1, $args[2])>>\
Você acertou! Causou $dano de dano!
<<else>>\
Você errou!
<</if>>\
<</widget>>

Em qualquer outra passagem, quando quiser determinar se um ataque acertou não, e o dano provocado, você pode usar apenas o código <<ataque 3 2 4>>, por exemplo, que seria substituído, no carregamento da passagem, pela frase de acerto e dano, ou de erro. Os três números que vem depois do nome da macro são os argumentos ($args[0], $args[1] e $args[2]), que representariam, nesse caso, os modificadores de ataque, de defesa, e o dano máximo. Você pode incluir quantos argumentos quiser, numéricos ou alfabéticos. Você pode também usar variáveis nos argumentos, como por exemplo <<ataque $força $escudo $arma>>.

Matrizes

Como você viu no exemplo acima, algumas variáveis podem guardar mais de um valor usando um só nome. Essas variáveis são chamadas de matrizes (ou arrays), são coleções de valores separados por um índice (index), que é representado pelo número entre [ ]. Antes de usar uma matriz, é necessário declará-la na passagem StoryInit. Por exemplo:

<<set $itens to []>>
<<set $baú to ["um escudo", "uma espada"]>>

Na passagem StoryCaption, por exemplo, você pode adicionar o seguinte código, que lista os itens que a personagem está carregando:

Você está carregando:
<<if $itens.length > 0>>\
<<= $itens.join(", ")>>.\
<</if>>

O sufixo .length indica a extensão (tamanho) da sua matriz. Inicialmente ela está vazia, a extensão é 0, e nada será mostrado. Mas quando adicionarmos algo, os itens serão exibidos separados por uma vírgula e um espaço. Já a matriz $baú tem duas instâncias, que representam o conteúdo de um baú. Quando a personagem abre o baú e pega os itens contidos nele, use o seguinte código:

Você abre o baú e encontra <<= $baú.join(" e ")>>.\
<<set $itens[0] to $baú.deleteAt(0)>>\
<<set $itens[1] to $baú.deleteAt(0)>>

O sufixo .deleteAt está sendo usado aqui para mover o conteúdo de uma matriz para outra matriz. Quando o jogo carregar outra passagem, a lista de itens da personagem vai ser atualizada e exibir o seguinte:

Você está carregando:
um escudo, uma espada.

Como todos os membros de $baú foram removidos, a extensão dessa matriz agora é 0, e a extensão de $itens é 2.

Você também pode usar a macro <<for>> para preencher ou esvaziar rapidamente uma matriz com muitos membros. Por exemplo:

<<for _i to 0; _i < $baú.length; _i++>>\
<<set $itens[_i] to $baú[_i]>>\
<</for>>\
<<set $baú to []>>

Esse código irá copiar todo o conteúdo de $baú para $itens. A última linha apaga o conteúdo de $baú, reiniciando a matriz. Você também poderia usar o código:

<<set $itens to $itens.concat($baú)>>

O sufixo .concat copia todo conteúdo de uma matriz para outra matriz. Os novos membros são adicionados na última posição válida, sem sobrepor os já existentes. Você também pode adicionar um novo membro individualmente, com o código:

<<run $itens.push("uma espada")>>

Ou remover um item pelo nome:

<<run $itens.delete("uma espada")>>

E você pode mostrar um membro aleatório da matriz usando:

<<print $itens.random()>>

Melhorando as práticas de programação

Agora que você sabe criar jogos mais complexos, seria interessante utilizar uma ferramenta melhor para escrever seu código. O editor de texto do Twine não oferece muitas opções e pode te deixar na mão caso precise manipular muitas linhas de código. Eu sugiro usar o Notepad++. Ele é um editor de texto capaz de reconhecer diversas linguagens de programação, incluindo SugarCube. Para instalar as definições do SugarCube no Notepad++, clique aqui para baixar o arquivo twine_sugarcube.xml, abra o Notepad++, e clique em Linguagem no menu principal, depois em Defina sua linguagem seguido de Importar, e selecione o arquivo.

Usando o modo de depuração

Quanto mais complexo o código, mais bugs tendem a aparecer. Para publicar um jogo com menos bugs é preciso testá-lo bastante. O SugarCube disponibiliza um modo de depuração (botão Testar) que oferece algumas opções interessantes para encontrar bugs chatos. Ao testar um jogo, abra a aba de depuração clicando no retângulo com um símbolo de inseto, no canto inferior direito. Você verá algo assim:

testar

A opção Vigiar, quando ligada, mostra em tempo real o valor das variáveis incluídas na sua lista, para que você possa acompanhar o que está acontecendo com elas enquanto joga. A opção Adicionar serve para selecionar e adicionar variáveis da lista. Você também pode clicar na “varinha mágica” para incluir todas as variáveis na lista, ou na “lixeira” para apagar todas as variáveis da lista. Para remover uma variável de cada vez, clique no x vermelho ao lado do nome da variável, quando a lista estiver aberta.

A opção Visualizações, quando ligada, mostra o código da passagem. Diferente de apenas mostrar o código inteiro, essa opção mostra apenas informações cruciais na tela, exibindo detalhes apenas quando passamos o mouse por cima. Isso ajuda na visualização da história e do código ao mesmo tempo.

Finalmente, Virar (que deveria ser “Turnos”, foi um erro de tradução) permite “voltar no tempo” mais facilmente, exibindo a lista de passagens já visitadas.

Conclusão

Eu espero que esse tutorial tenha sido útil e incentive uma diversidade maior de pessoas a criarem seus próprios jogos. Não deixe ninguém diminuir seu jogo só porque ele é feito no Twine. Faça os jogos incríveis que VOCÊ quer fazer, e não aqueles que um bando de gamers mimados acha que quer jogar.

Autor: Janos Biro

Você não existe, e eu também não.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s