|
楼主 |
发表于 2009-11-8 10:37:26
|
显示全部楼层
- def passable_down?
- return [-1,-1] if @through or debug_through? # 穿越 ON?
- distance = 2 ** @move_speed # 变换移动速度与移动距离
- distance *= 2 if dash? # 跑步状态时移动速度加倍
- real_y_min = real_r_y
- real_y_max = real_y_min + distance
- block = nil
- l = @real_x - 384
- r = @real_x + 384
- if self.is_a?(Game_Event)
- event = $game_player
- if pix_collide_with_characters?(event)
- if event.real_y >= real_y_min && event.real_y < real_y_max
- if event.real_x > @real_x - 256 && event.real_x < @real_x + 256
- block = [event.real_x,event.real_y]
- if block[1] == @real_y + 256
- if event.real_x > @real_x + 128
- r = event.real_x if event.real_x < r
- elsif event.real_x < @real_x - 128
- l = event.real_x if event.real_x > l
- else
- return [-2,-2]
- end
- end
- end
- end
- end
- end
- for event in $game_map.events.values
- if pix_collide_with_characters?(event) && self != event
- if event.real_y >= real_y_min && event.real_y < real_y_max
- if event.real_x > @real_x - 256 && event.real_x < @real_x + 256
- if block
- if event.real_y < block[1]
- block[0] = event.real_x
- block[1] = event.real_y
- elsif event.real_y == @real_y + 256
- block[0] = event.real_x
- block[1] = event.real_y
- if event.real_x > @real_x + 128
- r = event.real_x if event.real_x < r
- elsif event.real_x < @real_x - 128
- l = event.real_x if event.real_x > l
- else
- return [-2,-2]
- end
- end
- else
- block = [event.real_x,event.real_y]
- if block[1] == @real_y + 256
- if event.real_x > @real_x + 128
- r = event.real_x if event.real_x < r
- elsif event.real_x < @real_x - 128
- l = event.real_x if event.real_x > l
- else
- return [-2,-2]
- end
- end
- end
- end
- end
- end
- end
- if @real_y % 256 == 0 || 256 - @real_y % 256 < distance
- if block
- if @real_y % 256 == 0
- y = (@real_y / 256 + 1) * 256
- else
- y = (@real_y / 256 + 2) * 256
- end
- if block[1] >= y
- x = @real_x / 256
- y = @real_y / 256 + 1
- if @real_y % 256 != 0
- y = y + 1
- end
- if @real_x % 256 == 0
- if !map_passable?(x, y)
- block[0] = x * 256
- block[1] = y * 256
- if y * 256 == @real_y + 256
- return [-2,-2]
- end
- end
- else
- if !map_passable?(x, y)
- block[0] = x * 256
- block[1] = y * 256
- if !map_passable?(x + 1, y)
- return [-2,-2] if y * 256 == @real_y + 256
- end
- if y * 256 == @real_y + 256
- if x * 256 < @real_x - 128
- l = x * 256 if x * 256 > l
- end
- end
- elsif !map_passable?(x + 1, y)
- block[0] = x * 256 + 256
- block[1] = y * 256
- if y * 256 == @real_y + 256
- if x * 256 + 256 > @real_x + 128
- r = x * 256 + 256 if x * 256 + 256 < r
- end
- end
- end
- end
- end
- else
- x = @real_x / 256
- y = @real_y / 256 + 1
- if @real_y % 256 != 0
- y = y + 1
- end
- if @real_x % 256 == 0
- if !map_passable?(x, y)
- block = [x * 256,y * 256]
- if y * 256 == @real_y + 256
- return [-2,-2]
- end
- end
- else
- if !map_passable?(x, y)
- block = [x * 256, y * 256]
- if !map_passable?(x + 1, y)
- return [-2,-2] if y * 256 == @real_y + 256
- end
- elsif !map_passable?(x + 1, y)
- block = [x * 256 + 256, y * 256]
- end
- end
- end
- end
- if block
- if block[1] == @real_y + 256
- if r - l < 512
- return [-2,-2]
- end
- end
- return block
- end
- return [-1,-1]
- end
-
- def passable_left?
- #return false unless $game_map.pix_valid?(dx - 31, dy) # 地图外?
- return [-1,-1] if @through or debug_through? # 穿越 ON?
- #return false unless map_passable?(x, y) # 地图不能通行?
- #return false if collide_with_characters?(x, y) # 与角色冲突?
- distance = 2 ** @move_speed # 变换移动速度与移动距离
- distance *= 2 if dash? # 跑步状态时移动速度加倍
- real_x_max = @real_x - 256
- real_x_min = real_x_max - distance
- block = nil
- if self.is_a?(Game_Event)
- event = $game_player
- if pix_collide_with_characters?(event)
- if event.real_x >= real_x_min && event.real_x <= real_x_max
- if event.real_y > @real_y - 256 && event.real_y < @real_y + 256
- block = [event.real_x,event.real_y]
- end
- end
- end
- end
- for event in $game_map.events.values
- if pix_collide_with_characters?(event) && self != event
- if event.real_x >= real_x_min && event.real_x <= real_x_max
- if event.real_y > @real_y - 256 && event.real_y < @real_y + 256
- if block
- if event.real_x > block[0]
- block[0] = event.real_x
- block[1] = event.real_y
- end
- else
- block = [event.real_x,event.real_y]
- end
- end
- end
- end
- end
- if @real_x % 256 < distance
- if block
- x = @real_x / 256 * 256 - 256
- if block[0] < x
- x = @real_x / 256 - 1
- y = @real_y / 256
- if @real_y % 256 == 0
- if !map_passable?(x, y)
- block[0] = x * 256
- block[1] = @real_y
- end
- else
- if !map_passable?(x, y)
- block[0] = x * 256
- block[1] = y * 256
- elsif !map_passable?(x, y + 1)
- block[0] = x * 256
- block[1] = y * 256 + 256
- end
- end
- end
- else
- x = @real_x / 256 - 1
- y = @real_y / 256
- if @real_y % 256 == 0
- if !map_passable?(x, y)
- block = [x * 256,y * 256]
- end
- else
- if !map_passable?(x, y)
- block = [x * 256, y * 256]
- elsif !map_passable?(x, y + 1)
- block = [x * 256, y * 256 + 256]
- end
- end
- end
- end
- return block if block
- return [-1,-1] # 可以通行
- end
-
- def passable_right?
- #return false unless $game_map.pix_valid?(dx - 31, dy) # 地图外?
- return [-1,-1] if @through or debug_through? # 穿越 ON?
- #return false unless map_passable?(x, y) # 地图不能通行?
- #return false if collide_with_characters?(x, y) # 与角色冲突?
- distance = 2 ** @move_speed # 变换移动速度与移动距离
- distance *= 2 if dash? # 跑步状态时移动速度加倍
- real_x_min = real_l_x + @volume * 8
- real_x_max = real_x_min + distance
- block = nil
- if self.is_a?(Game_Event)
- event = $game_player
- if pix_collide_with_characters?(event)
- if event.real_l_x >= real_x_min && event.real_l_x <= real_x_max
- if event.real_l_y > real_l_y - 256 && event.real_l_y < real_l_y + 256
- block = [event.real_x,event.real_y]
- end
- end
- end
- end
- for event in $game_map.events.values
- if pix_collide_with_characters?(event) && self != event
- if event.real_l_x >= real_x_min && event.real_l_x <= real_x_max
- if event.real_l_y > real_l_y - 256 && event.real_l_y < real_l_y + 256
- if block
- if event.real_l_x < block[0]
- block[0] = event.real_x
- block[1] = event.real_y
- end
- else
- block = [event.real_x,event.real_y]
- end
- end
- end
- end
- end
- if @real_x % 256 == 0 || 256 - @real_x % 256 < distance
- if block
- if @real_x % 256 == 0
- x = @real_x / 256 + 256
- else
- x = @real_x / 256 + 512
- end
- if block[0] > x
- x = @real_x / 256 + 1
- y = @real_y / 256
- if @real_x % 256 != 0
- x = x + 1
- end
- if @real_y % 256 == 0
- if !map_passable?(x, y)
- block = [x * 256, y * 256]
- end
- else
- if !map_passable?(x, y)
- block = [x * 256, y * 256]
- elsif !map_passable?(x, y + 1)
- block = [x * 256, y * 256 + 256]
- end
- end
- end
- else
- x = @real_x / 256 + 1
- y = @real_y / 256
- if @real_x % 256 != 0
- x = x + 1
- end
- if @real_y % 256 == 0
- if !map_passable?(x, y)
- block = [x * 256, y * 256]
- end
- else
- if !map_passable?(x, y)
- block = [x * 256, y * 256]
- elsif !map_passable?(x, y + 1)
- block = [x * 256, y * 256 + 256]
- end
- end
- end
- end
- return block if block
- return [-1,-1] # 可以通行
- end
-
- def passable_up?
- #return false unless $game_map.pix_valid?(dx - 31, dy) # 地图外?
- return [-1,-1] if @through or debug_through? # 穿越 ON?
- #return false unless map_passable?(x, y) # 地图不能通行?
- #return false if collide_with_characters?(x, y) # 与角色冲突?
- distance = 2 ** @move_speed # 变换移动速度与移动距离
- distance *= 2 if dash? # 跑步状态时移动速度加倍
- real_y_max = real_l_y - 256
- real_y_min = real_y_max - distance
- block = nil
- l = @real_x - 384
- r = @real_x + 384
- if self.is_a?(Game_Event)
- event = $game_player
- if pix_collide_with_characters?(event)
- if event.real_y >= real_y_min && event.real_y <= real_y_max
- if event.real_x > @real_x - 256 && event.real_x < @real_x + 256
- block = [event.real_x,event.real_y]
- if block[1] == @real_y - 256
- if event.real_x > @real_x + 128
- r = event.real_x if event.real_x < r
- elsif event.real_x < @real_x - 128
- l = event.real_x if event.real_x > l
- else
- return [-2,-2]
- end
- end
- end
- end
- end
- end
- for event in $game_map.events.values
- if pix_collide_with_characters?(event) && self != event
- if event.real_y >= real_y_min && event.real_y <= real_y_max
- if event.real_x > @real_x - 256 && event.real_x < @real_x + 256
- if block
- if event.real_y > block[1]
- block[0] = event.real_x
- block[1] = event.real_y
- elsif event.real_y == @real_y - 256 && block[1] == @real_y - 256
- if event.real_x > @real_x + 128
- r = event.real_x if event.real_x < r
- elsif event.real_x < @real_x - 128
- l = event.real_x if event.real_x > l
- else
- return [-2,-2]
- end
- end
- else
- block = [event.real_x,event.real_y]
- if block[1] == @real_y - 256
- if event.real_x > @real_x + 128
- r = event.real_x if event.real_x < r
- elsif event.real_x < @real_x - 128
- l = event.real_x if event.real_x > l
- else
- return [-2,-2]
- end
- end
- end
- end
- end
- end
- end
- if @real_y % 256 < distance
- if block
- y = @real_y / 256 * 256 - 256
- if block[1] <= y
- x = @real_x / 256
- y = @real_y / 256 - 1
- if @real_x % 256 == 0
- if !map_passable?(x, y)
- block[0] = @real_x
- block[1] = y * 256
- if y * 256 == @real_y - 256
- return [-2,-2]
- end
- end
- else
- if !map_passable?(x, y)
- block[0] = x * 256
- block[1] = y * 256
- if !map_passable?(x + 1, y)
- return [-2,-2] if y * 256 == @real_y - 256
- end
- if y * 256 == @real_y - 256
- if x * 256 < @real_x - 128
- l = x * 256 if x * 256 > l
- end
- end
- elsif !map_passable?(x + 1, y)
- block[0] = x * 256 + 256
- block[1] = y * 256
- if y * 256 == @real_y - 256
- if x * 256 + 256 > @real_x + 128
- r = x * 256 + 256 if x * 256 + 256 < r
- end
- end
- end
- end
- end
- else
- x = @real_x / 256
- y = @real_y / 256 - 1
- if @real_x % 256 == 0
- if !map_passable?(x, y)
- block = [x * 256,y * 256]
- if y * 256 == @real_y - 256
- return [-2,-2]
- end
- end
- else
- if !map_passable?(x, y)
- block = [x * 256, y * 256]
- if !map_passable?(x + 1, y)
- return [-2,-2] if y * 256 == @real_y - 256
- end
- elsif !map_passable?(x + 1, y)
- block = [x * 256 + 256, y * 256]
- end
- end
- end
- end
- if block
- if block[1] == @real_y - 256
- if r - l < 512
- return [-2,-2]
- end
- end
- return block
- end
- return [-1,-1] # 可以通行
- end
- #--------------------------------------------------------------------------
- # ● 向下移动
- # turn_ok : 此地可以更改朝向
- #--------------------------------------------------------------------------
- def move_down(turn_ok = true)
- distance = 2 ** @move_speed # 变换移动速度与移动距离
- distance *= 2 if dash? # 跑步状态时移动速度加倍
- pass = passable_down?
- if pass[0] == -1
- @real_y += distance
- turn_down
- increase_steps
- @move_failed = false
- @moving = true
- elsif pass[0] == -2
- turn_down if turn_ok
- @move_failed = true
- @moving = false
- else
- if pass[1] == @real_y + 256 # 有没有紧贴障碍物
- delta_x = @real_x - pass[0] # 判断左右移
- if delta_x >= 128 && delta_x < 256 # 左突出,右移
- pass2 = passable_right?
- if pass2[0] == -1
- @real_x += distance
- turn_down
- increase_steps
- @move_failed = false
- @moving = true
- if @real_x > pass[0] + 256
- @real_x = pass[0] + 256
- end
- else
- @real_x = pass2[0] - 256
- turn_down
- increase_steps
- @move_failed = false
- @moving = true
- #if @real_x > pass[0] + 256
- # @real_x = pass[0] + 256
- #end
- end
- elsif delta_x <= -128 && delta_x > -256 # 右突出,左移
- pass2 = passable_left?
- if pass2[0] == -1
- @real_x -= distance
- turn_down
- increase_steps
- @move_failed = false
- @moving = true
- if @real_x < pass[0] - 256
- @real_x = pass[0] - 256
- end
- else
- @real_x = pass2[0] + 256
- turn_down
- increase_steps
- @move_failed = false
- @moving = true
- #if @real_x < pass[0] - 256
- # @real_x = pass[0] - 256
- #end
- end
- else
- turn_down if turn_ok
- @move_failed = true
- @moving = false
- end
- else
- @real_y = pass[1] - 256
- turn_down
- increase_steps
- @move_failed = false
- @moving = true
- end
- end
- pix_check_event_trigger_touch(@real_x, @real_y, "down") # 判断接触的事件启动
- pass.clear
- pass2.clear if pass2
- check("down",1)
- end
- #--------------------------------------------------------------------------
- # ● 向左移动
- # turn_ok : 此地可以更改朝向
- #--------------------------------------------------------------------------
- def move_left(turn_ok = true)
- distance = 2 ** @move_speed # 变换移动速度与移动距离
- distance *= 2 if dash? # 跑步状态时移动速度加倍
- pass = passable_left?
- if pass[0] == -1
- @real_x -= distance
- turn_left
- increase_steps
- @move_failed = false
- @moving = true
- elsif pass[0] == -2
- turn_left if turn_ok
- @move_failed = true
- @moving = false
- else
- if pass[0] == @real_x - 256 # 有没有紧贴障碍物
- delta_y = @real_y - pass[1] # 判断上下移
- if delta_y >= 128 && delta_y < 256 # 上突出,下移
- pass2 = passable_down?
- if pass2[0] == -1
- @real_y += distance
- turn_left
- increase_steps
- @move_failed = false
- @moving = true
- if @real_y > pass[1] + 256
- @real_y = pass[1] + 256
- end
- else
- @real_y = pass2[1] - 256
- turn_left
- increase_steps
- @move_failed = false
- @moving = true
- #if @real_x > pass[0] + 256
- # @real_x = pass[0] + 256
- #end
- end
- elsif delta_y <= -128 && delta_y > -256 # 下突出,上移
- pass2 = passable_up?
- if pass2[0] == -1
- @real_y -= distance
- turn_left
- increase_steps
- @move_failed = false
- @moving = true
- if @real_y < pass[1] - 256
- @real_y = pass[1] - 256
- end
- else
- @real_y = pass2[1] + 256
- turn_left
- increase_steps
- @move_failed = false
- @moving = true
- #if @real_x < pass[0] - 256
- # @real_x = pass[0] - 256
- #end
- end
- else
- turn_left if turn_ok
- @move_failed = true
- @moving = false
- end
- else
- @real_x = pass[0] + 256
- turn_left
- increase_steps
- @move_failed = false
- @moving = true
- end
- end
- pix_check_event_trigger_touch(@real_x, @real_y, "left") # 判断接触的事件启动
- pass.clear
- pass2.clear if pass2
- check("left",1)
- end
- #--------------------------------------------------------------------------
- # ● 向右移动
- # turn_ok : 此地可以更改朝向
- #--------------------------------------------------------------------------
- def move_right(turn_ok = true)
- distance = 2 ** @move_speed # 变换移动速度与移动距离
- distance *= 2 if dash? # 跑步状态时移动速度加倍
- pass = passable_right?
- if pass[0] == -1
- @real_x += distance
- turn_right
- increase_steps
- @move_failed = false
- @moving = true
- elsif pass[0] == -2
- turn_right if turn_ok
- @move_failed = true
- @moving = false
- else
- if pass[0] == @real_x + 256 # 有没有紧贴障碍物
- delta_y = @real_y - pass[1] # 判断上下移
- if delta_y >= 128 && delta_y < 256 # 上突出,下移
- pass2 = passable_down?
- if pass2[0] == -1
- @real_y += distance
- turn_right
- increase_steps
- @move_failed = false
- @moving = true
- if @real_y > pass[1] + 256
- @real_y = pass[1] + 256
- end
- else
- @real_y = pass2[1] - 256
- turn_right
- increase_steps
- @move_failed = false
- @moving = true
- #if @real_x > pass[0] + 256
- # @real_x = pass[0] + 256
- #end
- end
- elsif delta_y <= -128 && delta_y > -256 # 下突出,上移
- pass2 = passable_up?
- if pass2[0] == -1
- @real_y -= distance
- turn_right
- increase_steps
- @move_failed = false
- @moving = true
- if @real_y < pass[1] - 256
- @real_y = pass[1] - 256
- end
- else
- @real_y = pass2[1] + 256
- turn_right
- increase_steps
- @move_failed = false
- @moving = true
- #if @real_x < pass[0] - 256
- # @real_x = pass[0] - 256
- #end
- end
- else
- turn_right if turn_ok
- @move_failed = true
- @moving = false
- end
- else
- @real_x = pass[0] - 256
- turn_right
- increase_steps
- @move_failed = false
- @moving = true
- end
- end
- pix_check_event_trigger_touch(@real_x, @real_y, "right") # 判断接触的事件启动
- pass.clear
- pass2.clear if pass2
- check("right",1)
- end
- #--------------------------------------------------------------------------
- # ● 向上移动
- # turn_ok : 此地可以更改朝向
- #--------------------------------------------------------------------------
- def move_up(turn_ok = true)
- distance = 2 ** @move_speed # 变换移动速度与移动距离
- distance *= 2 if dash? # 跑步状态时移动速度加倍
- pass = passable_up?
- if pass[0] == -1
- @real_y -= distance
- turn_up
- increase_steps
- @move_failed = false
- @moving = true
- elsif pass[0] == -2
- turn_up if turn_ok
- @move_failed = true
- @moving = false
- else
- if pass[1] == @real_y - 256 # 有没有紧贴障碍物
- delta_x = @real_x - pass[0] # 判断左右移
- if delta_x >= 128 && delta_x < 256 # 左突出,右移
- pass2 = passable_right?
- if pass2[0] == -1
- @real_x += distance
- turn_up
- increase_steps
- @move_failed = false
- @moving = true
- if @real_x > pass[0] + 256
- @real_x = pass[0] + 256
- end
- else
- @real_x = pass2[0] - 256
- turn_up
- increase_steps
- @move_failed = false
- @moving = true
- #if @real_x > pass[0] + 256
- # @real_x = pass[0] + 256
- #end
- end
- elsif delta_x <= -128 && delta_x > -256 # 右突出,左移
- pass2 = passable_left?
- if pass2[0] == -1
- @real_x -= distance
- turn_up
- increase_steps
- @move_failed = false
- @moving = true
- if @real_x < pass[0] - 256
- @real_x = pass[0] - 256
- end
- else
- @real_x = pass2[0] + 256
- turn_up
- increase_steps
- @move_failed = false
- @moving = true
- #if @real_x < pass[0] - 256
- # @real_x = pass[0] - 256
- #end
- end
- else
- turn_up if turn_ok
- @move_failed = true
- @moving = false
- end
- else
- @real_y = pass[1] + 256
- turn_up
- increase_steps
- @move_failed = false
- @moving = true
- end
- end
- pix_check_event_trigger_touch(@real_x, @real_y, "up") # 判断接触的事件启动
- pass.clear
- pass2.clear if pass2
- check("up",1)
- end
复制代码
替换 Character 中相应的方法。。。改了 上下两个通行。。另两个再等等吧。。。OTZ 另外更改了接触事件的启动
你可以试一试 左右两个方向和上下有什么不同 |
|