Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

Área de tiles

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP Área de tiles

Mensaje por Ledai el 2017-07-30, 14:55

Mi tema es el siguiente... necesitaría poder comprobar si dentro de un área de tiles x (de cantidad y origen variable; pero siempre cuadrada o rectangular) se encuentra un tiles de bloqueo de paso; para que entonces no ocurra cierto evento.

Actualmente sé hacer la comprobación con una coordenada sola, pero no con un área de coordenadas y por eso pregunto si es posible.

De modo que si el área x está en una zona de paso libre, suceda algo, y si no, pues no.
¿¿Cómo puedo comprobar que en un área de tiles especifica se encuentre un bloqueo de paso (X)??

Versión larga de la razón del tema:

Nota: Todo esto viene al tema del edit que hizo el gran Orochii para el script de eventos grandes, que penosamente sigo sin poder darle uso a causa de que los eventos con área de más de un tiles, "spawmean" o pueden aparecer incrustados entre tiles con pasos bloqueados al configurar su rango de aparición aleatoria en mapa; puedo comprobar el tiles de origen, pero no su área completa, lo que hace que al aparecer se queden incrustados sin moverse por culpa de su obesidad XDD.
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5208

Gracias : 215

Volver arriba Ir abajo

RPG Maker XP Re: Área de tiles

Mensaje por Wecoc el 2017-07-30, 17:42

Necesitas éste pequeño atajo de script

Código:
class Game_Map
  def all_passable?(rect, self_event = nil)
    for iy in rect.y...(rect.y + rect.height)
      for ix in rect.x...(rect.x + rect.width)
        if not self.passable?(ix, iy, 0, self_event)
          return false
        end
      end
    end
    return true
  end
  def all_passable_near?(event_id, r=1)
    event = @events[event_id]
    return false if event.nil?
    rect = Rect.new(event.x - r, event.y - r, (r * 2) + 1, (r * 2) + 1)
    p rect
    return all_passable?(rect, event)
  end
end

Se puede usar de varios modos, definiendo areas o asigándolas por proximidad, creo que te interesa más lo primero.

Supongamos ésta area de aquí:



Podemos obtener si todos los tiles de dentro (también se cuentan los eventos que no son el que estamos mirando) son pasables de éste modo:



Ese resultado se puede igualar a un interruptor usando $game_switches[ID interruptor] = $game_passable.all_passable?(rect, event)

También algo más cómo es que en un condiciones y efectos puedes ponerlo en formato de una sola línea:

$game_map.all_passable?(Rect.new(14, 0, 5, 5), $game_map.events[1])

Se cumple cuando todos son pasables. Pon "not " delante y será al revés, se cumplirá cuando alguno no es pasable.

Recuerda que si en vez de 1 pones @event_id usa el evento actual. También puedes saltarte lo del evento y definir solo el Rect, en lo que no definirá ningún evento como "propio" y por lo tanto la pasabilidad de todos se tendrá en cuenta.

Como soy un tipo majo también te hice un atajo, puedes usar:

$game_map.all_passable_near?(ID evento, radio)

Por ejemplo para obtener exactamente la misma area que antes, podrías usar:

$game_map.all_passable_near?(1, 2)
avatar
Wecoc
Administrador
Administrador



Créditos 12284

Gracias : 645

Volver arriba Ir abajo

RPG Maker XP Re: Área de tiles

Mensaje por Ledai el 2017-07-30, 18:46

Funciona todo bien, solo que me surgen un mini problema... o al menos eso me ha parecido tras analizar detenidamente las cosas y no llegar a ninguna parte @~@ Madre miiiia, cómo tengo hoy la cabezaaa...

Resulta que a la hora de igualar las áreas de ambos edit, no cuadran pues una se muestra desde el centro y otra desde la base; dejo una imagen porque siento que no me explico y no se me entiende:

Ejemplo:

Este edit: ---------------------------------------------- Big event:

No se rían del "arte" que tengo con el ratón... no soy Silva >.<

por las pruebas que he hecho, creo que en el que me has pasado, el área se calcula muy bien desde el punto central del evento; pero en el big events, se muestra desde su base... Por lo que a la hora de cuadrar las áreas se queda un "hueco" que no se comprueba...

A poder ser, necesitaría que este pequeño atajo calibrara las áreas del mismo modo que el otro script (Desde su base), para no tener que editar todos los eventos estáticos del proyecto.

De todos modos, he estado probando con el atajo: $game_map.all_passable_near?(@event_id, 3)
Los otros no los he probado porque ando empanada mentalmente ¬_¬

hoy no tengo bien la cabeza y me aparecen bugs por todos lados... 
En serio, ya estoy harta de encontrar esos odiosos bichos en cualquier sitio donde makeo hoy XDD!!
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5208

Gracias : 215

Volver arriba Ir abajo

RPG Maker XP Re: Área de tiles

Mensaje por Wecoc el 2017-07-30, 20:12

Cierto, en el que puse se mira desde el centro y no desde la base.
Parece que en tu caso necesitas algo más específico para el sistema de Big Events en cuestión.

Código:
class Game_Map
  def all_passable?(rect, self_event = nil)
    for iy in rect.y...(rect.y + rect.height)
      for ix in rect.x...(rect.x + rect.width)
        if not self.passable?(ix, iy, 0, self_event)
          return false
        end
      end
    end
    return true
  end  
  def all_passable_near?(event_id)
    event = @events[event_id]
    return false if event.nil?
    sx = event.x - (event.ch_width.to_f / 2).floor
    sy = event.y - event.ch_height + 1
    w = event.ch_width
    h = event.ch_height
    return all_passable?(Rect.new(sx, sy, w, h), event)
  end
end

Ahora en el atajo solo hay que definir el ID del evento, no el 'radio' o rango o como quieras llamarlo, porque ya usa el tamaño del evento para eso.
El método principal all_passable? está exactamente igual. Lo probé por encima y parece que va bien.

Es extraño que con el passable? del propio evento no tuvieras suficiente, puede que ni siquiera necesitaras el script añadido en ese caso, pero bueno en todo caso es compatible con todo lo demás así que no le veo problema, así tienes ampliación por si necesitas esa comprobación en casos más complejos o menos relacionados con Big Events. Ésta ampliación puedes ponerla dentro del script Big Events al final y así lo tendrás ordenado.

El passable? del propio evento se usa haciendo $game_map.events[event ID].passable?(x, y, 0)
Es algo distinto que el passable? de Game_Map típico, que es $game_map.passable?(x, y, 0, $game_map.events[event ID]), puesto que considera otras propiedades del evento en cuestión, entre ellas la de Atravesable o si tiene gráfico vacío, y especialmente en ese caso concreto con Big Events cambia aún más y ya debería considerar lo de su tamaño bien; es la parte que más cambió Orochii.
avatar
Wecoc
Administrador
Administrador



Créditos 12284

Gracias : 645

Volver arriba Ir abajo

RPG Maker XP Re: Área de tiles

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.