[Tutorial] Inteligencia artificial |
Tocutoeltuco « Censeur » 1477592760000
| 1 | ||
NOTA: Este hilo es simplemente una traducción, si a alguien le tienen que agradecer, es a Eshkation por hacer el tutorial. Hilo oficial (en BR): http://atelier801.com/topic?f=6&t=837301 Despues de recibir algunos pedidos preguntando como los fantasmas del evento Lua (halloween 2016) habían sido hechos, yo decidí hacer un tutorial de como ellos fueron construidos. I. Encontrando el "cuerpo" del fantasma La primera cosa de la que nos ocupamos despues de pensar la idea de los fantasmas, era un cuerpo con colisión para ellos, necesitábamos un objeto que tuviese un ángulo fijo que haga posible encontrar sus coordenadas facilmente, la solución fue utilizar el consumible de pez (id 63). La caja de colisión del objeto (35x40 pixels) combina perfectamente con el tamaño de la imágen del fantasma y el siempre va a tener un ángulo fijo, o sea, nunca irá a "rodar" por el mapa. II. Estructura inicial Ahora que tenemos el objeto que necesitamos, creamos una tabla vacía en el script para almacenar todas las ids de los objetos que serían colocados en el mapa (en este caso, los fantasmas): local fantasmas = {} El script actual utiliza la función tfm.room.get.uniquePlayers para devolver el número de jugadores únicos en la sala y definir el número máximo de fantasmas que van a estar presentes en el mapa, en este caso vamos a utilizar un número aleatorio. 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()}) La posición inicial del fantasma (x, y) es aleatoria aquí, ya que en el script oficial el código es un poco mayor puesto que el mismo lee todos los suelos del mapa. Los datos almacenados en la tabla están dentro de otra tabla, así podemos acceder fácilmente a los datos (por ejemplo fantasmas[1].id), las variables de imagen no fueron añadidas puesto que no las voy a explicarlas aquí, visto que no hay cómo probar el código. III. Construyendo un cerebro Ahora que temos una tabla para manejar los fantasmas, vamos a crear una función que va a ser constantemente actualizada por un eventLoop, el va a interactuar con la tabla de los fantasmas y asignar las acciones de ellos: function atualizaFantasmas()
La variable movimiento es un número aleatorio de 1 a 3 que va a indicar cual acción el fantasma debe hacer, en el caso del evento Lua, esa variable es modificada de acuerdo con el jugador más cercano (Si el jugador más cercano del fantasma tiene 5 baterías, el número aleatorio es de 3 a 6, en el caso de que el jugador no tenga las 5 baterías, el número es de 1 a 3), aqui vamos sólamente a usar movimentos básicos: En el caso de que sea 1, el fantasma salta; En el caso de que sea 2, el fantasma se mueve para izquierda o derecha; En el caso de que sea 3 y el último meep del fantasma fue hace 5 segundos atrás o más, el fantasma lanza un "meep". Basta con usar una simple condición 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) Ahora con la función lista, basta con añadir un eventLoop para actualizarla: function eventLoop()
Es un sistema bien simple pero que puede volverse complejo de acuerdo a las condiciones que son puestas en la función, cuanto más variables es mayor interacción con el mapa del juego (posición de jugadores, objetos, etc), más pulidos y "naturales" serán los fantasmas. Dernière modification le 1477596540000 |
Miiiclaroo « Citoyen » 1477609440000
| 0 | ||
wow, está cool me gustó *-* tal vez lo use en un tiempo |
0 | ||
Está bueno el truco del pez, hasta hace un par de días noté las propiedades raras que tenía ese objeto pero no me fijé mucho en la rotación fija. |
Bisanota 1484581260000
| | ||
[Modéré par Bog, raison : Fuera de tema.] |
Cccelpro « Citoyen » 1484585040000
| 0 | ||
Genial. |
Miiiclaroo « Citoyen » 1484767080000
| 0 | ||
Bisanota a dit : Que los peces tengan los poderes? |
Mustazza « Censeur » 1484796060000
| 0 | ||
Buen tutorial!! Bisanota a dit : Aca es el hilo para pedir Scripts. |
Kenykern « Citoyen » 1486763220000
| 0 | ||
¡¡Este tutorial es genial!! |
0 | ||
script copleto? |
Miiiclaroo « Citoyen » 1495413060000
| 0 | ||
Franqutekill a dit : debes reunir parte por parte para tener el script completo |
Rauldiazzz « Citoyen » 1495670460000
| 0 | ||
Esta muy guapo este tutorial :3 |