#------------------------------------------------
# ● 按键跳跃的部分
#------------------------------------------------
def press_and_jump
if Input.repeat?(Input::A)
$game_player.move_speed = 5
else
$game_player.move_speed = 4
end
return
if Input.press?(Input::A) and not $ud_ok
@twojump = 1 if @twojump == 0 and down1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, 5, true)
if (not @apassed) and @twojump <= $airjump
@apassed = true
@jumpnow = JUMPMAX
@twojump += 1
else
@jumpnow += 3
end
else
@apassed = false
end
end
#------------------------------------------------
# ● 按键时候跑步加速的功能
#------------------------------------------------
def run_speed_confirm
@walk = 4
@dash = 5
@event = 4
@dot_m = true
unless moving? or $game_system.map_interpreter.running? or
@move_route_forcing or $game_temp.message_window_showing
if @walk != @dash
if Input.press?(Input::C)
if @move_speed != @dash
@move_speed = @dash
end
else
if @move_speed != @walk
@move_speed = @walk
end
end
end
end
end
#------------------------------------------------
# ● 根据角色位置进行地图滚动处理
#------------------------------------------------
def scroll_player_display(last_real_x, last_real_y)
# 角色向下移动、画面上的位置在中央下方的情况下
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
end
#--------------------------------------------------------------------------
# ● 等待跳跃摔倒的倒数计秒
#--------------------------------------------------------------------------
def wait_jump_count_function
if @after_jump_wait_release
if @after_jump_wait_count > JUMP_INIT_WAIT_COUNT
@after_jump_wait_count -= 1
else
@after_jump_wait_release = false
end
return
end
end
#--------------------------------------------------------------------------
# ● 自由落体的代码,非常重要!
#--------------------------------------------------------------------------
def free_drop
if not $ud_ok
@jumpnow -= GA # 重力加速度
if @jumpnow < 0 # 下降阶段
@jumpnow = [@jumpnow, -JUMPMAX].max # 容错
for i in 0..- (@jumpnow / 4) + 1
if not down2(x, y, i * 4) # 已经找到地面的情况
down1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, (i - 1) * 4, true)
# 跳跃落地时间的问题
if @after_jump_wait_count > 0
if FORBID_JUMP_WAIT
@after_jump_wait_release = true
@after_jump_wait_count = JUMP_INIT_WAIT_COUNT - 1
else
@after_jump_wait_release = true
end
else
@after_jump_wait_count = JUMP_INIT_WAIT_COUNT
@after_jump_wait_release = false
end
@jumpnow = 0
@twojump = 0
break
end
end
if @jumpnow != 0
down1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, -@jumpnow, true)
@after_jump_wait_count += 1
# @jumpnow = 0
# @twojump = 0
end
elsif @jumpnow > 0 # 自由落体上升阶段,这段的封顶修改还得改改,up1太粗糙了
@jumpnow = [@jumpnow, JUMPMAX].min
if not up1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, @jumpnow, true)
@jumpnow = 0
end
end
end
end
#--------------------------------------------------------------------------
# ● 控制角色移动的主代码
#--------------------------------------------------------------------------
def control_player_move
# 向某方向按键的处理,这里是很重要的主处理部分,各种跑步动作一类的设置
# 面域的行走等,都可以从这个地方引申出来
unless @after_jump_wait_release
if $emuInput != nil
inputdir8($emuInput)
else
inputdir8(Input.dir8)
end
end
end
def inputdir8(inputtt)
case inputtt
when 1
$ud_ok ? move_lower_left_p : move_left_p_upgrade
when 2
move_down_p if $ud_ok
when 3
$ud_ok ? move_lower_right_p : move_right_p_upgrade
when 4
$ud_ok ? move_left_p : move_left_p_upgrade
when 6
$ud_ok ? move_right_p : move_right_p_upgrade
when 7
$ud_ok ? move_upper_left_p : move_left_p_upgrade(true)
when 8
move_up_p if $ud_ok
when 9
$ud_ok ? move_upper_right_p : move_right_p_upgrade(true)
end
end
#--------------------------------------------------------------------------
# ● 移動判定
#--------------------------------------------------------------------------
def moving?
unless @dot_m
result = super
return result
end
# 強制移動の場合オリジナルの判定をさせる
if @move_route_forcing
if @move == false
return false
end
super
# 通常時は現座標が実座標と異なる場合のみ移動中と判定
else
return (@x != (@real_x / 128.0).round or @y != (@real_y / 128.0).round)
end
end
#--------------------------------------------------------------------------
# ● 移動判定
#--------------------------------------------------------------------------
def moving_a?
if @move == false
if (@move_route.list[@move_route_index].code <= 14 or
@move_route.list[@move_route_index].code == 25)
@move = true
end
return false
end
moving?
end
#--------------------------------------------------------------------------
# ● フレーム更新 (ジャンプ)
#--------------------------------------------------------------------------
def update_jump
# ジャンプカウントを 1 減らす
@jump_count -= 1
# 新しい座標を計算
@real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
@real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
if @jump_count == 0
@revise_x = 0
@revise_y = 0
end
end
#--------------------------------------------------------------------------
# ● 移動タイプ : カスタム
#--------------------------------------------------------------------------
def move_type_custom
unless @dot_m
super
return
end
# 停止中でなければ中断
if jumping? or moving_a?
return
end
# 移動コマンドのリストの最後に到達するまでループ
while @move_route_index < @move_route.list.size
# 移動コマンドを取得
command = @move_route.list[@move_route_index]
# コマンドコード 0 番 (リストの最後) の場合
if command.code == 0
# オプション [動作を繰り返す] が ON の場合
if @move_route.repeat
# 移動ルートのインデックスを最初に戻す
@move_route_index = 0
end
# オプション [動作を繰り返す] が OFF の場合
unless @move_route.repeat
# 移動ルート強制中の場合
if @move_route_forcing and not @move_route.repeat
# 移動ルートの強制を解除
@move_route_forcing = false
# オリジナルの移動ルートを復帰
@move_route = @original_move_route
@move_route_index = @original_move_route_index
@original_move_route = nil
end
# 停止カウントをクリア
@stop_count = 0
end
return
end
# 移動系コマンド (下に移動~ジャンプ) の場合
if command.code <= 14
# コマンドコードで分岐
case command.code
when 1 # 下に移動
move_down
when 2 # 左に移動
move_left
when 3 # 右に移動
move_right
when 4 # 上に移動
move_up
when 5 # 左下に移動
move_lower_left
when 6 # 右下に移動
move_lower_right
when 7 # 左上に移動
move_upper_left
when 8 # 右上に移動
move_upper_right
when 9 # ランダムに移動
move_random
when 10 # プレイヤーに近づく
move_toward_player
when 11 # プレイヤーから遠ざかる
move_away_from_player
when 12 # 一歩前進
move_forward
when 13 # 一歩後退
move_backward
when 14 # ジャンプ
jump(command.parameters[0], command.parameters[1])
end
# オプション [移動できない場合は無視] が OFF で、移動失敗の場合
if not @move_route.skippable and not moving? and not jumping?
return
end
@move_route_index += 1
return
end
# ウェイトの場合
if command.code == 15
# ウェイトカウントを設定
@wait_count = command.parameters[0] * 2 - 1
@move_route_index += 1
return
end
# 向き変更系のコマンドの場合
if command.code >= 16 and command.code <= 26
# コマンドコードで分岐
case command.code
when 16 # 下を向く
turn_down
when 17 # 左を向く
turn_left
when 18 # 右を向く
turn_right
when 19 # 上を向く
turn_up
when 20 # 右に 90 度回転
turn_right_90
when 21 # 左に 90 度回転
turn_left_90
when 22 # 180 度回転
turn_180
when 23 # 右か左に 90 度回転
turn_right_or_left_90
when 24 # ランダムに方向転換
turn_random
when 25 # プレイヤーの方を向く
turn_toward_player
when 26 # プレイヤーの逆を向く
turn_away_from_player
end
@move_route_index += 1
return
end
# その他のコマンドの場合
if command.code >= 27
# コマンドコードで分岐
case command.code
when 27 # スイッチ ON
$game_switches[command.parameters[0]] = true
$game_map.need_refresh = true
when 28 # スイッチ OFF
$game_switches[command.parameters[0]] = false
$game_map.need_refresh = true
when 29 # 移動速度の変更
@move_speed = command.parameters[0]
when 30 # 移動頻度の変更
@move_frequency = command.parameters[0]
when 31 # 移動時アニメ ON
@walk_anime = true
when 32 # 移動時アニメ OFF
@walk_anime = false
when 33 # 停止時アニメ ON
@step_anime = true
when 34 # 停止時アニメ OFF
@step_anime = false
when 35 # 向き固定 ON
@direction_fix = true
when 36 # 向き固定 OFF
@direction_fix = false
when 37 # すり抜け ON
@through = true
when 38 # すり抜け OFF
@through = false
when 39 # 最前面に表示 ON
@always_on_top = true
when 40 # 最前面に表示 OFF
@always_on_top = false
when 41 # グラフィック変更
@tile_id = 0
@character_name = command.parameters[0]
@character_hue = command.parameters[1]
if @original_direction != command.parameters[2]
@direction = command.parameters[2]
@original_direction = @direction
@prelock_direction = 0
end
if @original_pattern != command.parameters[3]
@pattern = command.parameters[3]
@original_pattern = @pattern
end
when 42 # 不透明度の変更
@opacity = command.parameters[0]
when 43 # 合成方法の変更
@blend_type = command.parameters[0]
when 44 # SE の演奏
$game_system.se_play(command.parameters[0])
when 45 # スクリプト
result = eval(command.parameters[0])
end
@move_route_index += 1
return
end
end
end
#--------------------------------------------------------------------------
# ● 下に移動
#--------------------------------------------------------------------------
def move_down_p
# 下を向く
turn_down
# 计算出移动距离
distance = 2 ** @move_speed
#down1(((@x * 128 + @revise_x) / 128.0).round,
# ((@y * 128 + @revise_y) / 128.0).round, distance, true)
for i in 1..distance.to_i / 4 + 1
if down1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance, true)
break
else
distance = [distance - 4, 0].max
break if distance == 0
end
end
end
def move_down_aaaagq
distance = 2 ** @move_speed
down1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance, true)
end
#--------------------------------------------------------------------------
# ● 下に移動可能かどうかの判定1
#--------------------------------------------------------------------------
def down1(x, y, distance, down = false)
result = down2(x, y, distance)
if result == false
@event_run = check_event_trigger_touch(x, y+1)
return result
end
if @revise_x < -SIDE
result = down2(x, y + 1, distance, 4)
result &= down2(x - 1, y, distance)
if result == false
if down
move_lower_right_p
if @revise_x > SIDE
@revise_x = SIDE
end
end
return result
end
elsif @revise_x > SIDE
result = down2(x, y + 1, distance, 6)
result &= down2(x + 1, y, distance)
if result == false
if down
move_lower_left_p
if @revise_x < -SIDE
@revise_x = -SIDE
end
end
return result
end
end
# 移动像素
@revise_y += distance
return result
end
#--------------------------------------------------------------------------
# ● 下に移動可能かどうかの判定2
#--------------------------------------------------------------------------
def down2(x, y, distance, d = 2)
#return $game_map.passable_map_pixel?(screen_x, screen_y + distance / 4, d, x, y, distance)
return passable_map_pixel?(all_screen_x, all_screen_y + distance / 4, d) # + distance / 4
if @revise_y + distance > DOWN
unless passable?(x, y, d)
if @revise_y < DOWN
@revise_y = DOWN
end
return false
end
end
return true
end
#--------------------------------------------------------------------------
# ● 左に移動
#--------------------------------------------------------------------------
def move_left_p
# 左を向く
turn_left
distance = 2 ** @move_speed
for i in 1..distance.to_i / 4 + 1
if left1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance, true)
break
else
distance = [distance - 4, 0].max
break if distance == 0
end
end
end
#--------------------------------------------------------------------------
# ● 左移動upgrade
#--------------------------------------------------------------------------
def move_left_p_upgrade(uping = false)
# 左を向く
turn_left
distance = 2 ** @move_speed
for i in 1..distance.to_i / 4 + 1
if left1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance, true, true, uping)
break
else
distance = [distance - 4, 0].max
break if distance == 0
end
end
end
#--------------------------------------------------------------------------
# ● 左に移動可能かどうかの判定1
#--------------------------------------------------------------------------
def left1(x, y, distance, left = false, upgrade = false, uping = false)
if upgrade
result = left2(x, y, distance, 4, upgrade, uping)
if result[0] == false
@event_run = check_event_trigger_touch(x-1, y)
return result[0]
end
@revise_x -= distance
@revise_y += result[1] * 4
return result[0]
else
result = left2(x, y, distance, 4, upgrade)
if result == false
@event_run = check_event_trigger_touch(x-1, y)
return result
end
if @revise_y < -UP and $ud_ok
result = left2(x - 1, y, distance, 8)
result &= left2(x, y - 1, distance)
if result == false
if left
move_lower_left_p
if @revise_y > DOWN
@revise_y = DOWN
end
end
return result
end
elsif @revise_y > DOWN and $ud_ok
result = left2(x - 1, y, distance, 2)
result &= left2(x, y + 1, distance)
if result == false
if left
move_upper_left_p
if @revise_y < -UP
@revise_y = -UP
end
end
return result
end
end
@revise_x -= distance
return result
end
end
#--------------------------------------------------------------------------
# ● 左に移動可能かどうかの判定2
#--------------------------------------------------------------------------
def left2(x, y, distance, d = 4, upgrade = false, uping = false)
#return $game_map.passable_map_pixel?(screen_x - distance / 4, screen_y, d)
#unless upgrade
# return passable_map_pixel?(all_screen_x - distance / 4, all_screen_y , d)
#else
# if Input.repeat?(Input::UP)
# for i in -UPGRADE_PIXEL..UPGRADE_PIXEL
# #p all_screen_x - distance / 4, all_screen_y + i, d
# if passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i, d) and
# !passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i + 1, d)
# return [true, +i]
# end
# end
# else
# for i in -UPGRADE_PIXEL..UPGRADE_PIXEL
# #p all_screen_x - distance / 4, all_screen_y + i, d
# if passable_map_pixel?(all_screen_x - distance / 4, all_screen_y - i, d) and
# !passable_map_pixel?(all_screen_x - distance / 4, all_screen_y - i + 1, d)
# return [true, -i]
# end
# end
# end
# return [false, 0]
#end
unless upgrade
return passable_map_pixel?(all_screen_x - distance / 4, all_screen_y , d)
else
if uping
for i in -UPGRADE_PIXEL..UPGRADE_PIXEL
if passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i , d) and
!passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i + 1, d)
return [true, +i]
end
end
else
for i in 0..UPGRADE_PIXEL
#p all_screen_x - distance / 4, all_screen_y + i, d
if passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i , d) and
!passable_map_pixel?(all_screen_x - distance / 4, all_screen_y + i + 1, d)
return [true, +i]
end
if passable_map_pixel?(all_screen_x - distance / 4, all_screen_y - i , d) and
!passable_map_pixel?(all_screen_x - distance / 4, all_screen_y - i + 1, d)
return [true, -i]
end
end
end
# return [true, 0]
return [false, 0]
end
if @revise_x - distance < -SIDE
unless passable?(x, y, d)
if @revise_x > -SIDE
@revise_x = -SIDE
end
return false
end
end
return true
end
#--------------------------------------------------------------------------
# ● 右に移動
#--------------------------------------------------------------------------
def move_right_p
# 右を向く
turn_right
distance = 2 ** @move_speed
for i in 1..distance.to_i / 4 + 1
if right1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance, true)
break
else
distance = [distance - 4, 0].max
break if distance == 0
end
end
end
#--------------------------------------------------------------------------
# ● 右に移動
#--------------------------------------------------------------------------
def move_right_p_upgrade(uping = false)
# 右を向く
turn_right
distance = 2 ** @move_speed
for i in 1..distance.to_i / 4 + 1
if right1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance, true, true, uping)
break
else
distance = [distance - 4, 0].max
break if distance == 0
end
end
end
#--------------------------------------------------------------------------
# ● 右に移動可能かどうかの判定1
#--------------------------------------------------------------------------
def right1(x, y, distance, right = false, upgrade = false, uping = false)
if upgrade
result = right2(x, y, distance, 6, upgrade, uping)
if result[0] == false
@event_run = check_event_trigger_touch(x+1, y)
return result[0]
end
@revise_x += distance
@revise_y += result[1] * 4
return result[0]
else
result = right2(x, y, distance)
if result == false
@event_run = check_event_trigger_touch(x+1, y)
return result
end
if @revise_y < -UP and $ud_ok
result = right2(x + 1, y, distance, 8)
result &= right2(x, y - 1, distance)
if result == false
if right
move_lower_right_p
if @revise_y > DOWN
@revise_y = DOWN
end
end
return result
end
elsif @revise_y > DOWN and $ud_ok
result = right2(x + 1, y, distance, 2)
result &= right2(x, y + 1, distance)
if result == false
if right
move_upper_right_p
if @revise_y < -UP
@revise_y = -UP
end
end
return result
end
end
@revise_x += distance
return result
end
end
#--------------------------------------------------------------------------
# ● 是否能向右移动,尚未添加SIDE的判断
#--------------------------------------------------------------------------
def right2(x, y, distance, d = 6, upgrade = false, uping = false)
# p upgrade # $game_map.passable_map_pixel?(screen_x + distance / 4, screen_y, d)
#return $game_map.passable_map_pixel?(screen_x + distance / 4, screen_y, d)
#return passable_map_pixel?(all_screen_x + distance / 4, all_screen_y , d)
unless upgrade
return passable_map_pixel?(all_screen_x + distance / 4, all_screen_y , d)
else
if uping
for i in -UPGRADE_PIXEL..UPGRADE_PIXEL
if passable_map_pixel?(all_screen_x + distance / 4, all_screen_y + i , d) and
!passable_map_pixel?(all_screen_x + distance / 4, all_screen_y + i + 1, d)
return [true, +i]
end
end
else
for i in 0..UPGRADE_PIXEL
#p all_screen_x - distance / 4, all_screen_y + i, d
if passable_map_pixel?(all_screen_x + distance / 4, all_screen_y + i , d) and
!passable_map_pixel?(all_screen_x + distance / 4, all_screen_y + i + 1, d)
return [true, +i]
end
if passable_map_pixel?(all_screen_x + distance / 4, all_screen_y - i , d) and
!passable_map_pixel?(all_screen_x + distance / 4, all_screen_y - i + 1, d)
return [true, -i]
end
end
end
# return [true, 0]
return [false,0]
end
if @revise_x + distance > SIDE
unless passable?(x, y, d)
if @revise_x < SIDE
@revise_x = SIDE
end
return false
end
end
return true
end
#--------------------------------------------------------------------------
# ● 上に移動
#--------------------------------------------------------------------------
def move_up_p
# 上を向く
turn_up
# 下に移動
distance = 2 ** @move_speed
#up1(((@x * 128 + @revise_x) / 128.0).round,
# ((@y * 128 + @revise_y) / 128.0).round, distance, true)
for i in 1..distance.to_i / 4 + 1
if up1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance, true)
break
else
distance = [distance - 4, 0].max
break if distance == 0
end
end
end
def move_up_aaaagq
distance = 2 ** @move_speed
up1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance, true)
end
#--------------------------------------------------------------------------
# ● 上に移動可能かどうかの判定1
#--------------------------------------------------------------------------
def up1(x, y, distance, up = false)
result = up2(x, y, distance)
if result == false
@event_run = check_event_trigger_touch(x, y-1)
return result
end
if @revise_x < -SIDE
result = up2(x, y - 1, distance, 4)
result &= up2(x - 1, y, distance)
if result == false
if up
move_upper_right_p
if @revise_x > SIDE
@revise_x = SIDE
end
end
return result
end
elsif @revise_x > SIDE
result = up2(x, y - 1, distance, 6)
result &= up2(x + 1, y, distance)
if result == false
if up
move_upper_left_p
if @revise_x < -SIDE
@revise_x = -SIDE
end
end
return result
end
end
@revise_y -= distance
return result
end
#--------------------------------------------------------------------------
# ● 上に移動可能かどうかの判定2
#--------------------------------------------------------------------------
def up2(x, y, distance, d = 8)
#return $game_map.passable_map_pixel?(screen_x, screen_y - distance / 4, d)
$debug_string = "in_x=#{all_screen_x} in_y=#{all_screen_y + distance / 4}"
return passable_map_pixel?(all_screen_x, all_screen_y - distance / 4, d) #- distance / 4
if @revise_y - distance < -UP
unless passable?(x, y, d)
if @revise_y > -UP
@revise_y = -UP
end
return false
end
end
return true
end
#--------------------------------------------------------------------------
# ● 左下に移動
#--------------------------------------------------------------------------
def move_lower_left_p
# 向き固定でない場合
unless @direction_fix
# 右向きだった場合は左を、上向きだった場合は下を向く
@direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)
end
# 左下に移動
distance = ((2 ** @move_speed) / Math.sqrt(2)).round
if @direction == 2
turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_down if @event_run
unless @event_run
if last_move?(@real_x, @real_y, 2, distance)
result = check_event_trigger_here([1,2], false)
if result == true
return
end
end
move_on
if @revise_y > DOWN and -UP > @revise_y - distance
@revise_y = DOWN
end
turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_left if @event_run
end
else
turn_down unless left1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_left if @event_run
unless @event_run
if last_move?(@real_x, @real_y, 4, distance)
result = check_event_trigger_here([1,2], false)
if result == true
return
end
end
move_on
if @revise_x + distance> SIDE and -SIDE > @revise_x
@revise_x = -SIDE
end
turn_left unless down1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_down if @event_run
end
end
end
#--------------------------------------------------------------------------
# ● 右下に移動
#--------------------------------------------------------------------------
def move_lower_right_p
# 向き固定でない場合
unless @direction_fix
# 左向きだった場合は右を、上向きだった場合は下を向く
@direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)
end
# 右下に移動
distance = ((2 ** @move_speed) / Math.sqrt(2)).round
if @direction == 2
turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_down if @event_run
unless @event_run
if last_move?(@real_x, @real_y, 2, distance)
result = check_event_trigger_here([1,2], false)
if result == true
return
end
end
move_on
if @revise_y > DOWN and -UP > @revise_y - distance
@revise_y = DOWN
end
turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_right if @event_run
end
else
turn_down unless right1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_right if @event_run
unless @event_run
if last_move?(@real_x, @real_y, 6, distance)
result = check_event_trigger_here([1,2], false)
if result == true
return
end
end
move_on
if @revise_x > SIDE and -SIDE > @revise_x - distance
@revise_x = SIDE
end
turn_right unless down1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_down if @event_run
end
end
end
#--------------------------------------------------------------------------
# ● 左上に移動
#--------------------------------------------------------------------------
def move_upper_left_p
# 向き固定でない場合
unless @direction_fix
# 右向きだった場合は左を、下向きだった場合は上を向く
@direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)
end
# 左上に移動
distance = ((2 ** @move_speed) / Math.sqrt(2)).round
if @direction == 8
turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_up if @event_run
unless @event_run
if last_move?(@real_x, @real_y, 8, distance)
result = check_event_trigger_here([1,2], false)
if result == true
return
end
end
move_on
if @revise_y + distance > DOWN and -UP > @revise_y
@revise_y = -UP
end
turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_left if @event_run
end
else
turn_up unless left1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_left if @event_run
unless @event_run
if last_move?(@real_x, @real_y, 4, distance)
result = check_event_trigger_here([1,2], false)
if result == true
return
end
end
move_on
if @revise_x > SIDE and -SIDE > @revise_x - distance
@revise_x = SIDE
end
turn_left unless up1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_up if @event_run
end
end
end
#--------------------------------------------------------------------------
# ● 右上に移動
#--------------------------------------------------------------------------
def move_upper_right_p
# 向き固定でない場合
unless @direction_fix
# 左向きだった場合は右を、下向きだった場合は上を向く
@direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)
end
# 右上に移動
distance = ((2 ** @move_speed) / Math.sqrt(2)).round
if @direction == 8
turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_up if @event_run
unless @event_run
if last_move?(@real_x, @real_y, 8, distance)
result = check_event_trigger_here([1,2], false)
if result == true
return
end
end
move_on
if @revise_y + distance > DOWN and -UP > @revise_y
@revise_y = -UP
end
turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_right if @event_run
end
else
turn_up unless right1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_right if @event_run
unless @event_run
if last_move?(@real_x, @real_y, 6, distance)
result = check_event_trigger_here([1,2], false)
if result == true
return
end
end
move_on
if @revise_x > SIDE and -SIDE > @revise_x - distance
@revise_x = SIDE
end
turn_right unless up1(((@x * 128 + @revise_x) / 128.0).round,
((@y * 128 + @revise_y) / 128.0).round, distance)
turn_up if @event_run
end
end
end
#--------------------------------------------------------------------------
# ● 同位置のイベント起動判定
#--------------------------------------------------------------------------
def check_event_trigger_here(triggers, run = true)
result = false
# イベント実行中の場合
if $game_system.map_interpreter.running?
return result
end
# 全イベントのループ
for event in $game_map.events.values
# イベントの座標とトリガーが一致した場合
if event.x == ((@x * 128 + @revise_x) / 128.0).round and
event.y == ((@y * 128 + @revise_y) / 128.0).round and
triggers.include?(event.trigger)
# ジャンプ中以外で、起動判定が同位置のイベントなら
if not event.jumping? and event.over_trigger?
if event.list.size > 1
if run == true
event.start
end
result = true
end
end
end
end
return result
end
#--------------------------------------------------------------------------
# ● 坐标修正,这个的功能是用来在走过一格之后把修正坐标清理为正确的数值
# 再添加一些定定期的硬运算修正会不会更好?不过似乎现在也不是很容易出问题
#--------------------------------------------------------------------------
def move_on
if @y < (@y + @revise_y / 128.0).round
@y += 1
@revise_y -= 128
end
if @x > (@x + @revise_x / 128.0).round
@x -= 1
@revise_x += 128
end
if @x < (@x + @revise_x / 128.0).round
@x += 1
@revise_x -= 128
end
if @y > (@y + @revise_y / 128.0).round
@y -= 1
@revise_y += 128
end
end
#--------------------------------------------------------------------------
# ● 自动切换图片的原地踏步刷新
#--------------------------------------------------------------------------
def anime_update
# 移动时动画为 ON 的情况下
if @walk_anime
# 动画计数增加 1.5
@anime_count += 1.5
# 移动时动画为 OFF、停止时动画为 ON 的情况下
elsif @step_anime
# 动画计数增加 1
@anime_count += 1
end
# 动画计数超过最大值的情况下
# ※最大值等于基本值减去移动速度 * 1 的值
if @anime_count > 13 - @move_speed * 2
# 停止动画为 OFF 并且在停止中的情况下
if not @step_anime and @stop_count > 0
# 还原为原来的图形
@pattern = @original_pattern
# 停止动画为 ON 并且在移动中的情况下
else
# 更新图形
@pattern = (@pattern + 1) % 8
end
# 清除动画计数
@anime_count = 0
end
end
#--------------------------------------------------------------------------
# ● 移动到指定位置
#--------------------------------------------------------------------------
alias :moveto_original :moveto
def moveto(x, y)
# 坐标修正,用来制作按象素移动的方法。
@revise_x = 0
@revise_y = 0
moveto_original(x, y)
end
#--------------------------------------------------------------------------
# ● 移動したかどうかの判定
#--------------------------------------------------------------------------
def last_move?(x, y, direction, distance)
if direction == 2 or direction == 6
distance *= -1
end
if (direction == 2 or direction == 8) and
(y / 128.0).round != ((y - distance) / 128.0).round
return true
end
if (direction == 4 or direction == 6) and
(x / 128.0).round != ((x - distance) / 128.0).round
return true
end
return false
end
end
#==============================================================================
# ■ Game_Character (分割定義 1)
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# ● 更新画面 (移动)
#--------------------------------------------------------------------------
def update_move
# 移动速度转换为地图坐标系的移动距离
distance = 2 ** @move_speed
if @x * 128 != @real_x and @y * 128 != @real_y and Game_Player::SLANT
distance /= Math.sqrt(2)
distance = distance.round
end
# 理论坐标在实际坐标下方的情况下
if @y * 128 > @real_y
# 向下移动
@real_y = [@real_y + distance, @y * 128].min
end
# 理论坐标在实际坐标左方的情况下
if @x * 128 < @real_x
# 向左移动
@real_x = [@real_x - distance, @x * 128].max
end
# 理论坐标在实际坐标右方的情况下
if @x * 128 > @real_x
# 向右移动
@real_x = [@real_x + distance, @x * 128].min
end
# 理论坐标在实际坐标上方的情况下
if @y * 128 < @real_y
# 向上移动
@real_y = [@real_y - distance, @y * 128].max
end
# 移动时动画为 ON 的情况下
if @walk_anime
# 动画计数增加 1.5
@anime_count += 1.5
# 移动时动画为 OFF、停止时动画为 ON 的情况下
elsif @step_anime
# 动画计数增加 1
@anime_count += 1
end
end
end
#==============================================================================
# ■ Game_Event
#==============================================================================
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● イベント起動
#--------------------------------------------------------------------------
def start
# 実行内容が空でない場合
if @list.size > 1
# $game_player.event が0でない場合
if $game_player.event != 0
# 移動速度を $game_player.event にする
$game_player.move_speed = $game_player.event
end
@starting = true
end
end
end
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
dsu_plus_rewardpost_czw作者: 咚小黑 时间: 2011-11-20 19:31
1. 这个脚本又长又臭(我没有鼻子)
2. 没有放进代码框发帖
3. 把 $ud_ok = true 改 $ud_ok = false 就是跳跃模式
4. 用法就在事件里的脚本