Em vez de usar um botão para acionar uma ação de script, simule o ambiente do jogo de tabuleiro acionando uma ação de script colocando uma peça do jogo em uma peça.
Este guia intermediário pressupõe conhecimento básico de scripts de lua.
Normalmente, um mod usará um botão para acionar uma ação de script. Isso funciona bem, mas não está de acordo com o TTS como uma simulação de um jogo de tabuleiro.
Outra abordagem é usar um bloco ou token personalizado. O jogador pode acionar uma ação de script colocando uma peça específica do jogo na peça.
Abordagem básica
Essa abordagem usa a função onCollisionEnter(). Se esta função estiver incluída no script de objeto anexado ao tile, ela será chamada toda vez que uma peça do jogo entrar em contato com o tile.
A função onCollisionEnter() deve estar no script de objeto para o bloco. Não funcionará se estiver no script global.
Uma função simples se parece com isso:
function onCollisionEnter(collision_info) -- Collision_info table: -- Collision_object Object -- Contact_points Table {Vector, ...} -- relative_velocity Vector local piece = 'guidaa' -- o guid da peça que aciona a ação local guid = Collision_info .collision_object.getGUID() se guid == peça então retorne Global:call('desiredAction') -- string nome da função a ser chamada end end
Observe que a função é chamada sempre que algum objeto faz contato com o tile, então o primeiro passo da função deve ser verificar se o objeto que está fazendo contato é aquele que deve acionar a ação.
Em vez de usar o guid para identificar o objeto que está fazendo contato, você pode usar o nome do objeto, descrição ou gmnotes usando getName(), getDescription() ou getGMNotes() no lugar de getGUID().
Diferentes peças desencadeiam diferentes ações
Para levar essa abordagem um passo adiante, você pode configurar diferentes peças do jogo que desencadeiam ações diferentes quando são colocadas no bloco.
Use uma função como esta:
function onCollisionEnter(collision_info) peça local = {['guidaa'] = 1, ['guidbb'] = 2, ['guidcc'] = 3} -- guids como chaves na tabela são mais fáceis de verificar guid local = colis_info. colision_object.getGUID() local somedata -- somedata para passar para o script Global, -- por exemplo, a ação para acionar -- incluir somedata como valores em piece{} if piece[guid] then somedata = piece[guid] -- passar somedata para o script Global return Global:call('desiredAction', {somedata}) end end
Acionar diferentes ações por local colocado
Indo além, você também pode configurar a peça para que o jogador possa desencadear ações diferentes colocando uma peça do jogo em lugares diferentes na peça do jogo.
Por exemplo, você pode projetar a imagem para que o bloco seja dividido em quatro quadrantes.
Esta função aciona diferentes ações dependendo de qual quadrante do bloco é contatado.
function onCollisionEnter(collision_info) local piece = 'guidaa' -- referência abreviada para o contato obj local obj = colision_info.collision_object local guid = obj.getGUID() local somedata if guid == piece then -- encontre o ponto médio entre os pontos de contato local hit1 = self.positionToLocal(obj.contact_points[1] ou obj.contact_points[3]) local hit3 = self.positionToLocal(obj.contact_points[3] ou obj.contact_points[1]) -- use 'or' caso o a peça não está inteiramente no ladrilho local hitx = (hit1.x+hit3.x)/2 local hitz = (hit1.z+hit3.z)/2 -- normalmente, você pode dividir o ladrilho em quartos usando x e z coordenadas se hitz < 0 então se hitx > 0 então somedata = 1 else somedata = 2 end else se hitx > 0 então somedata = 3 else somedata = 4 end end -- passa somedata para o script Global return Global:call('desiredAction ', {guid, somedata}) end end
Esta última etapa pode ser complicada, porque nem sempre é intuitivo como as coordenadas x,y,z no TTS são determinadas. Por exemplo, pode depender de como o bloco é girado ou invertido. Você pode precisar experimentar um pouco. Você pode adicionar a linha log(hitx..” “..hitz) à função para enviar os valores para o console enquanto você experimenta.
Variação
O objetivo da abordagem descrita aqui é desencadear uma ação de jogo quando um jogador coloca uma peça relevante na peça. É por isso que essa abordagem usa a função onCollisionEnter().
Se, em vez disso, você quiser que a função seja ativada apenas quando for chamada no script, poderá usar uma abordagem um pouco diferente. Por exemplo, você pode querer que o script marque uma opção que um jogador escolheu. O guia vinculado abaixo descreve essa abordagem.
Resolução de problemas
A função onCollisionEnter() pode ser acionada várias vezes se uma peça se chocar contra o ladrilho. Uma correção para isso é evitar acionar a função se não tiver passado tempo suficiente desde que o bloco foi contatado pela última vez. Para fazer isso, inclua esse código no início da função.
if Time.time - (segundos ou 0) < 1 então return else seconds = Time.time end
Observe que a variável para segundos deve ser uma variável global. Se não for, pode ser redefinido toda vez que a função for chamada. Cuidado com conflitos com outras variáveis globais.
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.