Quando um jogador passa o mouse sobre um objeto, sua descrição será atualizada para mostrar os nomes dos objetos que estão abaixo desse objeto.
Este guia intermediário pressupõe conhecimento básico de scripts de lua.
Pode ser útil saber o que está abaixo de um objeto, sem mover o objeto para verificar. Por exemplo, uma pilha de marcadores em um jogo de guerra ou qualquer outra pilha de peças.
Esta função usa a função onObjectHover() na API TTS. Quando o jogador passa o mouse sobre um objeto, esta função atualiza a descrição desse objeto para listar os nomes dos objetos abaixo desse objeto. A lista é adicionada ao final de qualquer descrição que já esteja anexada ao objeto.
Essa função chama funções da biblioteca de strings lua, que inclui muitos recursos interessantes. Você pode ler mais sobre eles no tutorial da biblioteca de strings no wiki lua-users.
Essa função funciona melhor se você tiver uma maneira de identificar os objetos em seu jogo, como as funções Tag na API TTS. Além disso, os objetos precisam ter nomes ou alguma outra informação que possa ser adicionada à descrição.
A função
function onObjectHover(player, obj) se obj e obj.hasTag("Hover") então local descrip = obj.getDescription() ou '' local start = descrip:find('stacked with') se start então descrip = descrip:sub (1, start-1) end local hitObjects = { } local stackObjects = { } local pos = obj.getPosition() pos.y = pos.y + 2 hitObjects = Physics.cast({origin = pos, direction = {0 ,-1,0}}) para _, hitobj em ipairs(hitObjects) faça se obj ~= hitobj.hit_object e hitobj.hit_object.hasMatchingTag(obj) then table.insert(stackObjects, hitobj.hit_object) end end if #stackObjects >0 então se descrip ~= '' e não descrip:endsWith('\n') então descrip = descrip..'\n' end descrip = descrip..'stacked with\n' for _, stackobj in ipairs(stackObjects ) do local name = stackobj.getName() ou '' descrip = descrip .. name .. '\n' end end if descrip:endsWith('\n') then decrip = descrip:sub(1, -2) end obj.setDescription(descrip) end end
O que a função faz
A função:
- Verifica se o mouse está pairando sobre um objeto (“if obj …”). Sem isso, a função pode gerar um erro.
- Verifica se o objeto possui uma determinada tag. Você deve usar algum teste aqui, porque esta função provavelmente é útil apenas para alguns dos objetos em seu jogo.
- Obtém a descrição do objeto ou uma string vazia se o objeto não tiver uma descrição.
- Verifica se a descrição contém a frase-chave “empilhada com”. Você pode usar qualquer frase aqui, mas a função funciona verificando essa frase-chave, portanto, a frase deve ser consistente e deve ser algo que não apareceria na descrição de um objeto.
- Se a descrição contiver a frase-chave “empilhada com”, exclui essa frase e tudo o que vem depois dela. (Essa informação será adicionada mais tarde.)
- Obtém a posição do objeto.
- Identifica todos os outros objetos para baixo a partir de um ponto ligeiramente acima do objeto e coloca esses objetos em uma tabela chamada hitObjects.
- Verifica cada objeto em hitObjects. Se o objeto não for o primeiro objeto e se o objeto tiver uma tag que corresponda ao primeiro objeto, o objeto será adicionado a uma tabela chamada stackObjects.
- Verifica se há algo na tabela stackObjects e, em caso afirmativo:
adiciona uma nova linha à descrição do primeiro objeto (se já houver texto na descrição),
adiciona a frase-chave “empilhada com” à descrição do primeiro objeto e
obtém o nome de cada objeto em stackObjects, adiciona-o à descrição do primeiro objeto e adiciona uma nova linha. - Exclui a nova linha do final da descrição do primeiro objeto, se houver.
- Define o texto da descrição do primeiro objeto.
As funções da biblioteca de strings
Em resumo, é isso que as funções da biblioteca de strings fazem.
start = descrip:find('stacked with') verifica se uma variável string, descrip, contém a frase “stacked with” e, se estiver, retorna o índice do início dessa frase. Nesse caso, o índice é a enésima letra na descrição na qual o “s” em “empilhado com” aparece. Este número é atribuído à variável start.
descrip = descrip:sub(1, start-1) Se start não for nil (ou seja, se a frase “stacked with” aparecer na descrip), então retorne uma nova string que inclui tudo na descrip até, mas não incluindo o índice começar. Um é subtraído no final para que a primeira letra de “empilhado com” não seja incluída. Essa nova string é atribuída e substitui a variável descrip.
not descrip:endsWith('\n') A função endsWith() não está na biblioteca de strings lua, mas faz parte da biblioteca Moonsharp que o TTS usa. Retorna true se uma string terminar com uma frase especificada. Aqui, ele verifica se descrip já possui uma nova linha no final, antes de adicionar uma.
descrip:sub(1, -2) A função às vezes termina com uma nova linha extra no final da descrição do objeto, o que parece estranho. Então, se descrip termina com uma nova linha (e nada depois), descrip:sub(1, -2) retorna uma nova string que inclui tudo em descrip até, mas não incluindo as duas últimas letras na string (ou seja, '\ n'), e o atribui à variável descrip.
Observe que lua não exclui nada de uma string, mas retorna uma nova string que não contém o que você deseja excluir.
Física.cast()
Esta função da API TTS retorna uma tabela de todos os objetos que existem em uma determinada área ou direção. Ele pode fazer muitas coisas.
Aqui, ele usa principalmente os parâmetros padrão para lançar uma linha para baixo do objeto sobre o qual o mouse está pairando. Para isso, ajuda a definir a origem da linha um valor de 2 acima do próprio objeto. Isso parece funcionar melhor para capturar tudo na pilha.
Physics.cast() é totalmente descrito na referência da API TTS. Provavelmente poderia ser usado para identificar objetos ao redor (em vez de abaixo) de um determinado objeto, mas este Guia é limitado a linhas projetadas para baixo de um objeto.
Observe que Physics.cast() identificará cada objeto que interceptar, incluindo a mesa de jogo e outros objetos incidentais.
Por causa disso, a função verifica se obj ~= hitobj.hit_object, para evitar incluir obj em sua própria descrição.
Além disso, é necessário incluir algum teste para incluir apenas determinados objetos na tabela stackObjects. Aqui, o objeto é incluído se tiver uma tag que corresponda ao primeiro objeto.
guia de solução de problemas
Esta função adiciona os nomes dos outros objetos à descrição do primeiro objeto. Se os objetos em seu jogo não tiverem nomes, use outras informações e substitua a chamada para a função getName().
Esta função deixa (ou seja, não exclui) a lista de objetos na descrição do primeiro objeto.
Isso normalmente não deve ser um problema, porque a descrição só aparece quando o mouse passa sobre o objeto. E a primeira coisa que a função faz (quando o mouse passa sobre um objeto no grupo relevante) é verificar se a descrição contém a frase-chave “empilhado com”. Nesse caso, a função exclui essa frase e tudo o que vem depois dela.
Portanto, se o mouse passar sobre um objeto no grupo relevante e nenhum objeto relevante estiver abaixo dele, a função redefinirá a descrição do objeto.
Se isso se tornar um problema, por favor, deixe um comentário e talvez a função possa ser corrigida para evitá-lo.
Isso é tudo o que estamos compartilhando hoje para isso tabletop Simulator guia. Este guia foi originalmente criado e escrito por Carey McDuff. Caso não consigamos atualizar este guia, você pode encontrar a atualização mais recente seguindo este link.