[Tutorial] Inteligencia artificial dos fantasmas |
0 | ||
Depois de receber alguns pedidos perguntando como os fantasmas do evento Lua (halloween 2016) haviam sido feitos, eu decidi fazer um tutorial explicando como eles foram construídos. I. Encontrando o "corpo" do fantasma A primeira coisa que procuramos após pensar na ideia dos fantasmas era um corpo com colisão pra eles, precisávamos de um objeto que tivesse um angulo fixo e que fosse possível traçar suas coordenadas facilmente, a solução foi utilizar o consumível de peixe (id 63)! A caixa de colisão dele (35x40 pixels) combina perfeitamente com o tamanho da imagem do fantasma e ele sempre vai ter um angulo fixo, ou seja, nunca irá "rolar" pelo mapa. II. Estrutura inicial Agora que temos o objeto que precisamos, criamos uma tabela vazia no script para armazenar todos os ids dos objetos que serão colocados no mapa (nesse caso, os fanstamas): local fantasmas = {} O script atual utiliza a função tfm.room.get.uniquePlayers para retornar o número de jogadores únicos na sala e definir o número máximo de fantasmas que vão estar presentes no mapa, nesse caso vamos utilizar um número aleatório. local fantasmas = {} local maxFantasmas = 5 for i = 1, maxFantasmas do
local y = math.random(400) local idObjeto = tfm.exec.addShamanObject(63, x, y, false) table.insert(fantasmas, {
seguindoJogador = false tempoMeep = os.time()}) A posição inicial do fantasma (x, y) é aleatória aqui, já que no script oficial o código é um pouco maior pois ele lê todos os pisos do mapa. Os dados armazenados na tabela estão dentro de outra tabela, assim podemos facilmente acessar os dados (por exemplo fantasmas[1].id), as váriaveis de imagem não foram adicionadas pois não vou explicar elas aqui, visto que não há como testar o código. III. Construindo um cerébro Agora que temos uma tabela para lidar com os fantasmas, vamos criar uma função que vai ser constantemente atualizada pelo eventLoop, ela irá interagir com a tabela de fantasmas e atribuir as ações deles: function atualizaFantasmas()
A variável movimento é um número aleatório de 1 a 3 que vai indicar qual ação o fantasma deve tomar, no caso do evento Lua, essa váriavel é modificada de acordo com o jogador mais próximo (Se o jogador mais próximo do fantasma tiver 5 baterias, o número aleatório é de 3 a 6, caso o jogador não tenha 5 baterias, o número é de 1 a 3), aqui vamos apenas usar movimentos básicos: Caso seja 1, o fantasma pula; Caso seja 2, o fantasma se move para esquerda ou direita; Caso seja 3 e o o ultimo meep do fantasma foi há 5 segundos atrás ou mais, o fantasma lança um "meep". Basta usar uma simples condição para cada caso: function atualizaFantasmas()
if movimento == 1 then
elseif movimento == 2 then
elseif movimento == 3 and fantasma.tempoMeep < os.time()-5000 then
coordenada = tfm.get.room.objectList[fantasma.id] or {x = 0, y = 0} tfm.exec.displayParticle(20, coordenada.x, coordenada.y, 0, 0, 0, 0) Agora com a função pronta, basta adicionar um eventLoop para atualizar ela: function eventLoop()
É um sistema bem simples mas que pode se tornar complexo de acordo com as condições que são impostas na função, quanto mais variáveis e maior integração com o mapa do jogo (posição de jogadores, objetos, etc), mais polido e "natural" os fantasmas serão. |
Impressorahp « Citoyen » 1477591320000
| 0 | ||
Ótimo tutorial, |
Fofinhoppp « Consul » 1477592040000
| 0 | ||
Gostei, muito bem! |
Hydroper « Citoyen » 1477734180000
| 0 | ||
Você usou system.newTimer no evento de Halloween, certo? |
0 | ||
profiver a dit : não, eventLoop mesmo |
Jobsonreiss « Citoyen » 1477781700000
| 0 | ||
Nossa! Tenho muito que aprender ainda kkkkkk Legal! |
Heliiardo « Citoyen » 1477796220000
| 0 | ||
Adoraria se fosse em linguagem java, mas curti o tópico |
Anjiloo « Citoyen » 1478273520000
| 0 | ||
valeu pelo tutoria cara |
0 | ||
Tem como usar a imagem dos fantasmas para seguir os peixes? |
Hydroper « Citoyen » 1478444640000
| 0 | ||
gatanjinha a dit : Em módulos é possível, usando tfm.exec.addImage (ou seja, se você não for dev, vai precisar de outro dev para executar seu script numa sala). Dernière modification le 1478444760000 |
Contistente « Citoyen » 1478607540000
| 0 | ||
ótimo sistema mais o fantasma fica invisivel :C @Edit: Deixa pra lá :v eu já consegui fazer meu próprio sistema. Dernière modification le 1478607840000 |
Totifi « Citoyen » 1481386620000
| 0 | ||
Ataque dos peixes assasinos :O (Como faço pra eles seguirem os jogadores? tive uma ideia interesante Dernière modification le 1481388780000 |
Enzohquest « Citoyen » 1483467960000
| 0 | ||
ótimo tópico Dernière modification le 1486504020000 |