=begin 坂道スクリプト ver 0.1.1.2         by 半生 http://www.tktkgame.com/ http://www11.atpages.jp/namahanka/ $game_player.slope(dx,dy)  プレイヤーの座標[px, py]と目的地[px+dx, py+dy]を結ぶ直線上を左右のキー入力  で移動できるようにします。範囲外に移動すると解除されます。 $game_player.slope(dx,dy,upper_line, lower_line)  上upper_line列,下lower_line列分の幅をもたせることが出来ます。  起動イベントは結局列数*2必要になります。 ■ 他  ・他の斜め移動系スクリプトよりも下に配置すると競合しにくいかもしれません。 ■ 更新履歴 ver 0.1.1.2 (2010/11/17)  導入前のセーブデータでもそれなりに動くように修正。。 ver 0.1.1.0 (2010/04/08)  斜め移動系スクリプトと競合しにくそうな感じに修正。 ver 0.1.0.0 (2010/04/05)  公開。 =end module HnMoveBind class Bind_Root attr_reader :mb_dir attr_accessor :line_range attr_accessor :line attr_reader :rx attr_reader :ry attr_reader :angle attr_reader :step def initialize(sx=-1,sy=-1,tx=-1,ty=-1,mb_dir=0) @m_binding = false set_root(sx,sy,tx,ty, mb_dir) @line_range = 0..0 @line = 0 end def binding? @m_binding end def ox(rx, ry) return 0 unless @m_binding return 0 if @mb_dir != 2 return 0 unless inside_ry?(ry) return (@rx[1] - @rx[0]) * (ry - @ry[0]) / (@ry[1] - @ry[0]) + @rx[0] - rx + @line * 256 end def oy(rx, ry) return 0 unless @m_binding return 0 if @mb_dir != 1 return 0 unless inside_rx?(rx) return (@ry[1] - @ry[0]) * (rx - @rx[0]) / (@rx[1] - @rx[0]) + @ry[0] - ry + @line * 256 end def mx(ry, m_x) if !@m_binding or @mb_dir != 2 return m_x end return @rx[0] / 256 + @line if (ry == @ry[0]) return @rx[1] / 256 + @line if (ry == @ry[1]) return m_x unless inside_ry?(ry) new_rx = @rx[0] + ( (@rx[1] - @rx[0]) * (ry - @ry[0])) / (@ry[1] - @ry[0]) return (new_rx + 255) / 256 + @line end def my(rx, m_y) if !@m_binding or @mb_dir != 1 return m_y end return @ry[0] / 256 + @line if (rx == @rx[0]) return @ry[1] / 256 + @line if (rx == @rx[1]) return m_y unless inside_rx?(rx) new_ry = @ry[0] + ( (@ry[1] - @ry[0]) * (rx - @rx[0])) / (@rx[1] - @rx[0]) return (new_ry + 255) / 256 + @line end def between_rx?(rx) rx.between?(@rx.min, @rx.max) end def between_ry?(ry) ry.between?(@ry.min, @ry.max) end def inside_rx?(rx) return false if rx >= @rx.max return false if rx <= @rx.min return true end def inside_ry?(ry) return false if ry >= @ry.max return false if ry <= @ry.min return true end def set_root(sx,sy,tx,ty, mb_dir) self.clear @mb_dir = mb_dir @mb_dir = 0 if @mb_dir > 2 if @mb_dir == 0 return end if @mb_dir == 1 return self.clear if sx == tx if (tx > sx) @rx = [sx * 256, tx * 256] @ry = [sy * 256, ty * 256] else @rx = [tx * 256, sx * 256] @ry = [ty * 256, sy * 256] end if @ry[1] > @ry[0] @angle = -1 elsif @ry[1] < @ry[0] @angle = 1 else @angle = 0 end # @step = (1.0 + (ty - sy) ** 2)**0.5 else return self.clear if sy == ty if (ty > sy) @rx = [sx * 256, tx * 256] @ry = [sy * 256, ty * 256] else @rx = [tx * 256, sx * 256] @ry = [ty * 256, sy * 256] end if @rx[1] > @rx[0] @angle = -1 elsif @rx[1] < @rx[0] @angle = 1 else @angle = 0 end # @step = (1.0 + (tx - sx) ** 2)**0.5 end @line = 0 @m_binding = true end def clear @m_binding = false @line_range = (0..0) @line = 0 @rx = [0,0] @ry = [0,0] @angle = 0 @step = 1.0 end end module Character_Bind def initialize(*args) super(*args) init_mbind() end def init_mbind @m_bind = Bind_Root.new @last_real_x = 0 @last_real_y = 0 end def m_bind init_mbind() if @m_bind.nil? return @m_bind end def move_bind(sx,sy,tx,ty,mb_dir, range=[0,0]) m_bind.set_root(sx,sy,tx,ty, mb_dir) m_bind.line_range = Range.new(range.min, range.max) end def mbind(dx,dy,mb_dir, minus=0, plus=0) range = [ [0 - minus, 0].min, [plus, 0].max ] move_bind(@x,@y,@x + dx,@y + dy,mb_dir, range) end def slope(dx, dy, up=0, down=0) range = [ [0 - up, 0].min, [down, 0].max ] move_bind(@x,@y,@x + dx,@y + dy,1, range) end def mb_clear m_bind.clear end def screen_x if m_bind.binding? temp_rx = @real_x @real_x += m_bind.ox(@x*256,@real_y) sx = super @real_x = temp_rx sx else super end end def screen_y if m_bind.binding? temp_ry = @real_y @real_y += m_bind.oy(@real_x,@y*256) sy = super @real_y = temp_ry sy else super end end def move_left(turn_ok = true) if m_bind.binding? if @m_bind.mb_dir == 1 and @m_bind.between_rx?(@real_x - 1) turn_left @x = $game_map.round_x(@x-1) @real_x = (@x+1)*256 @y = @m_bind.my(@x*256,@y) @real_y = @y*256 increase_steps @move_failed = false elsif @m_bind.mb_dir == 2 and @m_bind.inside_ry?(@real_y) turn_left if turn_ok if m_bind.line_range.include?(@m_bind.line - 1) m_bind.line -= 1 @x = $game_map.round_x(@x-1) @real_x = (@x+1)*256 increase_steps @move_failed = false else @move_failed = true end else super m_bind.clear unless @move_failed end else super end end # End def move_left def move_right(turn_ok = true) if m_bind.binding? if @m_bind.mb_dir == 1 and @m_bind.inside_rx?(@real_x + 1) turn_right @x = $game_map.round_x(@x+1) @real_x = (@x-1)*256 @y = @m_bind.my(@x*256,@y) @real_y = @y*256 increase_steps @move_failed = false elsif @m_bind.mb_dir == 2 and @m_bind.inside_ry?(@real_y) turn_right if turn_ok if @m_bind.line_range.include?(@m_bind.line + 1) @m_bind.line += 1 @x = $game_map.round_x(@x+1) @real_x = (@x-1)*256 increase_steps @move_failed = false else @move_failed = true end else super @m_bind.clear unless @move_failed end else super end end # End def move_right def move_up(turn_ok = true) if m_bind.binding? if @m_bind.mb_dir == 2 and @m_bind.inside_ry?(@real_y - 1) turn_up @y = $game_map.round_y(@y-1) @real_y = (@y+1)*256 @x = @m_bind.mx(@y*256,@x) @real_x = @x*256 increase_steps @move_failed = false elsif @m_bind.mb_dir == 1 and @m_bind.inside_rx?(@real_x) turn_up if turn_ok if @m_bind.line_range.include?(@m_bind.line - 1) @m_bind.line -= 1 @y = $game_map.round_y(@y-1) @real_y = (@y+1)*256 increase_steps @move_failed = false else @move_failed = true end else super @m_bind.clear unless @move_failed end else super end end # End def move_up def move_down(turn_ok = true) if m_bind.binding? if @m_bind.mb_dir == 2 and @m_bind.inside_ry?(@real_y + 1) turn_down @y = $game_map.round_y(@y+1) @real_y = (@y-1)*256 @x = @m_bind.mx(@y*256,@x) @real_x = @x*256 increase_steps @move_failed = false elsif @m_bind.mb_dir == 1 and @m_bind.inside_rx?(@real_x) turn_down if turn_ok if @m_bind.line_range.include?(@m_bind.line + 1) @m_bind.line += 1 @y = $game_map.round_y(@y+1) @real_y = (@y-1)*256 increase_steps @move_failed = false else @move_failed = true end else super @m_bind.clear unless @move_failed end else super end end # End def move_down end # End module HnMoveBind::Character_Bind end class Game_Player include HnMoveBind::Character_Bind # 更新 alias :_hn_slope__update :update unless method_defined?(:_hn_slope__update) def update @mb_last_real_x = @real_x @mb_last_real_y = @real_y if m_bind.binding? @mb_last_real_x += @m_bind.ox(@x*256, @real_y) @mb_last_real_y += @m_bind.oy(@real_x, @y*256) end _hn_slope__update end #-------------------------------------------------------------------------- # ● スクロール処理 #-------------------------------------------------------------------------- alias :_hn_slope__update_scroll :update_scroll unless method_defined?(:_hn_slope__update_scroll) def update_scroll(last_real_x, last_real_y) temp_real_x = @real_x temp_real_y = @real_y if m_bind.binding? @real_x += @m_bind.ox(@x*256, @real_y) @real_y += @m_bind.oy(@real_x, @y*256) end _hn_slope__update_scroll(@mb_last_real_x, @mb_last_real_y) @real_x = temp_real_x @real_y = temp_real_y end # ▼ 他の斜め移動系スクリプト対策 ▼ alias :_hn_slope__move_lower_left :move_lower_left unless method_defined?(:_hn_slope__move_lower_left) def move_lower_left if m_bind.binding? if @m_bind.mb_dir == 1 if @m_bind.angle < 0 move_down else move_left end else if @m_bind.angle < 0 move_left else move_down end end else _hn_slope__move_lower_left end end alias :_hn_slope__move_lower_right :move_lower_right unless method_defined?(:_hn_slope__move_lower_right) def move_lower_right if m_bind.binding? if @m_bind.mb_dir == 1 if @m_bind.angle > 0 move_down else move_right end else if @m_bind.angle > 0 move_right else move_down end end else _hn_slope__move_lower_right end end alias :_hn_slope__move_upper_left :move_upper_left unless method_defined?(:_hn_slope__move_upper_left) def move_upper_left if m_bind.binding? if @m_bind.mb_dir == 1 if @m_bind.angle > 0 move_up else move_left end else if @m_bind.angle > 0 move_left else move_up end end else _hn_slope__move_upper_left end end alias :_hn_slope__move_upper_right :move_upper_right unless method_defined?(:_hn_slope__move_upper_right) def move_upper_right if m_bind.binding? if @m_bind.mb_dir == 1 if @m_bind.angle < 0 move_up else move_right end else if @m_bind.angle < 0 move_right else move_up end end else _hn_slope__move_upper_right end end # ▲ 他の斜め移動系スクリプト対策 ▲ end