Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[Incompleto] Movimiento a medio paso

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [Incompleto] Movimiento a medio paso

Mensaje por orochii el 2014-02-08, 19:17

¡Hola! Bueno, recordando dos cosas (algunos juegos de SNES y el BlizzABS), así como en el WolfRPG, recordé que en éstos los personajes se mueven a medio paso. No es pixel-perfect, pero para mí es suficiente. A mí lo que me molesta es que 32x32 es demasiado grande xD (peor en 7thSaga donde creo es movimiento de 32x32 -o quiza más-, en resolución 256x224 -SNES-).

En fin, lo que he logrado es arreglar problemas de pasabilidad (hasta donde sé), e implementar el medio paso de la forma más simple que me vino en mente x'D. Sumando 0.5 a X/Y al mover al héroe x'D. Funciona, pero seguro hay bugs.

Por eso está incompleto, aer si alguien quiere probar tons y así eliminamos bugs juntos =DD (?).
Código:
class Game_Map
  #--------------------------------------------------------------------------
  # * Get Designated Position Event ID
  #    x          : x-coordinate
  #    y          : y-coordinate
  #--------------------------------------------------------------------------
  def check_event(x, y)
    for event in $game_map.events.values
      # If event coordinates are consistent with move destination
      x_range = (event.x-0.5 <= new_x)&&(event.x+0.5 >= new_x)
      y_range = (event.y-0.5 <= new_y)&&(event.y+0.5 >= new_y)
      #if (event.x == new_x and event.y == new_y)
      if (x_range && y_range)
        return event.id
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Determine Valid Coordinates
  #    x          : x-coordinate
  #    y          : y-coordinate
  #--------------------------------------------------------------------------
  def valid?(x, y)
    x = x.ceil if x<0
    y = y.ceil if y<0
    return (x >= 0 and x < width and y >= 0 and y < height)
  end
 
  def passable?(x, y, d, self_event = nil, xtop=false, ytop=false)
    # If coordinates given are outside of the map
    unless valid?(x, y)
      # impassable
      return false
    end
    # Change direction (0,2,4,6,8,10) to obstacle bit (0,1,2,4,8,0)
    bit = (1 << (d / 2 - 1)) & 0x0f
   
    r_side = self_event.x > (x.floor)
    b_side = self_event.y > (y.floor)   
    x_intersect = x.floor != x
    y_intersect = y.floor != y
   
    # Loop in all events
    for event in events.values
      # If tiles other than self are consistent with coordinates
      if event.tile_id >= 0 and event != self_event and not event.through
       
        #tile_id = event.tile_id
        #x = event.x
        #y = event.y
        if(x_intersect==false)&&(bit&0b1001 != 0) && xtop==false
          return false if (@passages[event.tile_id]&0b0010 != 0) if r_side==false#2 if top=0
         
        elsif(x_intersect==true)&&(bit&0b1001 != 0) && xtop==true
          return false if (@passages[event.tile_id]&0b0100 != 0) if r_side==true #4 if top=1
        end
       
        if(y_intersect==false)&&(bit&0b0110 != 0) && ytop==false
          return false if (@passages[event.tile_id]&0b1000 != 0) if b_side==false#8 if top=0
         
        elsif(y_intersect==true)&&(bit&0b0110 != 0) && ytop==true
          return false if (@passages[event.tile_id]&0b0001 != 0) if b_side==true #1 if top=0
        end
       
        if (@passages[event.tile_id] & bit) != 0
          a = (@passages[event.tile_id] & bit)
          return false if (a==1) && (y_intersect==true)
          return false if (a==2) && (x_intersect==false)
          return false if (a==4) && (x_intersect==true)
          return false if (a==8) && (y_intersect==false)
         
        # If obstacle bit is set in all directions
        elsif @passages[event.tile_id] & 0x0f == 0x0f
          # impassable
          return false
        end
       
      end
    end
   
    # Loop searches in order from top of layer
    for i in [2, 1, 0]
      # Get tile ID
      tile_id = data[x.floor, y.floor, i]
     
      # Tile ID acquistion failure
      if tile_id == nil
        # impassable
        return false
      end
     
      if(x_intersect==false)&&(bit&0b1001 != 0) && xtop==false
        return false if (@passages[tile_id]&0b0010 != 0) if r_side==false#2 if top=0
       
      elsif(x_intersect==true)&&(bit&0b1001 != 0) && xtop==true
        return false if (@passages[tile_id]&0b0100 != 0) if r_side==true #4 if top=1
      end
     
      if(y_intersect==false)&&(bit&0b0110 != 0) && ytop==false
        return false if (@passages[tile_id]&0b1000 != 0) if b_side==false#8 if top=0
       
      elsif(y_intersect==true)&&(bit&0b0110 != 0) && ytop==true
        return false if (@passages[tile_id]&0b0001 != 0) if b_side==true #1 if top=0
      end
     
      if (@passages[tile_id] & bit) != 0
        a = (@passages[tile_id] & bit)
        return false if (a==1) && (y_intersect==true)
        return false if (a==2) && (x_intersect==false)
        return false if (a==4) && (x_intersect==true)
        return false if (a==8) && (y_intersect==false)
        #print sprintf("%#04b : %#04b : %#04b",@passages[tile_id],bit,bset.to_i)
        # impassable
        #return false #if (@passages[tile_id] & bset.to_i != 0)
       
      # If obstacle bit is set in all directions
      elsif @passages[tile_id] & 0x0f == 0x0f
        # impassable
        return false
      # If priorities other than that are 0
      elsif @priorities[tile_id] == 0
        # passable
        return true
      end
     
    end
    # passable
    return true
  end
 
end

class Game_Player
  #--------------------------------------------------------------------------
  # * Same Position Starting Determinant
  #--------------------------------------------------------------------------
  def check_event_trigger_here(triggers)
    result = false
    # If event is running
    if $game_system.map_interpreter.running?
      return result
    end
    # All event loops
    for event in $game_map.events.values
      # If event coordinates are consistent with move destination
      x_range = (event.x-0.5 <= @x)&&(event.x+0.5 >= @x)
      y_range = (event.y-0.5 <= @y)&&(event.y+0.5 >= @y)
      #if (event.x == new_x and event.y == new_y)
      if (x_range && y_range) && triggers.include?(event.trigger)
        # If starting determinant is same position event (other than jumping)
        if not event.jumping? and event.over_trigger?
          event.start
          result = true
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Front Envent Starting Determinant
  #--------------------------------------------------------------------------
  def check_event_trigger_there(triggers)
    result = false
    # If event is running
    if $game_system.map_interpreter.running?
      return result
    end
    # Calculate front event coordinates
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    # All event loops
    for event in $game_map.events.values
      # If event coordinates are consistent with move destination
      x_range = (event.x-0.5 <= new_x)&&(event.x+0.5 >= new_x)
      y_range = (event.y-0.5 <= new_y)&&(event.y+0.5 >= new_y)
      #if (event.x == new_x and event.y == new_y)
      if (x_range && y_range) and triggers.include?(event.trigger)
        # If starting determinant is front event (other than jumping)
        if not event.jumping? and not event.over_trigger?
          event.start
          result = true
        end
      end
    end
    # If fitting event is not found
    if result == false
      # If front tile is a counter
      if $game_map.counter?(new_x, new_y)
        # Calculate 1 tile inside coordinates
        new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
        new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
        # All event loops
        for event in $game_map.events.values
          # If event coordinates are consistent with move destination
          x_range = (event.x-0.5 <= new_x)&&(event.x+0.5 >= new_x)
          y_range = (event.y-0.5 <= new_y)&&(event.y+0.5 >= new_y)
          #if (event.x == new_x and event.y == new_y)
          if (x_range && y_range) and triggers.include?(event.trigger)
            # If starting determinant is front event (other than jumping)
            if not event.jumping? and not event.over_trigger?
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Touch Event Starting Determinant
  #--------------------------------------------------------------------------
  def check_event_trigger_touch(x, y)
    result = false
    # If event is running
    if $game_system.map_interpreter.running?
      return result
    end
    # All event loops
    for event in $game_map.events.values
      # If event coordinates are consistent with move destination
      x_range = (event.x-0.5 <= @x)&&(event.x+0.5 >= @x)
      y_range = (event.y-0.5 <= @y)&&(event.y+0.5 >= @y)
      #if (event.x == new_x and event.y == new_y)
      if (x_range && y_range) and [1,2].include?(event.trigger)
        # If starting determinant is front event (other than jumping)
        if not event.jumping? and not event.over_trigger?
          event.start
          result = true
        end
      end
    end
    return result
  end
end

#==============================================================================
# ** Game_Character (part 1)
#------------------------------------------------------------------------------
#  This class deals with characters. It's used as a superclass for the
#  Game_Player and Game_Event classes.
#==============================================================================

class Game_Character
  MOVE_SIZE = 0.5
  #--------------------------------------------------------------------------
  # * Determine if Passable
  #    x : x-coordinate
  #    y : y-coordinate
  #    d : direction (0,2,4,6,8)
  #        * 0 = Determines if all directions are impassable (for jumping)
  #--------------------------------------------------------------------------
  def passable?(x, y, d)
    xx = x
    yy = y
    for i in [0,0.5]
      for j in [0,0.5]
        x = xx+i
        y = yy+j
        # Get new coordinates
        new_x = x + (d == 6 ? MOVE_SIZE : d == 4 ? -MOVE_SIZE : 0)
        new_y = y + (d == 2 ? MOVE_SIZE : d == 8 ? -MOVE_SIZE : 0)
       
        # If coordinates are outside of map
        unless $game_map.valid?(new_x, new_y)
          # -im- actually passable! just for lulz (?)
          return true #false
        end
        # If through is ON
        if @through
          # passable
          return true
        end
       
        # If unable to leave first move tile in designated direction
        unless ( $game_map.passable?(x, y, d, self, true, true) )
          # impassable
          return false
        end
       
        # If unable to enter move tile in designated direction
        unless ( $game_map.passable?(new_x, new_y, 10 - d, self, i==0, j==0) )
          # impassable
          return false
        end
       
        for k in [0,0.5]
          for l in [0,0.5]
            # Loop all events
            for event in $game_map.events.values
              # If event coordinates are consistent with move destination
              if (event.x==new_x-k and event.y==new_y-l)
                # If through is OFF
                unless event.through
                  # If self is event
                  if self != $game_player
                    # impassable
                    return false
                  end
                  # With self as the player and partner graphic as character
                  if event.character_name != ""
                    # impassable
                    return false
                  end
                end
              end
            end
            # If player coordinates are consistent with move destination
            if ( ($game_player.x==new_x-k) and ($game_player.y==new_y-l) ) && !(self.is_a?(Game_Player))
              # If through is OFF
              unless $game_player.through
                # If your own graphic is the character
                if @character_name != ""
                  # impassable
                  return false
                end
              end
            end
          end #for l
        end #for k
      end
    end
    # passable
    return true
  end
  #--------------------------------------------------------------------------
  # * Move Down
  #    turn_enabled : a flag permits direction change on that spot
  #--------------------------------------------------------------------------
  def move_down(turn_enabled = true)
    # Turn down
    if turn_enabled
      turn_down
    end
    # If passable
    if passable?(@x, @y, 2)
      # Turn down
      turn_down
      # Update coordinates
      @y += 0.5
      # Increase steps
      increase_steps
    # If impassable
    else
      # Determine if touch event is triggered
      check_event_trigger_touch(@x, @y+1)
    end
  end
  #--------------------------------------------------------------------------
  # * Move Left
  #    turn_enabled : a flag permits direction change on that spot
  #--------------------------------------------------------------------------
  def move_left(turn_enabled = true)
    # Turn left
    if turn_enabled
      turn_left
    end
    # If passable
    if passable?(@x, @y, 4)
      # Turn left
      turn_left
      # Update coordinates
      @x -= 0.5
      # Increase steps
      increase_steps
    # If impassable
    else
      # Determine if touch event is triggered
      check_event_trigger_touch(@x-1, @y)
    end
  end
  #--------------------------------------------------------------------------
  # * Move Right
  #    turn_enabled : a flag permits direction change on that spot
  #--------------------------------------------------------------------------
  def move_right(turn_enabled = true)
    # Turn right
    if turn_enabled
      turn_right
    end
    # If passable
    if passable?(@x, @y, 6)
      # Turn right
      turn_right
      # Update coordinates
      @x += 0.5
      # Increase steps
      increase_steps
    # If impassable
    else
      # Determine if touch event is triggered
      check_event_trigger_touch(@x+1, @y)
    end
  end
  #--------------------------------------------------------------------------
  # * Move up
  #    turn_enabled : a flag permits direction change on that spot
  #--------------------------------------------------------------------------
  def move_up(turn_enabled = true)
    # Turn up
    if turn_enabled
      turn_up
    end
    # If passable
    if passable?(@x, @y, 8)
      # Turn up
      turn_up
      # Update coordinates
      @y -= 0.5
      # Increase steps
      increase_steps
    # If impassable
    else
      # Determine if touch event is triggered
      check_event_trigger_touch(@x, @y-1)
    end
  end
  #--------------------------------------------------------------------------
  # * Move Lower Left
  #--------------------------------------------------------------------------
  def move_lower_left
    # If no direction fix
    unless @direction_fix
      # Face down is facing right or up
      @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
    end
    # When a down to left or a left to down course is passable
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or
      (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))
      # Update coordinates
      @x -= 0.5
      @y += 0.5
      # Increase steps
      increase_steps
    end
  end
  #--------------------------------------------------------------------------
  # * Move Lower Right
  #--------------------------------------------------------------------------
  def move_lower_right
    # If no direction fix
    unless @direction_fix
      # Face right if facing left, and face down if facing up
      @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
    end
    # When a down to right or a right to down course is passable
    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or
      (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))
      # Update coordinates
      @x += 0.5
      @y += 0.5
      # Increase steps
      increase_steps
    end
  end
  #--------------------------------------------------------------------------
  # * Move Upper Left
  #--------------------------------------------------------------------------
  def move_upper_left
    # If no direction fix
    unless @direction_fix
      # Face left if facing right, and face up if facing down
      @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
    end
    # When an up to left or a left to up course is passable
    if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or
      (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))
      # Update coordinates
      @x -= 0.5
      @y -= 0.5
      # Increase steps
      increase_steps
    end
  end
  #--------------------------------------------------------------------------
  # * Move Upper Right
  #--------------------------------------------------------------------------
  def move_upper_right
    # If no direction fix
    unless @direction_fix
      # Face right if facing left, and face up if facing down
      @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
    end
    # When an up to right or a right to up course is passable
    if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or
      (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))
      # Update coordinates
      @x += 0.5
      @y -= 0.5
      # Increase steps
      increase_steps
    end
  end
end


Espero que les interese, al menos Wecoquete, yu arr ma salveeshon!man (?¿).

UPDATE RECIENTE: Supuestamente ahora funcionan las direcciones de bloqueo. Probar plz (?).


Última edición por orochii el 2014-05-03, 16:26, editado 5 veces
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por Wecoc el 2014-02-08, 20:15

Vi dos bug bastante importantes.

El primero es que cuando te acercas a las esquinas de arriba y a la izquierda, no llega hasta el primer tile sinó hasta el segundo. Eso hace que, a parte de que no pueda acercarse a la esquina, los teletransportadores y esas cosas no van bien.

El segundo es que por ejemplo si pones dos teletransportadores de lado y tienes la mala pata que ir justo en medio no te teletransportas ya que el evento solo se activa si estás justo encima.
avatar
Wecoc
Administrador
Administrador



Créditos 12314

Gracias : 655

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por orochii el 2014-02-08, 20:31

Ok, bugs solucionados. He hecho éste código:
Código:
class Game_Map
  #--------------------------------------------------------------------------
  # * Get Designated Position Event ID
  #     x          : x-coordinate
  #     y          : y-coordinate
  #--------------------------------------------------------------------------
  def check_event(x, y)
    for event in $game_map.events.values
      # If event coordinates are consistent with move destination
      x_range = (event.x-0.5 <= new_x)&&(event.x+0.5 >= new_x)
      y_range = (event.y-0.5 <= new_y)&&(event.y+0.5 >= new_y)
      #if (event.x == new_x and event.y == new_y)
      if (x_range && y_range)
        return event.id
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Determine Valid Coordinates
  #     x          : x-coordinate
  #     y          : y-coordinate
  #--------------------------------------------------------------------------
  def valid?(x, y)
    x = x.ceil if x<0
    y = y.ceil if y<0
    return (x >= 0 and x < width and y >= 0 and y < height)
  end
end

class Game_Player
  #--------------------------------------------------------------------------
  # * Same Position Starting Determinant
  #--------------------------------------------------------------------------
  def check_event_trigger_here(triggers)
    result = false
    # If event is running
    if $game_system.map_interpreter.running?
      return result
    end
    # All event loops
    for event in $game_map.events.values
      # If event coordinates are consistent with move destination
      x_range = (event.x-0.5 <= @x)&&(event.x+0.5 >= @x)
      y_range = (event.y-0.5 <= @y)&&(event.y+0.5 >= @y)
      #if (event.x == new_x and event.y == new_y)
      if (x_range && y_range)
        # If starting determinant is same position event (other than jumping)
        if not event.jumping? and event.over_trigger?
          event.start
          result = true
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Front Envent Starting Determinant
  #--------------------------------------------------------------------------
  def check_event_trigger_there(triggers)
    result = false
    # If event is running
    if $game_system.map_interpreter.running?
      return result
    end
    # Calculate front event coordinates
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    # All event loops
    for event in $game_map.events.values
      # If event coordinates are consistent with move destination
      x_range = (event.x-0.5 <= new_x)&&(event.x+0.5 >= new_x)
      y_range = (event.y-0.5 <= new_y)&&(event.y+0.5 >= new_y)
      #if (event.x == new_x and event.y == new_y)
      if (x_range && y_range) and triggers.include?(event.trigger)
        # If starting determinant is front event (other than jumping)
        if not event.jumping? and not event.over_trigger?
          event.start
          result = true
        end
      end
    end
    # If fitting event is not found
    if result == false
      # If front tile is a counter
      if $game_map.counter?(new_x, new_y)
        # Calculate 1 tile inside coordinates
        new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
        new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
        # All event loops
        for event in $game_map.events.values
          # If event coordinates are consistent with move destination
          x_range = (event.x-0.5 <= new_x)&&(event.x+0.5 >= new_x)
          y_range = (event.y-0.5 <= new_y)&&(event.y+0.5 >= new_y)
          #if (event.x == new_x and event.y == new_y)
          if (x_range && y_range) and triggers.include?(event.trigger)
            # If starting determinant is front event (other than jumping)
            if not event.jumping? and not event.over_trigger?
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Touch Event Starting Determinant
  #--------------------------------------------------------------------------
  def check_event_trigger_touch(x, y)
    result = false
    # If event is running
    if $game_system.map_interpreter.running?
      return result
    end
    # All event loops
    for event in $game_map.events.values
      # If event coordinates are consistent with move destination
      x_range = (event.x-0.5 <= @x)&&(event.x+0.5 >= @x)
      y_range = (event.y-0.5 <= @y)&&(event.y+0.5 >= @y)
      #if (event.x == new_x and event.y == new_y)
      if (x_range && y_range) and [1,2].include?(event.trigger)
        # If starting determinant is front event (other than jumping)
        if not event.jumping? and not event.over_trigger?
          event.start
          result = true
        end
      end
    end
    return result
  end
end
- Modificación al chequeo de coordenadas al verificar triggers xd.
- Modificación al chequeo de si una coordenada es válida (x/y dentro del rango de coordenadas válidas -0 a AnchoMapa para X, 0 a AltoMapa para Y-). Simplemente, x/y.ceil si valor < 0. xD.

En 3zsegundos actualizo el post principal.

EDIT: Listo, actualizado. Ahora que... hay una "feature" extra que me gustaría hacer xd, pero me gana un poco la pereza xD. Saben, medios pasos, sí. Pero y qué tal "medios tiles". Al estilo WolfRPG.

Pero... con eso hay dos cosas a solucionar, xD. Interfaz para setearlo (puede hacerse un editor externo, pero... no sé, no me gusta xd), y luego hay que hacerle unos cambiecillos al Game_Map#passability. El que hice se puede usar como base, puesto que hace las cuatro revisiones a los cuatro cuadrantes. Pero igual :V.
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por Wecoc el 2014-02-08, 22:46

Otro error, con el nuevo script que pusiste: cuando paso por encima de un evento que está en proceso paralelo sale ésto.



Como ves más que ayudar de momento solo voy tirando piedras al script xD es que aún no me puse a mirar como va y tal.

Lo del nuevo método de pasabilidad se podría hacer en el Scene_Debug como hicimos en los hextiles, pero quizá poner lo del ratón solo para eso no sea buena idea. Aún así también podía ir sin ratón, creo.
avatar
Wecoc
Administrador
Administrador



Créditos 12314

Gracias : 655

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por orochii el 2014-02-09, 01:11

Yessss!. Gracias Wecoc. Y bueno, en realidad con tirar piedras ayudas xD.
Mira a ver si lo habré solucionado, en buena teoría era un check mal hecho xd. A mí no me da problemas en mi proyecto de pruebas, pero puede que sea alguna tontería que olvidé... :'D?.

También arreglé un bug con los eventos activados en toda colisión (trigger #2 contando el cero).

Spoiler:
El script en realidad es bastante simple. Ayer cuando dormía me vino a la cabeza, "¿qué pasa si cada paso suma/resta 0.5 en lugar de 1?". Y eso es básicamente xD. move_left, por ejemplo, resta 0.5 al X. Mágicamente, funciona xD, yo pensé que tendría que arreglar el movable?, que revisa si el real_x/real_y son divisibles entre 128, y hasta ahora, nop xD! (seguro me hará backstab dentro de algún rato).

El resto de cosas es arreglar situaciones como "no existe tile en 0.5, sólo en 1 y 0" (es un Table, y como has de imaginar, un Table no tiene miembro 0.5 xD). En esos casos, simplemente chequeo un rango, como un bounding box, en lugar de coordenadas específicas (de x-0.5 a x+0.5 por ejemplo). Ídem para activación de eventos y tal.
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por Wecoc el 2014-02-09, 02:09

Me seguía dando error pero ya lo arreglé, era una tontería xDD

En check_event_trigger_here tenías una condición que ponía
Código:
if (x_range && y_range)
Si lo cambias por
Código:
if (x_range && y_range) and triggers.include?(event.trigger)
Ya funciona bien.

Como idea de mejora (tomarla en cuenta o no es tu decisión xD), estaría bien que los eventos tuvieran la opción de ser activados solo desde el punto en concreto (como lo tenías al principio) o bien desde el rango completo (como lo tienes ahora). En teletransportadores y cosas de ese estilo queda mejor que esté a rango completo como dije antes, pero en otros eventos quizá no.
avatar
Wecoc
Administrador
Administrador



Créditos 12314

Gracias : 655

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por luistop12 el 2014-02-09, 04:01

por el amor de dios diganme que funciona en VX D:, Estoy harto del movimiento 32x32 D:.

EDIT:No funciona en vx D:.
avatar
luistop12
Veterano
Veterano

0/3

Créditos 1197

Gracias : 32

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por orochii el 2014-02-09, 04:35

@Wecoc: Estaba seguro que eso de los check_triggers_(inserte cosa aquí) los había arreglado todos "OTL. Ahorita lo arreglo.
@luistop: Aaaah no, no funciona en VX, ni en Ace. Es una cosa un poco específica para el cómo maneja el RMXP las posiciones y tal (y/o los nombres de las funciones x'D).

En buena teoría PODRÍA hacerse, en la misma forma en que está hecho éste. Pero no me conozco las clases tan bien en VX/A xD, así que no sé si la idea sirve.
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por orochii el 2014-02-13, 02:27

UPDATE: He arreglado otro bug tonto. Los eventos se topaban con sí mismos x'D!!!!, y no se movían si no tenían el "modo atravesable" activado. x'D!.
Ésta línea en concreto, en Game_Character#passable?
Código:
if (x_range && y_range)
Simplemente pasó a ser
Código:
if (x_range && y_range) && (self != event)

xd.
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por Eron el 2014-02-13, 12:08

Me interesa lo de los medios tiles =O! Los O y X normales podrían servir si automáticamente se re-leyeran, algo así:

Código:
 OO   XX
 OO   XX

Y luego en el editor del Debug podrías cambiar cada uno de los cuatro y guardarlo así. Entonces podrías tener cosas hasta hora no posibles

Código:
 OX   XO
 XX   OX

La pregunta aquí está en si los cuadrados, los ~ (hierba alta), la prioridad y la pasabilidad por direcciones también estaría partida. Porque total por hacerlo así, quizá sale más rentable usar esa modificación de tamaño de tiles, ponerlos a 16x16 y trabajar por tiles pequeños y no subtiles.
avatar
Eron
Principiante
Principiante

0/3

Créditos 3599

Gracias : 60

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por orochii el 2014-02-13, 17:35

No pos, de hecho ya hay bugs con la pasabilidad por direcciones x'D (probablemente otra tontería que habré hecho "OTL -hay que reescribir la forma en que revisa eso-).

Y los ~ tienen un problema que esos dependen del renderizado del tilemap, lo hace a razón de tile, para cambiar eso mejor hacer lo que dices y usar el tile de 16x16.
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por orochii el 2014-05-03, 16:25

UPDATE: Al menos en mi Dreki he solucionado el problema con las direcciones. ME COSTÓ HORAS DE VIDA, SALUD, DINERO, DOLOR, y mucho, mucho queeeso (?).

Aquí el código que he generado y agregado.
Código:
  def passable?(x, y, d, self_event = nil, xtop=false, ytop=false)
    # If coordinates given are outside of the map
    unless valid?(x, y)
      # impassable
      return false
    end
    # Change direction (0,2,4,6,8,10) to obstacle bit (0,1,2,4,8,0)
    bit = (1 << (d / 2 - 1)) & 0x0f
   
    r_side = self_event.x > (x.floor)
    b_side = self_event.y > (y.floor)   
    x_intersect = x.floor != x
    y_intersect = y.floor != y
   
    # Loop in all events
    for event in events.values
      # If tiles other than self are consistent with coordinates
      if event.tile_id >= 0 and event != self_event and not event.through
       
        #tile_id = event.tile_id
        #x = event.x
        #y = event.y
        if(x_intersect==false)&&(bit&0b1001 != 0) && xtop==false
          return false if (@passages[event.tile_id]&0b0010 != 0) if r_side==false#2 if top=0
         
        elsif(x_intersect==true)&&(bit&0b1001 != 0) && xtop==true
          return false if (@passages[event.tile_id]&0b0100 != 0) if r_side==true #4 if top=1
        end
       
        if(y_intersect==false)&&(bit&0b0110 != 0) && ytop==false
          return false if (@passages[event.tile_id]&0b1000 != 0) if b_side==false#8 if top=0
         
        elsif(y_intersect==true)&&(bit&0b0110 != 0) && ytop==true
          return false if (@passages[event.tile_id]&0b0001 != 0) if b_side==true #1 if top=0
        end
       
        if (@passages[event.tile_id] & bit) != 0
          a = (@passages[event.tile_id] & bit)
          return false if (a==1) && (y_intersect==true)
          return false if (a==2) && (x_intersect==false)
          return false if (a==4) && (x_intersect==true)
          return false if (a==8) && (y_intersect==false)
         
        # If obstacle bit is set in all directions
        elsif @passages[event.tile_id] & 0x0f == 0x0f
          # impassable
          return false
        end
       
      end
    end
   
    # Loop searches in order from top of layer
    for i in [2, 1, 0]
      # Get tile ID
      tile_id = data[x.floor, y.floor, i]
     
      # Tile ID acquistion failure
      if tile_id == nil
        # impassable
        return false
      end
     
      if(x_intersect==false)&&(bit&0b1001 != 0) && xtop==false
        return false if (@passages[tile_id]&0b0010 != 0) if r_side==false#2 if top=0
       
      elsif(x_intersect==true)&&(bit&0b1001 != 0) && xtop==true
        return false if (@passages[tile_id]&0b0100 != 0) if r_side==true #4 if top=1
      end
     
      if(y_intersect==false)&&(bit&0b0110 != 0) && ytop==false
        return false if (@passages[tile_id]&0b1000 != 0) if b_side==false#8 if top=0
       
      elsif(y_intersect==true)&&(bit&0b0110 != 0) && ytop==true
        return false if (@passages[tile_id]&0b0001 != 0) if b_side==true #1 if top=0
      end
     
      if (@passages[tile_id] & bit) != 0
        a = (@passages[tile_id] & bit)
        return false if (a==1) && (y_intersect==true)
        return false if (a==2) && (x_intersect==false)
        return false if (a==4) && (x_intersect==true)
        return false if (a==8) && (y_intersect==false)
        #print sprintf("%#04b : %#04b : %#04b",@passages[tile_id],bit,bset.to_i)
        # impassable
        #return false #if (@passages[tile_id] & bset.to_i != 0)
       
      # If obstacle bit is set in all directions
      elsif @passages[tile_id] & 0x0f == 0x0f
        # impassable
        return false
      # If priorities other than that are 0
      elsif @priorities[tile_id] == 0
        # passable
        return true
      end
     
    end
    # passable
    return true
  end

Es HORRIBLE. Pero funciona. Al menos en mi Dreki, y en lo poco que he probado en "Es Lame" (es el proyecto 100% default que tenía más cerca x'D).

Dentro de 3zsegundos actualizo el post principal. Me encantaría de todo corazón (?) que lo probase alguien, pa ver si Orochii ha metido las patas. xD. Bastante común.
Prueben combinaciones de direcciones en los settings de tiles.

Como así.
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por Faye Valentine el 2014-06-15, 18:14

Bastante fluido, sí señor.

Me gustan ésta clase de scripts. Cortos, simples y funcionales. Snippets, en otras palabras.

Faye Valentine
Soñador
Soñador

0/3

Créditos 287

Gracias : 35

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

Mensaje por orochii el 2014-06-17, 04:15

Bueno, es que es un script que podría considerarse un workaround al cómo funcionan las coordenadas en el RPG Maker xD. Lo que hice fue inventar la existencia del medio-tile (o algo así). En el maker común, si no estás en tiles enteros, no estás en ningún lugar, lo que hace que traspases a lo hermoso (???). Éste script intenta solucionar eso.

SIN EMBARGO... Tras ese último update me dí cuenta (algo tarde pero sí xD) que sin la capacidad de dar propiedades a cada cuarto de tile por separado, el script tenía un cierto grado de infructibilidad (??).

Ésto lo observé sobre todo con movimiento diagonal, más específicamente en mis queridas escaleras <3 (hechas por engine, pero en fin :V). Como los tiles aún obtienen propiedades a partir de tiles enteros...


Lo cual hace al sistema un buen desperdicio. Pero en fin, ya lo completaré. Por algo dice el título: incompleto xD.
avatar
orochii
Reportero

0/3

Créditos 7343

Gracias : 477

Volver arriba Ir abajo

RPG Maker XP Re: [Incompleto] Movimiento a medio paso

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.