×

Langue

Fermer
Atelier 801
  • Forums
  • Dev Tracker
  • Connexion
    • English Français
      Português do Brasil Español
      Türkçe Polski
      Magyar Română
      العربية Skandinavisk
      Nederlands Deutsch
      Bahasa Indonesia Русский
      中文 Filipino
      Lietuvių kalba 日本語
      Suomi עברית
      Italiano Česky
      Hrvatski Slovensky
      Български Latviešu
      Estonian
  • Langue
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • [Tutorial] Inteligencia artificial dos fantasmas
[Tutorial] Inteligencia artificial dos fantasmas
Esh
« Censeur »
1477589820000
    • Esh#0095
    • Profil
    • Derniers messages
    • Tribu
#1
  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.

http://i.imgur.com/77GgxoG.png



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 x = math.random(800)
      local y = math.random(400)
      local idObjeto = tfm.exec.addShamanObject(63, x, y, false)
      table.insert(fantasmas, {
        id = idObjeto,
        seguindoJogador = false
      ,
      tempoMeep = os.time()})
    end

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()
      for index, fantasma in pairs(fantasmas) do
        local movimento = math.random(3)
      end
    end

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()
      for index, fantasma in pairs(fantasmas) do
        local movimento = math.random(3)
        if movimento == 1 then
          tfm.exec.moveObject(fantasma.id, 0, 0, false, 0, -50, false)

        elseif movimento == 2 then
          tfm.exec.moveObject(fantasma.id, 0, 0, false, math.random(-50, 50), 0, false)

        elseif movimento == 3 and fantasma.tempoMeep < os.time()-5000 then
          fantasma.tempoMeep = os.time()
          coordenada = tfm.get.room.objectList[fantasma.id] or {x = 0, y = 0}
          tfm.exec.displayParticle(20, coordenada.x, coordenada.y, 0, 0, 0, 0)
        end
      end
    end

Agora com a função pronta, basta adicionar um eventLoop para atualizar ela:

    function eventLoop()
      atualizaFantasmas()
    end

É 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
    • Impressorahp#2775
    • Profil
    • Derniers messages
    • Tribu
#2
  0
Ótimo tutorial,
Fofinhoppp
« Consul »
1477592040000
    • Fofinhoppp#0000
    • Profil
    • Derniers messages
    • Tribu
#3
  0
Gostei, muito bem!
Hydroper
« Citoyen »
1477734180000
    • Hydroper#0528
    • Profil
    • Derniers messages
    • Tribu
#4
  0
Você usou system.newTimer no evento de Halloween, certo?
Esh
« Censeur »
1477771620000
    • Esh#0095
    • Profil
    • Derniers messages
    • Tribu
#5
  0
profiver a dit :
Você usou system.newTimer no evento de Halloween, certo?

não, eventLoop mesmo
Jobsonreiss
« Citoyen »
1477781700000
    • Jobsonreiss#0000
    • Profil
    • Derniers messages
    • Tribu
#6
  0
Nossa! Tenho muito que aprender ainda kkkkkk
Legal!
Heliiardo
« Citoyen »
1477796220000
    • Heliiardo#0000
    • Profil
    • Derniers messages
    • Tribu
#7
  0
Adoraria se fosse em linguagem java, mas curti o tópico
Anjiloo
« Citoyen »
1478273520000
    • Anjiloo#0000
    • Profil
    • Derniers messages
    • Tribu
#8
  0
valeu pelo tutoria cara
Gatan
« Censeur »
1478441460000
    • Gatan#1201
    • Profil
    • Derniers messages
    • Tribu
#9
  0
Tem como usar a imagem dos fantasmas para seguir os peixes?
Hydroper
« Citoyen »
1478444640000
    • Hydroper#0528
    • Profil
    • Derniers messages
    • Tribu
#10
  0
gatanjinha a dit :
Tem como usar a imagem dos fantasmas para seguir os peixes?

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
    • Contistente#0000
    • Profil
    • Derniers messages
    • Tribu
#11
  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
    • Totifi#0000
    • Profil
    • Derniers messages
    • Tribu
#12
  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
    • Enzohquest#0000
    • Profil
    • Derniers messages
    • Tribu
#14
  0
ótimo tópico

Dernière modification le 1486504020000
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • [Tutorial] Inteligencia artificial dos fantasmas
© Atelier801 2018

Equipe Conditions Générales d'Utilisation Politique de Confidentialité Contact

Version 1.27