Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3773 miembros registrados.
El último usuario registrado es Selu64.

Nuestros miembros han publicado un total de 85868 mensajes en 12230 argumentos.

512 etiquetas de terreno

Ver el tema anterior Ver el tema siguiente Ir abajo

512 etiquetas de terreno

Mensaje por teivko el 2017-02-08, 16:36

Bueno, estuve preguntando en un tema de hace muchísimo tiempo sobre esto ya que no entendía el funcionamiento del Script de ese chico, asi que dándole a la cabeza he encontrado mi manera de hacerlo.

La idea es la siguiente, normalmente el terrain_tag lo que hace es devolver la etiqueta que sea diferente de 0 y de la capa que esta mas arriba, es decir, primero la 2, luego la 1 y luego la 0. Yo lo que he hecho es que en vez de que devuelva la etiqueta de la que esta mas arriba, sume los números de estos y ese es el valor que te devuelve. De esta forma, teniendo 3 capas con 8 valores en las etiquetas cada una, tenemos unas 512 etiquetas para el terreno. Esto conlleva sus riesgos, ya que dependiendo de si tenemos algun script que haga uso de esto, deberemos tener en cuenta las etiquetas a la hora de mapear, por eso en vez de sustituir el otro metodo, he creado uno nuevo para que lo añadais al script en el que necesitáis mas etiquetas.

P.D. No se si esta idea la pensó antes alguien, la verdad es que no he encontrado nada, asi que o la idea es muy tonta, o es de esas tan simples pero efectivas que a nadie se le ha ocurrido xD

Código:
class Game_Map
  def tag_terreno(x, y)
    t=0
    for i in [2, 1, 0]
      tile_id = data[x, y, i]
      if tile_id == nil
        return 0
      elsif @terrain_tags[tile_id] > 0
        t += @terrain_tags[tile_id]
      end
    end
    return t
  end
end
avatar
teivko
Iniciado
Iniciado

0/3

Créditos 45

Gracias : 3

Volver arriba Ir abajo

Re: 512 etiquetas de terreno

Mensaje por Wecoc el 2017-02-09, 03:11

Lo veo algo "peligroso" hacerlo así, porque a un mismo número se puede llegar con suma de terrenos distintos, creo... Además lo normal es que si usas un tile con terreno 7, su resultado ocurra siempre a lo largo del área pese a haber otro debajo con terreno distinto de 0.

Por cierto los terrenos a diferencia de las pasabilidades están en base 10. Sumando los de las 3 capas solo puedes llegar a 24, ¿no? No es lo mismo que hacer combinatoria porque no te está importando en cual de las capas está cada valor.

Estaría mejor que el character tuviera una array de 3 terrenos, uno para cada capa, y que algo pase con terreno 7 signifique simplemente que en la array está el 7. Eso haría que fuera compatible con los otros sistemas que usan terrenos y a la vez permitiría más opciones, por ejemplo podrías hacer que algo ocurriera solo si tiene terreno 7 y a la vez el 2, o ya expandido para scripters permitir la posibilidad de usar la array directamente y así hacer que solo ocurriera algo si la capa 0 es 7 y a la vez la 1 es 2 (ahí sí tienes muchas más combinaciones). Es más seguro que sumarlos.
avatar
Wecoc
Administrador
Administrador



Créditos 12087

Gracias : 519

Volver arriba Ir abajo

Re: 512 etiquetas de terreno

Mensaje por teivko el 2017-02-09, 06:45

Tienes razón Wecoc respecto a lo de las combinaciones, no se que estaría pensando ayer. Mi idea era hacer lo que tu decías, un array con los tags de las tres capas y que dependiendo de una cierta combinación sea uno u otro.

Lo que se me ocurre, es crear un método que devuelva un codigo especifico dependiendo de la combinación de etiquetas, dandole asi por ejemplo a la capa 2 un valor base de 100 (por poner un ejemplo) y que el valor del terreno se multiplique por ese 100, a la capa 1 un valor base de 10, y a la 0 un valor base de 1. Haciendo algo como que si la capa 2 tiene un terreno 7, la capa 1 nada y la capa 0 tiene un terreno 2, el código resultante seria 702 o algo asi xD

De verdad, vaya chapuza la mía de ayer, os recomiendo dejar de programar cuando esteis con fiebre, porque por muchas buenas ideas que tengais, no serán muy coherentes como se puede apreciar xDDD
avatar
teivko
Iniciado
Iniciado

0/3

Créditos 45

Gracias : 3

Volver arriba Ir abajo

Re: 512 etiquetas de terreno

Mensaje por teivko el 2017-02-10, 19:29

El codigo para que dependiendo de la capa tenga un codigo u otro es el siguiente:

Código:
class Game_Map
  def tag_terreno(x, y)
    t=0
    for i in [2, 1, 0]
      tile_id = data[x, y, i]
      if tile_id == nil
        return 0
      elsif @terrain_tags[tile_id] > 0
        t += (10**i+1)*@terrain_tags[tile_id]
      end
    end
    return t
  end
end

Lo que hago es usar un valor 10 que elevado al numero de la capa mas y, por el id del terreno es el resultado del código de esa capa, luego se suman los valores resultantes de las tres capas, y obtienes el codigo.
avatar
teivko
Iniciado
Iniciado

0/3

Créditos 45

Gracias : 3

Volver arriba Ir abajo

Re: 512 etiquetas de terreno

Mensaje por Wecoc el 2017-02-11, 06:51

Sigo diciendo que es mejor el método que dije porque en general te interesa que el terreno sea 4 esté en la capa que esté, solo en casos en los que requiera más complejidad buscarás que éste esté en una posición concreta, y en ese caso trabajar con una array es más cómodo que con un número de 3 dígitos.

He hecho el script tal como dije. Los terrenos funcionan como siempre, si haces un engine rápido para probarlo verás que van igual pero si por script haces $game_player.terrain_tag por ejemplo eso te devuelve una array, y puedes hacer condicionales para cada capa separadamente.

Código:
#==============================================================================
# ** Array de Terrenos
#------------------------------------------------------------------------------
# Autor: Wecoc, usando una idea de teivko
# No requiere créditos
#==============================================================================

#==============================================================================
# ** Terrain_Array
#==============================================================================

class Terrain_Array < Array
  alias terrain_eql == unless $@
  def ==(n)
    if n.is_a?(Array)
      terrain_eql(n)
    else
      self.include?(n)
    end
  end
  def terrain_top
    r = self.select {|i| i != 0}
    return 0 if r.size == 0
    return r[-1]
  end
  def <=>(n)  terrain_top <=> n  end
  def >(n)    terrain_top > n    end
  def >=(n)  terrain_top >= n  end
  def <(n)    terrain_top < n    end
  def <=(n)  terrain_top <= n  end
end

#==============================================================================
# ** Game_Map
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # * Terrain tag
  #--------------------------------------------------------------------------
  def terrain_tag(x, y)
    t0 = 0 ; t1 = 0 ; t2 = 0
    if @map_id != 0
      for i in [2, 1, 0]
        tile_id = data[x, y, i]
        if tile_id != nil && @terrain_tags[tile_id] > 0
          eval("t#{i} = @terrain_tags[tile_id]")
        end
      end
    end
    return Terrain_Array.new([t0, t1, t2])
  end
end

#==============================================================================
# ** Interpreter
#==============================================================================

class Interpreter
  #--------------------------------------------------------------------------
  # * TERRAIN_VARIABLE_FIX
  # Si está activado, al asignar terreno a variable ésta es el valor distinto a
  # 0 de la capa más alta, como por defecto.
  # Si no, la variable es la array de terrenos (Terrain_Array)
  #--------------------------------------------------------------------------
  TERRAIN_VARIABLE_FIX = true
  #--------------------------------------------------------------------------
  # * Asignar valor a variable
  #--------------------------------------------------------------------------
  alias terrain_fix_c122 command_122 unless $@
  def command_122
    terrain_fix_c122
    if TERRAIN_VARIABLE_FIX == true
      if @parameters[3] == 6 && @parameters[5] == 5 # Terrain tag
        character = get_character(@parameters[4])
        for i in @parameters[0] .. @parameters[1]
          $game_variables[i] = character.terrain_tag.terrain_top
        end
      end
    end
    return true
  end
end

En resumen puedes hacer $game_map.terrain_tag(x, y) == 7 para mirar si en conjunto es 7 como siempre, pero también puedes hacer $game_map.terrain_tag(x, y)[0] == 7 para saber si en la capa 0 el terreno es 7, o puedes hacer comprobaciones más complejas como $game_map.terrain_tag(x, y) == [7, 2, 0]

No pido créditos ;D


Última edición por Wecoc el 2017-02-11, 16:42, editado 2 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12087

Gracias : 519

Volver arriba Ir abajo

Re: 512 etiquetas de terreno

Mensaje por Ledai el 2017-02-11, 11:58

Wecoc;
¿Esto serviría por ejemplo para comprobar si una coordenada de transporte o de aparición enemiga estará sobre un tiles con cierto ID de terreno verdad? (Tu aporte no es exactamente lo que se comenta en el tema origen por lo que veo?)


Pues si es así, me acaba de solucionar un bug que encontré el otro día en el juego al hacer las apariciones aleatorias enemigas... y que he estado pensando cómo quitar de en medio, si lo logro suerte para mi y gracias para ti.

Salu2!

Edit: Confirmado, me ha solucionado un bug, me ha ahorrado un montón de comprobaciones y a aligerado el proceso de eventos; así que confirmo: suerte para mi y MUCHAS gracias para ti.

Edt2: Pero el script se carga la comprobación de terrenos tradicional, es decir, asignar el valor a una variable y comprobar dicho terreno mediante la variable siempre da cero. por lo que jode todo lo que tuvieras hecho anteriormente ¬_¬.

Edit3 (tras el comentario de Wecoc): Ahh OK ok, contaba que sería un error de incompatibilidad con alguna cosa que estaba haciendo mal en mi proyecto. Si solo fue un detalle sin añadir, en ese caso todo en orden! Toma tus gracias nuevamente XD ^_^

O.O en serio tantas combinaciones? Claro, al comprobar cada una de cada capa... dan tantas... Uff


Última edición por Ledai el 2017-02-11, 13:45, editado 1 vez
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 2965

Gracias : 174

Volver arriba Ir abajo

Re: 512 etiquetas de terreno

Mensaje por Wecoc el 2017-02-11, 13:38

Sí, el script viene a ser lo que decía el post principal pero hecho de otro modo. Poder comprobar por separado si el terreno es [7, 2, 1] por ejemplo, te permite comprobar la posición de cada terreno, lo que te da un total de 512 combinaciones.

Y no se carga nada, lo que pasa es que me dejé lo de la variable o más bien pensé que no haría falta. Ahora lo añado, le pondré que se pueda escojer cómo se carga la variable.
Edit: ¡Hecho!
avatar
Wecoc
Administrador
Administrador



Créditos 12087

Gracias : 519

Volver arriba Ir abajo

Re: 512 etiquetas de terreno

Mensaje por teivko el 2017-02-15, 10:24

Muchas gracias Wecoc, la verdad es que soy muy cabezón con mis ideas, y la verdad es que pensaba que con lo que había pensado era mas que suficiente. Pero luego lo estuve pensando, y la verdad es que es mucho mas útil y eficaz lo que tu habías hecho porque permite evaluar por separado las capas y a eso le encontre varios usos muy utiles.

Respecto a tu código, tengo una pregunta Wecoc, como podria hacer que el metodo terrain_tag fuera compatible con este otro que hiciste hace algun tiempo: Control de pasabilidad por mapa. Es que estoy integrando varios sistemas (nadar, pescar, cavar, etc) y lo he hecho de tal forma que cuando pulsas una tecla especifica te equipas X objeto y entonces puedes solo cavar, o solo pescar, o nadar, pero para el caso de nadar el script que tengo te pide que la pasabilidad del tile por el que vas a nadar sea completa, pero claro, si no tengo el traje de baño no quiero que se pueda hacer esto, y justo con ese script puedo hacerlo mediante un evento comun.

Saludos y gracias ^^
avatar
teivko
Iniciado
Iniciado

0/3

Créditos 45

Gracias : 3

Volver arriba Ir abajo

Re: 512 etiquetas de terreno

Mensaje por Wecoc el 2017-02-16, 10:34

Pues diría que lo único que los hace incompatibles es el método terrain_tag

Copia los dos scripts, el de 512 encima y el de control por pasabilidad debajo (en realidad el órden no es tan importante en éste caso, creo)
Al de debajo, le cambias el def terrain_tag por ésto:

Código:
 def terrain_tag(x, y)
    t0 = 0 ; t1 = 0 ; t2 = 0
    if @map_id != 0
      for i in [2, 1, 0]
        tile_id = data[x, y, i]
        if tile_id != nil
          terrain = get_map_terrain_tag(x, y, i)
          if terrain > 0
            eval("t#{i} = terrain")
          end
        end
      end
    end
    return Terrain_Array.new([t0, t1, t2])
  end

Y ya deberían funcionarte ámbos sistemas conjuntamente.
avatar
Wecoc
Administrador
Administrador



Créditos 12087

Gracias : 519

Volver arriba Ir abajo

Re: 512 etiquetas de terreno

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.