Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Salto por mapa de alturas

Ver el tema anterior Ver el tema siguiente Ir abajo

[XP] Salto por mapa de alturas

Mensaje por Wecoc el 2014-04-12, 17:31

Éste script requiere éste otro para funcionar: Bitmap Layer

Lo que hace es modificar las coordenadas de salto si hay una diferencia de altura. Para ello habrá que hacer un mapa de alturas, en el código viene explicado cómo hacerlo.

Spoiler:
Con éste ejemplo se entendrá mejor, en realidad no se ve así, he puesto los símbolos luego para que se entienda algo.

El cuadrado es dónde saltaría sin el script, la cruz dónde intentaría saltar pero no podría, y la redonda dónde saltará con el script.


Código:

Código:
#==============================================================================
# ** Salto por mapa de alturas v1.0
#------------------------------------------------------------------------------
# ¡ATENCIÓN! Éste script requiere el script Bitmap_Layer
#------------------------------------------------------------------------------
#  Autor: Wecoc
#  Créditos no requeridos
#------------------------------------------------------------------------------
=begin

Éste script añade la opción de poner alturas en los mapas.

*CÓMO FUNCIONA EL SCRIPT

  Todos los mapas en los que puedas saltar y haya posibles problemas de altura,
  como acantilados, requerirán un gráfico especial en Pictures.

  Éste gráfico deberá tener el mismo tamaño en píxeles que el mapa en tiles.

*CÓMO HACER EL GRÁFICO

  Cada píxel es un tile, y tendrá la altura que tú le asignes según el color.
  El código lee solo el valor rojo de cada color.
  Una diferencia de 32 corresponderá a una altura menos, empezando por 256 (255)
  como altura máxima hasta 32 como altura mínima. El valor 0, 0, 0 está reservado
  para esos casos en los que no se pueda saltar allí (por ejemplo el panorama)
      Rojo        Altura
      256(255)-->  8
      224    -->  7
      192    -->  6
      160    -->  5
      128    -->  4
      96      -->  3
      64      -->  2
      32      -->  1
   
*CÓMO CARGAR EL GRÁFICO AL MAPA QUE LE CORRESPONDE

  Busca la línea que empieza por JUMP_MAP = {
  Allí se cargan los mapas.

=end
#==============================================================================


class Game_Map
 
  attr_reader :jump_map
 
              # ID mapa => nombre del gráfico Jump Map a cargar
  JUMP_MAP =  { 1 => "map1",
                2 => "map2" }
 
  alias jump_map_setup setup unless $@
  def setup(map_id)
    jump_map_setup(map_id)
    @jump_map = nil
    if JUMP_MAP[$game_map.map_id] != nil
      @jump_map = Bitmap_Layer.new("Jump Map", JUMP_MAP[$game_map.map_id], 32)
    end
  end
end

class Game_Character
 
  def jump(x_plus, y_plus)
    if x_plus != 0 or y_plus != 0
      if x_plus.abs > y_plus.abs
        x_plus < 0 ? jump_left(x_plus, y_plus) : jump_right(x_plus, y_plus)
      else
        y_plus < 0 ? jump_up(x_plus, y_plus)  : jump_down(x_plus, y_plus)
      end
    end
  end
 
  def jump_down(x_plus, y_plus)
    turn_down
    new_x = @x + x_plus
    new_y = @y + y_plus
    if $game_map.jump_map == nil
      height = 1
      new_height = 1
    else
      height = ($game_map.jump_map.red(@x, @y) / 32).ceil
      new_height = ($game_map.jump_map.red(new_x, new_y) / 32).ceil
    end
    # No puedes saltar a tiles más altos
    if new_height > height
      return
    end
    # Si saltas a tiles más bajos new_y aumenta 1
    loop do
      if height > new_height
        height -= 1
        new_y += 1
        new_height = ($game_map.jump_map.red(new_x, new_y) / 32).ceil
        if passable?(new_x, new_y, 0)
          break
        end
      else
        break
      end
    end
    # No puedes saltar al vacío
    if new_height == 0
      return
    end
    # Salto default con las coordenadas arregladas
    default_jump(x_plus, y_plus, new_x, new_y)
  end
 
  def jump_right(x_plus, y_plus)
    turn_right
    new_x = @x + x_plus
    new_y = @y + y_plus
    if $game_map.jump_map == nil
      height = 1
      new_height = 1
    else
      height = ($game_map.jump_map.red(@x, @y) / 32).ceil
      new_height = ($game_map.jump_map.red(new_x, new_y) / 32).ceil
    end
    # No puedes saltar a tiles más altos
    if new_height > height
      return
    end
    # Si saltas a tiles más bajos new_y aumenta 1 u new_x queda alterado
    if height > new_height
      new_x = @x + 1
      new_height = ($game_map.jump_map.red(new_x, new_y) / 32).ceil
      if height == new_height
        return # Puedes cambiar este return por new_x += 1
      end
      loop do
        new_height = ($game_map.jump_map.red(new_x, new_y) / 32).ceil
        if height > new_height
          height -= 1
          new_y += 1
        else
          break
        end
      end
    end
    # No puedes saltar al vacío
    if new_height == 0
      return
    end
    # Salto default con las coordenadas arregladas
    default_jump(x_plus, y_plus, new_x, new_y)
  end
 
  def jump_left(x_plus, y_plus)
    turn_left
    new_x = @x + x_plus
    new_y = @y + y_plus
    if $game_map.jump_map == nil
      height = 1
      new_height = 1
    else
      height = ($game_map.jump_map.red(@x, @y) / 32).ceil
      new_height = ($game_map.jump_map.red(new_x, new_y) / 32).ceil
    end
    # No puedes saltar a tiles más altos
    if new_height > height
      return
    end
    # Si saltas a tiles más bajos new_y aumenta 1 u new_x queda alterado
    if height > new_height
      new_x = @x - 1
      new_height = ($game_map.jump_map.red(new_x, new_y) / 32).ceil
      if height == new_height
        return # Puedes cambiar este return por new_x += 1
      end
      loop do
        new_height = ($game_map.jump_map.red(new_x, new_y) / 32).ceil
        if height > new_height
          height -= 1
          new_y += 1
        else
          break
        end
      end
    end
    # No puedes saltar al vacío
    if new_height == 0
      return
    end
    # Salto default con las coordenadas arregladas
    default_jump(x_plus, y_plus, new_x, new_y)
  end
 
  def jump_up(x_plus, y_plus)
    turn_up
    new_x = @x + x_plus
    new_y = @y + y_plus
    if $game_map.jump_map == nil
      height = 1
      new_height = 1
    else
      height = ($game_map.jump_map.red(@x, @y) / 32).ceil
      new_height = ($game_map.jump_map.red(new_x, new_y) / 32).ceil
    end
    # No puedes saltar a tiles más altos
    if new_height > height
      return
    end
    # No puedes saltar a tiles mucho más bajos
    if height > new_height + 1
      return
    end
    # Si saltas a tiles más bajos new_y aumenta 1
    if height > new_height
      new_y += 1
      new_height = ($game_map.jump_map.red(new_x, new_y) / 32).ceil
    end
    # No puedes saltar al vacío
    if new_height == 0
      return
    end
    # Salto default con las coordenadas arregladas
    default_jump(x_plus, y_plus, new_x, new_y)
  end
 
  def no_height_jump(x_plus, y_plus)
    if x_plus != 0 or y_plus != 0
      if x_plus.abs > y_plus.abs
        x_plus < 0 ? turn_left : turn_right
      else
        y_plus < 0 ? turn_up : turn_down
      end
    end
    new_x = @x + x_plus
    new_y = @y + y_plus
    default_jump(x_plus, y_plus, new_x, new_y)
  end
 
  def default_jump(x_plus, y_plus, new_x, new_y)
    if (x_plus == 0 and y_plus == 0) or passable?(new_x, new_y, 0)
      straighten
      @x = new_x
      @y = new_y
      distance = Math.sqrt(x_plus ** 2 + y_plus ** 2).round
      @jump_peak = 10 + distance - @move_speed
      @jump_count = @jump_peak * 2
      @stop_count = 0
    end
  end
end


Demo: Salto por Altura


Última edición por Wecoc el 2014-04-15, 11:32, editado 1 vez
avatar
Wecoc
Administrador
Administrador



Créditos 12203

Gracias : 632

Volver arriba Ir abajo

Re: [XP] Salto por mapa de alturas

Mensaje por orochii el 2014-04-13, 03:21

Mmm... ¿sabes que me estoy pensando en meter este script en mi Dreki xD? Ésto es un dilema que tenía con mis saltos, que pos no he hecho salto hacia "abajo". CREO en algún momento había pensado en una solución, pero ya se me olvidó mi idea 8'D... MALDICIÓN x'D.
Éste se oye interesante porque es independiente de los datos existentes. E incluso se podría optimizar, y hacerle un editor. Digo, es dibujar un Spriteset, mover un chara por el mapa, y guardar un valor en una tabla de acuerdo a la posición X/Y. Incluso se puede tomar un proyecto default, se hace lo de meter las cosas en la Table y guardarlas en un MapHeightsXXX.rxdata, y voilà!

Si te lo hago, ¿le harías soporte Wec xD?
https://dl.dropboxusercontent.com/u/13006190/Height%20Editor.7z
avatar
orochii
Reportero

0/3

Créditos 7703

Gracias : 432

Volver arriba Ir abajo

Re: [XP] Salto por mapa de alturas

Mensaje por Wecoc el 2014-04-13, 10:55

Normalmente lo soporto todo (?), lo que pasa es que no quisiera complicarme porque de Height System de éstos ya hay uno de LittleDrago (creo que era de él) pero es tremendamente complejo, por ésto hice éste que es como 1000 veces más sencillo, es que el suyo directamente no lo entiendo xD Claro, si ahora complicamos mucho éste... u_u" Aunque supongo que se pueden hacer las dos versiones xD

Quizá desde el editor del maker (me costó ver que era con Q y W xD) sea más cómodo que desde un editor de imágenes, pero la pregunta es si vale la pena. Tampoco sé si a lo que tienes le falta mucho por hacer o no...

En fin, gracias Orochii. Si quieres tirarlo p'alante tú mismo xD de momento no le vi ningún bug.
avatar
Wecoc
Administrador
Administrador



Créditos 12203

Gracias : 632

Volver arriba Ir abajo

Re: [XP] Salto por mapa de alturas

Mensaje por orochii el 2014-04-13, 15:28

Mi idea con el editor era ahorrarse el hacer get_pixel, y bueno, lo de que fuera más visual. Pero igual, siempre siento algo mal en esto de los editores custom. No sé, quedan tan abstraídos del entorno del maker...
Pero diay, Enterbrain no ha hecho algo así como plugins para el editor. \(-_-)/

Ahora mismo es funcional.
Q: -1 a la ubicación actual
W: +1 a la ubicación actual
D: Guardar tabla en archivo (HeightMapXXX.rxdata)

La estructura de los datos es simplemente una Table, ordenada en X/Y. Para cargar los datos usas
data = load_data(filename)

Ahora que faltan algunas cosas para mejorar la interfaz.
Primero, falta un menú para seleccionar mapa. Por ahora usa la posición inicial xd.
Y segundo, el soporte de mouse agilizaría el proceso.
¡Ah! Y me faltó una leyenda con los controles xD.

Pero bueno, la interfaz ya me encargaré :P.
avatar
orochii
Reportero

0/3

Créditos 7703

Gracias : 432

Volver arriba Ir abajo

Re: [XP] Salto por mapa de alturas

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.