Salut !
Voici un script qui peut aider pour la création de plates-formes mobiles, c'est-à -dire pour des éléments qui se meuvent et sur lesquels le personnage peut grimper s’il a besoin de se déplacer tout en se reposant les papattes.
C’est pour faire ça :

Avec le héros pouvant tomber :

Ou encore pourquoi pas une sorte de chariot :

Ou sinon un monte-charge :

Bon il suffit de créer une nouvelle classe au-dessus de Main, appelée comme vous voulez, et d'y coller ce qui suit :
[spoiler]#PFv1, script créé par MGCaladtogel
class Game_Map
 attr_accessor :map
end
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
class Game_Character
 attr_accessor :surPF
 attr_accessor :numPF
 attr_accessor :x_sol
 attr_accessor :y_sol
 attr_accessor :vers_PF
 #--------------------------------------------------------------------------
 def initialize
  @id = 0
  @x = 0.0
  @y = 0.0
  @real_x = 0
  @real_y = 0
  @tile_id = 0
  @character_name = ""
  @character_hue = 0
  @opacity = 255
  @blend_type = 0
  @direction = 2
  @pattern = 0
  @move_route_forcing = false
  @through = false
  @animation_id = 0
  @transparent = false
  @original_direction = 2
  @original_pattern = 0
  @move_type = 0
  @move_speed = 4
  @move_frequency = 6
  @move_route = nil
  @move_route_index = 0
  @original_move_route = nil
  @original_move_route_index = 0
  @walk_anime = true
  @step_anime = false
  @direction_fix = false
  @always_on_top = false
  @anime_count = 0
  @stop_count = 0
  @jump_count = 0
  @jump_peak = 0
  @wait_count = 0
  @locked = false
  @prelock_direction = 0
  @surPF = false
  @numPF = 0
  @x_sol = 0
  @y_sol = 0
  @vers_PF = false
 end
 #--------------------------------------------------------------------------
 def passable?(x, y, d)
  new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  unless $game_map.valid?(new_x, new_y)
   return false
  end
  if @through
   return true
  end
  unless $game_map.passable?(x, y, d, self) or @surPF
   return false
  end
  unless $game_map.passable?(new_x, new_y, 10 - d)
   return false
  end
  for event in $game_map.events.values
   if event.x == new_x and event.y == new_y
    unless event.through
     if self != $game_player
      return false
     end
     if event.character_name != ""
      return false
     end
    end
   end
  end
  if $game_player.x == new_x and $game_player.y == new_y
   unless $game_player.through
    if @character_name != ""
     return false
    end
   end
  end
  return true
 end
 #--------------------------------------------------------------------------
 def screen_z(height = 0)
  if @always_on_top
   return 999
  end
  z = (@real_y - $game_map.display_y + 3) / 4 + 32
  z += 32 if (@surPF or @vers_PF)
  if @tile_id > 0
   return z + $game_map.priorities[@tile_id] * 32
else
return z + ((height > 32) ? 31 : 0)
end
end
#--------------------------------------------------------------------------
def check_surPF(x, y)
i = 0
for event in $game_map.events.values
if (event.real_x - 63 <= x) and (event.real_x + 63>= x) and (event.real_y - 95 <= y) and
(event.real_y + 31 >= y) and event.est_PF?
@surPF = true
i = event.id
end
end
if i == 0 and !@versPF
@surPF = false
end
return i
end
#--------------------------------------------------------------------------
def check_depl_surPF(x, y)
for event in $game_map.events.values
if (event.real_x - 63 <= x) and (event.real_x + 63>= x) and (event.real_y - 95 <= y) and
(event.real_y + 31 >= y) and event.est_PF?
return true
end
end
return false
end
#--------------------------------------------------------------------------
def check_depl_surPF2(x0,y0,x, y)
if !@surPF and !$game_map.valid?(x0, y0)
return false
end
for event in $game_map.events.values
if (event.real_x - 63 <= x) and (event.real_x + 63>= x) and (event.real_y - 95 <= y) and
(event.real_y + 31 >= y) and event.est_PF?
return true
end
end
return false
end
#--------------------------------------------------------------------------
def check_vide(x, y)
if $game_map.terrain_tag(x, y) == 1
return true
end
return false
end
#--------------------------------------------------------------------------
def move_down(turn_enabled = true)
if turn_enabled
turn_down
end
if passable?((@x+0.5).to_i, (@y+0.5).to_i, 2) or
check_depl_surPF2(@x,@y,@x*128,@y*128+128) or
$game_map.terrain_tag((@x+0.5).to_i, (@y+0.5).to_i+1) == 1
turn_down
if !@surPF
if check_depl_surPF(@x*128,@y*128+128) or check_vide(@x,@y+1)
@y_sol = @y
@x_sol = @x
@vers_PF = true if check_depl_surPF(@x*128,@y*128+128)
end
@y += 1
elsif !check_depl_surPF(@x*128,@y*128+128)
@vers_PF = false
@y = ((@real_y.to_f/128)+0.5).to_i + 1
@x = ((@real_x.to_f/128)+0.5).to_i
@move_speed = 4
else
@vers_PF = true
@y += 1.0
@move_speed = 4
end
increase_steps
else
check_event_trigger_touch(@x, @y+1)
end
end
#--------------------------------------------------------------------------
def move_left(turn_enabled = true)
if turn_enabled
turn_left
end
if passable?((@x+0.5).to_i, (@y+0.5).to_i, 4) or
check_depl_surPF2(@x*128,@y*128,@x*128-128,@y*128) or
$game_map.terrain_tag((@x+0.5).to_i-1, (@y+0.5).to_i) == 1
turn_left
if !@surPF
if check_depl_surPF(@x*128-128,@y*128) or check_vide(@x-1,@y)
@y_sol = @y
@x_sol = @x
@vers_PF = true if check_depl_surPF(@x*128-128,@y*128)
end
@x -= 1
elsif !check_depl_surPF(@x*128-128,@y*128)
@vers_PF = false
@y = ((@real_y.to_f/128)+0.5).to_i
@x = ((@real_x.to_f/128)+0.5).to_i - 1
@move_speed = 4
else
@vers_PF = true
@x -= 1.0
@move_speed = 4
end
increase_steps
else
check_event_trigger_touch(@x-1, @y)
end
end
#--------------------------------------------------------------------------
def move_right(turn_enabled = true)
if turn_enabled
turn_right
end
if passable?((@x+0.5).to_i, (@y+0.5).to_i, 6) or
check_depl_surPF2(@x*128,@y*128,@x*128+128,@y*128) or
$game_map.terrain_tag((@x+0.5).to_i+1, (@y+0.5).to_i) == 1
turn_right
if !@surPF
if check_depl_surPF(@x*128+128,@y*128) or check_vide(@x+1,@y)
@y_sol = @y
@x_sol = @x
@vers_PF = true if check_depl_surPF(@x*128+128,@y*128)
end
@x += 1
elsif !check_depl_surPF(@x*128+128,@y*128)
@vers_PF = false
@y = ((@real_y.to_f/128)+0.5).to_i
@x = ((@real_x.to_f/128)+0.5).to_i + 1
@move_speed = 4
else
@vers_PF = true
@x+= 1.0
@move_speed = 4
end
increase_steps
else
check_event_trigger_touch(@x+1, @y)
end
end
#--------------------------------------------------------------------------
def move_up(turn_enabled = true)
if turn_enabled
turn_up
end
if passable?((@x+0.5).to_i, (@y+0.5).to_i,

or
check_depl_surPF2(@x*128,@y*128,@x*128,@y*128-128) or
$game_map.terrain_tag((@x+0.5).to_i, (@y+0.5).to_i-1) == 1
turn_up
if !@surPF
if check_depl_surPF(@x*128,@y*128-128) or check_vide(@x,@y-1)
@y_sol = @y
@x_sol = @x
@vers_PF = true if check_depl_surPF(@x*128,@y*128-128)
end
@y -= 1
elsif !check_depl_surPF(@x*128,@y*128-128)
@vers_PF = false
@y = ((@real_y.to_f/128)+0.5).to_i - 1
@x = ((@real_x.to_f/128)+0.5).to_i
@move_speed = 4
else
@vers_PF = true
@y -= 1.0
@move_speed = 4
end
increase_steps
else
check_event_trigger_touch(@x, @y-1)
end
end
end
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
class Game_Event < Game_Character
attr_accessor :temps_pause
attr_accessor :liste_x
attr_accessor :liste_y
attr_accessor :liste_p
attr_accessor :nom
attr_accessor :num_phase
attr_accessor :phase_en_cours
attr_accessor :x_cible
attr_accessor :y_cible
attr_accessor :cmpt_temps
attr_accessor :PF_active
attr_accessor :etape_simple
attr_accessor :aller_simple
attr_accessor :num_dest_aller_simple
attr_accessor :boucle_simple
#--------------------------------------------------------------------------
def initialize(map_id, event)
super()
@map_id = map_id
@event = event
@id = @event.id
@erased = false
@starting = false
@through = true
@temps_pause = 0
@cmpt_temps = 0
@liste_x = []
  @liste_y = []
  @liste_p = []
  @num_phase = 0
  @phase_en_cours = false
  @x_cible = 0
  @y_cible = 0
  @nom = $game_map.map.events[@id].name
  if est_PF?
   @move_speed = ""
   val = ""
   liste_caracteres = nom.scan(/./)
   i = liste_caracteres.index("+") + 1
   @etape_simple = false
   @aller_simple = false
   @num_dest_aller_simple = 0
   @boucle_simple = false
   case liste_caracteres
   when "E"
    i+=2
    @etape_simple = true
   when "A"
    i+=1
    while liste_caracteres != "V"
     @num_dest_aller_simple = ""
     @num_dest_aller_simple = @num_dest_aller_simple + liste_caracteres
     i += 1
    end
    @num_dest_aller_simple = @num_dest_aller_simple.to_i
    i+=1
    @aller_simple = true
   when "B"
    i+=2
    @boucle_simple = true
   else
    i+=1
   end
   while liste_caracteres != "/"
    @move_speed = @move_speed + liste_caracteres
    i += 1
   end
   @move_speed = @move_speed.to_i
   i += 1
   while i < liste_caracteres.length
    if liste_caracteres == "P"
     @temps_pause = ""
     i+=1
     while liste_caracteres != "/" and i < liste_caracteres.length
      @temps_pause = @temps_pause + liste_caracteres
      i += 1
     end
     @temps_pause = @temps_pause.to_i
     i += 1
    else
     @temps_pause = 0
    end
    @liste_p.push(@temps_pause)
    break if i >= liste_caracteres.length
    while liste_caracteres != "_" and i < liste_caracteres.length
     val = val + liste_caracteres
     i += 1
    end
    @liste_x.push(val.to_i)
    val = ""
    i += 1
    while liste_caracteres != "/" and i < liste_caracteres.length
     val = val + liste_caracteres
     i += 1
    end
    @liste_y.push(val.to_i)
    val = ""
    i += 1
   end
   tot = 0
   for nb in @liste_x
    tot = tot + nb
   end
   @liste_x.push(-tot)
   tot = 0
   for nb in @liste_y
    tot = tot + nb
   end
   @liste_y.push(-tot)
   @liste_p.push(0) if @liste_x.length != @liste_p.length
  end
  @temps_pause = @liste_p[1]
  @PF_active = false
  moveto(@event.x, @event.y)
  refresh
 end
 #--------------------------------------------------------------------------
 def est_PF?
  return nom.include?("+")
 end
 #--------------------------------------------------------------------------
 def refresh
  new_page = nil
  unless @erased
   for page in @event.pages.reverse
    c = page.condition
    if c.switch1_valid and !est_PF?
     if $game_switches[c.switch1_id] == false
      next
     end
    end
    if c.switch2_valid and !est_PF?
     if $game_switches[c.switch2_id] == false
      next
     end
    end
    if c.variable_valid and !est_PF?
     if $game_variables[c.variable_id] < c.variable_value
      next
     end
    end
    if c.self_switch_valid and !est_PF?
     key = [@map_id, @event.id, c.self_switch_ch]
     if $game_self_switches[key] != true
      next
     end
    end
    new_page = page
    break
   end
  end
  if new_page == @page
   return
  end
  @page = new_page
  clear_starting
  if @page == nil
   @tile_id = 0
   @character_name = ""
   @character_hue = 0
   @move_type = 0
   @through = true
   @trigger = nil
   @list = nil
   @interpreter = nil
   return
  end
  @tile_id = @page.graphic.tile_id
  @character_name = @page.graphic.character_name
  @character_hue = @page.graphic.character_hue
  if @original_direction != @page.graphic.direction
   @direction = @page.graphic.direction
   @original_direction = @direction
   @prelock_direction = 0
  end
  if @original_pattern != @page.graphic.pattern
   @pattern = @page.graphic.pattern
   @original_pattern = @pattern
  end
  @opacity = @page.graphic.opacity
  @blend_type = @page.graphic.blend_type
  @move_type = @page.move_type
  if !est_PF?
   @move_speed = @page.move_speed
  end
  @move_frequency = @page.move_frequency
  @move_route = @page.move_route
  @move_route_index = 0
  @move_route_forcing = false
  @walk_anime = @page.walk_anime
  @step_anime = @page.step_anime
  @direction_fix = @page.direction_fix
  @through = @page.through
  @always_on_top = @page.always_on_top
  @trigger = @page.trigger
  @list = @page.list
  @interpreter = nil
  if @trigger == 4
   @interpreter = Interpreter.new
  end
  check_event_trigger_auto
 end
 #--------------------------------------------------------------------------
 def check_event_trigger_touch(x, y)
  if $game_system.map_interpreter.running?
   return
  end
  if @trigger == 2 and @x == ($game_player.x+0.5).to_i and @y == ($game_player.y+0.5).to_i
   if not jumping? and not over_trigger?
    start
   end
  end
 end
 #--------------------------------------------------------------------------
 def check_event_trigger_auto
  if @trigger == 2 and @x == ($game_player.x+0.5).to_i and @y == ($game_player.y+0.5).to_i
   if not jumping? and over_trigger?
    start
   end
  end
  if @trigger == 3
   start
  end
 end
 #--------------------------------------------------------------------------
 def update
  super
  check_event_trigger_auto
  if @interpreter != nil
   unless @interpreter.running?
    @interpreter.setup(@list, @event.id)
   end
   @interpreter.update
  end
  @PF_active = check_active_PF
  if @liste_x != [] and !@phase_en_cours and @PF_active
    @x_cible = @x + @liste_x[@num_phase]
    @y_cible = @y + @liste_y[@num_phase]
    @x += @liste_x[@num_phase]
    @y += @liste_y[@num_phase]
    @phase_en_cours = true
  end
  if @PF_active and @x_cible*128 == @real_x and @y_cible*128 == @real_y
   if @temps_pause != 0 and @cmpt_temps != @temps_pause
    @cmpt_temps += 1
   else
    @phase_en_cours = false
    @cmpt_temps = 0
    @num_phase += 1
    @num_phase = 0 if @num_phase == @liste_x.length
    @temps_pause = @liste_p[0]
    @temps_pause = @liste_p[@num_phase+1] if @num_phase < (@liste_x.length) - 1
    if @etape_simple
     desactiver_PF
     @PF_active = false
    end
    if @aller_simple and (@num_phase == @num_dest_aller_simple or @num_phase == 0)
     desactiver_PF
     @PF_active = false
    end
    if @boucle_simple and @num_phase == 0
     desactiver_PF
     @PF_active = false
    end
   end
  end
 end
 #--------------------------------------------------------------------------
 def screen_z(height = 0)
   z = super()
   if est_PF?
    z += 32
   end
   return z
  end
  #--------------------------------------------------------------------------
  def check_active_PF
   unless @erased
    page = @event.pages[0]
    c = page.condition
    if c.switch1_valid
     if $game_switches[c.switch1_id] == false
      return false
     end
    end
    if c.switch2_valid
     if $game_switches[c.switch2_id] == false
      return false
     end
    end
    if c.variable_valid
     if $game_variables[c.variable_id] < c.variable_value
      return false
     end
    end
    if c.self_switch_valid
     key = [@map_id, @event.id, c.self_switch_ch]
     if $game_self_switches[key] != true
      return false
     end
    end
    return true
   end
  end
  #-------------------------------------------------------------------------- Â
  def desactiver_PF
   unless @erased
    page = @event.pages[0]
    c = page.condition
    if c.switch1_valid
     if $game_switches[c.switch1_id]
      $game_switches[c.switch1_id] = false
     end
    end
    if c.switch2_valid
     if $game_switches[c.switch2_id]
      $game_switches[c.switch2_id] = false
     end
    end
    if c.variable_valid
     if $game_variables[c.variable_id] >= c.variable_value
      $game_variables[c.variable_id] = 0
     end
    end
    if c.self_switch_valid
     key = [@map_id, @event.id, c.self_switch_ch]
     if $game_self_switches[key]
       $game_self_switches[key] = false
     end
    end
   end
  end
end
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
class Game_Player < Game_Character
 def check_event_trigger_here(triggers)
  result = false
  if $game_system.map_interpreter.running?
   return result
  end
  for event in $game_map.events.values
   if event.x == (@x+0.5).to_i and event.y == (@y+0.5).to_i and triggers.include?(event.trigger)
    if not event.jumping? and event.over_trigger?
     event.start
     result = true
    end
   end
  end
  return result
 end
 #--------------------------------------------------------------------------
 def check_event_trigger_there(triggers)
  result = false
  if $game_system.map_interpreter.running?
   return result
  end
  new_x = (@x+0.5).to_i + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
  new_y = (@y+0.5).to_i + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
  for event in $game_map.events.values
   if event.x == new_x and event.y == new_y.to_i and
     triggers.include?(event.trigger)
    if not event.jumping? and not event.over_trigger?
     event.start
     result = true
    end
   end
  end
  if result == false
   if $game_map.counter?(new_x, new_y)
    new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    for event in $game_map.events.values
     if event.x == new_x and event.y == new_y and
       triggers.include?(event.trigger)
      if not event.jumping? and not event.over_trigger?
       event.start
       result = true
      end
     end
    end
   end
  end
  return result
 end
 #--------------------------------------------------------------------------
 def check_event_trigger_touch(x, y)
  result = false
  if $game_system.map_interpreter.running?
   return result
  end
  for event in $game_map.events.values
   if event.x == (x+0.5).to_i and event.y == (y+0.5).to_i and [1,2].include?(event.trigger)
    if not event.jumping? and not event.over_trigger?
     event.start
     result = true
    end
   end
  end
  return result
 end
 #--------------------------------------------------------------------------
 def update
  @numPF= check_surPF(@real_x,@real_y)
  if @surPF and $game_map.events[@numPF].PF_active
   distance = 2 ** $game_map.events[@numPF].move_speed
   distance_x = @real_x - $game_map.events[@numPF].real_x
   distance_y = @real_y - $game_map.events[@numPF].real_y
   if $game_map.events[@numPF].y_cible * 128 + distance_y > @real_y
    @real_y = [@real_y + distance, $game_map.events[@numPF].y_cible * 128+distance_y].min
    @y = [(@y + distance.to_f/128), $game_map.events[@numPF].y_cible+distance_y.to_f/128].min
   end
   if $game_map.events[@numPF].x_cible * 128 + distance_x < @real_x
    @real_x = [@real_x - distance, $game_map.events[@numPF].x_cible * 128+distance_x].max
    @x = [(@x - distance.to_f/128), $game_map.events[@numPF].x_cible+distance_x.to_f/128].max
   end
   if $game_map.events[@numPF].x_cible* 128 + distance_x > @real_x
    @real_x = [@real_x + distance, $game_map.events[@numPF].x_cible* 128+distance_x].min
    @x = [(@x + distance.to_f/128), $game_map.events[@numPF].x_cible+distance_x.to_f/128].min
   end
   if $game_map.events[@numPF].y_cible * 128 + distance_y < @real_y
    @real_y = [@real_y - distance, $game_map.events[@numPF].y_cible * 128+distance_y].max
    @y = [(@y - distance.to_f/128), $game_map.events[@numPF].y_cible+distance_y.to_f/128].max
   end
  else @x = ((@x+0.5).to_i).to_f if (!@vers_PF and moving?)
   @y = ((@y+0.5).to_i).to_f if (!@vers_PF and moving?)
   if !moving? and !@surPF and !check_vide(@x,@y)
   @x_sol = @x
   @y_sol = @y
   end
   if check_vide(@x,@y) and ((!@vers_PF and moving?) or (!moving? and !@surPF))
    $game_switches[10] = true
    $game_variables[2] = @x_sol
    $game_variables[3] = @y_sol
   end
  end
  last_moving = moving?
  unless moving? or $game_system.map_interpreter.running? or
      @move_route_forcing or $game_temp.message_window_showing
   case Input.dir4
   when 2
    move_down
   when 4
    move_left
   when 6
    move_right
   when 8
    move_up
   end
  end
  last_real_x = @real_x
  last_real_y = @real_y
  super
  if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
   $game_map.scroll_down(@real_y - last_real_y)
  end
  if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
   $game_map.scroll_left(last_real_x - @real_x)
  end
  if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
   $game_map.scroll_right(@real_x - last_real_x)
  end
  if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
   $game_map.scroll_up(last_real_y - @real_y)
  end
  unless moving?
   if last_moving
    result = check_event_trigger_here([1,2])
    if result == false
     unless $DEBUG and Input.press?(Input::CTRL)
      if @encounter_count > 0
       @encounter_count -= 1
      end
     end
    end
   end
   if Input.trigger?(Input::C)
    check_event_trigger_here([0])
    check_event_trigger_there([0,1,2])
   end
  end
 end
end[/spoiler]