Project1
标题:
请问在哪里修改主角每步移动的距离(像素)??
[打印本页]
作者:
graykid
时间:
2009-9-18 17:51
标题:
请问在哪里修改主角每步移动的距离(像素)??
默认是32像素吧,想该一下。谢谢
作者:
凌辰
时间:
2009-9-18 17:53
可以改为16px走格……
作者:
graykid
时间:
2009-9-18 18:00
在哪改涅
作者:
霜冻之狼
时间:
2009-9-20 09:58
http://rpg.blue/viewthread.php?tid=133546&highlight=%2BIamI
作者:
神思
时间:
2009-9-22 13:16
LS的只是改速度...
要改这个的话那就麻烦咯```
阻碍与事件的重合判断啦。。。。。
牵扯到很多·····
作者:
graykid
时间:
2009-9-28 20:52
[quote]LS的只是改速度...
要改这个的话那就麻烦咯```
阻碍与事件的重合判断啦。。。。。
牵扯到很多·····
神思 发表于 2009-9-22 13:16
[/siz
对啊我想改小一点,每步一个像素:L
作者:
darkten
时间:
2009-10-2 12:57
本帖最后由 darkten 于 2009-10-2 13:29 编辑
在论坛某处无意中见到的...
没有试验过...
祝你成功...
class Game_Player < Game_Character
#--------------------------------------------------------------------------
# ● 定数
#--------------------------------------------------------------------------
TOP_SPACE = BOTTOM_SPACE = 16 # 上下の判定無視領域
LEFT_SPACE = RIGHT_SPACE = 16 # 左右の判定無視領域
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :dot_moving # ドット移動の向き(nil:ドット移動していない 0:止まっている)
#--------------------------------------------------------------------------
# ● 初期化
#--------------------------------------------------------------------------
def initialize
super
# ドット移動開始、立ち止まらせる
@dot_moving = 0
end
#--------------------------------------------------------------------------
# ● 移動中判定
#--------------------------------------------------------------------------
def moving?(by_update = false)
# 呼び出し元がupdate以外で、かつドット移動中のとき
if !by_update and @dot_moving
# 立ち止まっていなければ移動中
return @dot_moving != 0
else
# ドット移動中でなく、かつ論理座標と実座標が違っていれば移動中
return (!@dot_moving and (@real_x != @x * 128 or @real_y != @y * 128))
end
end
#--------------------------------------------------------------------------
# ● 移動ルートの強制
# move_route : 新しい移動ルート
#--------------------------------------------------------------------------
def force_move_route(move_route)
# 立ち止まらせる
@dot_moving = 0
super(move_route)
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
# ローカル変数に座標を記憶
last_real_x, last_real_y = @real_x, @real_y
last_x, last_y = @x, @y
# ローカル変数に移動中かどうかを記憶
last_moving = moving?(true)
# 移動中、イベント実行中、移動ルート強制中、
# メッセージウィンドウ表示中のいずれでもない場合
unless moving?(true) or $game_system.map_interpreter.running? or
@move_route_forcing or $game_temp.message_window_showing
# ドット移動
dot_move(Input.dir4)
end
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?(true)
# 座標が更新されたか、ドット移動中でなく前回プレイヤーが移動中だった場合
if last_x != @x or last_y != @y or (!@dot_moving and last_moving)
# 同位置のイベントとの接触によるイベント起動判定
result = check_event_trigger_here([1,2])
# 起動したイベントがない場合
if result == false
# デバッグモードが ON かつ CTRL キーが押されている場合を除き
unless $DEBUG and Input.press?(Input::CTRL)
# エンカウント カウントダウン
if @encounter_count > 0
@encounter_count -= 1
end
end
# 起動したイベントがある場合
else
# 立ち止まる、ドット移動していないならそのまま
@dot_moving = @dot_moving ? 0 : nil
end
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 同位置および正面のイベント起動判定
check_event_trigger_here([0])
check_event_trigger_there([0,1,2])
end
end
end
#--------------------------------------------------------------------------
# ● 移動タイプ : カスタム
#--------------------------------------------------------------------------
def move_type_custom
# 停止中でなければ中断
if jumping? or moving?
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
# ドット移動強制終了
@dot_moving = nil
# コマンドコードで分岐
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
end
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (移動)
#--------------------------------------------------------------------------
def update_move
# ドット移動中で無いなら論理座標更新
unless @dot_moving
# 移動速度からマップ座標系での移動距離に変換
distance = 2 ** @move_speed
# 論理座標が実座標より下の場合
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
end
# 移動時アニメが ON の場合
if @walk_anime
# アニメカウントを 1.5 増やす
@anime_count += 1.5
# 移動時アニメが OFF で、停止時アニメが ON の場合
elsif @step_anime
# アニメカウントを 1 増やす
@anime_count += 1
end
end
#--------------------------------------------------------------------------
# ● ドット移動(追加)
# dir : 方向(0,2,4,6,8)
#--------------------------------------------------------------------------
def dot_move(dir)
@dot_moving = dir
# 立ち止まっているかドット移動中でないならすぐにリターン
if dir == 0 or !dir
return
end
# 座標の保存
last_real_x, last_real_y = @real_x, @real_y
last_x, last_y = @x, @y
# 移動速度からマップ座標系での移動距離に変換
distance = 2 ** @move_speed
# 座標を更新、進行方向側の二隅の座標を得る
case dir
when 2
turn_down
@real_y += distance
dx, dy = 0, 1
x1, y1 = @real_x + LEFT_SPACE, @real_y + 127 - BOTTOM_SPACE
x2, y2 = @real_x + 127 - RIGHT_SPACE, y1
when 4
turn_left
@real_x -= distance
dx, dy = -1, 0
x1, y1 = @real_x + LEFT_SPACE, @real_y + TOP_SPACE
x2, y2 = x1, @real_y + 127 - BOTTOM_SPACE
when 6
turn_right
@real_x += distance
dx, dy = 1, 0
x1, y1 = @real_x + 127 - RIGHT_SPACE, @real_y + TOP_SPACE
x2, y2 = x1, @real_y + 127 - BOTTOM_SPACE
when 8
turn_up
@real_y -= distance
dx, dy = 0, -1
x1, y1 = @real_x + LEFT_SPACE, @real_y + TOP_SPACE
x2, y2 = @real_x + 127 - RIGHT_SPACE, y1
end
# 二隅がいずれもキャラクタの論理座標からはみ出している場合
if (x1 / 128 != @x or y1 / 128 != @y) and (x2 / 128 != @x or y2 / 128 != @y)
# 進行方向の二隅がともに通行可能か調べる
@x, @y = x1 / 128 - dx, y1 / 128 - dy
pass1 = passable?(@x, @y, dir)
@x, @y = x2 / 128 - dx, y2 / 128 - dy
pass2 = passable?(@x, @y, dir)
# 座標を元に戻す
@x, @y = last_x, last_y
# 通行可能な場合
if pass1 and pass2
# 新しい実座標の計算
@x, @y = (@real_x + 64) / 128, (@real_y + 64) / 128
# 座標が変化したなら歩数更新
if last_x != @x or last_y != @y
increase_steps
end
# 通行不可能な場合
else
# 立ち止まる
@dot_moving = 0
# 実座標を矯正する
case dir
when 2
@real_y = [(last_real_y + 64) / 128 * 128, last_real_y].max
# 右側に寄っているとき
if @real_x / 128 < @x
# 右のイベントを先に処理
x1, x2 = x2, x1
end
when 4
@real_x = [(last_real_x + 64) / 128 * 128, last_real_x].min
# 下側に寄っているとき
if @real_y / 128 < @y
# 下のイベントを先に処理
y1, y2 = y2, y1
end
when 6
@real_x = [(last_real_x + 64) / 128 * 128, last_real_x].max
# 下側に寄っているとき
if @real_y / 128 < @y
# 下のイベントを先に処理
y1, y2 = y2, y1
end
when 8
@real_y = [(last_real_y + 64) / 128 * 128, last_real_y].min
# 右側に寄っているとき
if @real_x / 128 < @x
# 右のイベントを先に処理
x1, x2 = x2, x1
end
end
# 接触イベントの起動判定(一つ起動したらもう一つは無視)
check_event_trigger_touch(x1 / 128, y1 / 128) or
check_event_trigger_touch(x2 / 128, y2 / 128)
end
end
end
end
class Scene_Map
def update
# ループ
loop do
# マップ、インタプリタ、プレイヤーの順に更新
# (この更新順序は、イベントを実行する条件が満たされているときに
# プレイヤーに一瞬移動する機会を与えないなどの理由で重要)
$game_map.update
$game_system.map_interpreter.update
$game_player.update
# システム (タイマー)、画面を更新
$game_system.update
$game_screen.update
# プレイヤーの場所移動中でなければループを中断
unless $game_temp.player_transferring
break
end
# 場所移動を実行
transfer_player
# トランジション処理中の場合、ループを中断
if $game_temp.transition_processing
break
end
end
# スプライトセットを更新
@spriteset.update
# メッセージウィンドウを更新
@message_window.update
# ゲームオーバーの場合
if $game_temp.gameover
# ゲームオーバー画面に切り替え
$scene = Scene_Gameover.new
return
end
# タイトル画面に戻す場合
if $game_temp.to_title
# タイトル画面に切り替え
$scene = Scene_Title.new
return
end
# トランジション処理中の場合
if $game_temp.transition_processing
# トランジション処理中フラグをクリア
$game_temp.transition_processing = false
# トランジション実行
if $game_temp.transition_name == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +
$game_temp.transition_name)
end
end
# メッセージウィンドウ表示中の場合
if $game_temp.message_window_showing
return
end
# エンカウント カウントが 0 で、エンカウントリストが空ではない場合
if $game_player.encounter_count == 0 and $game_map.encounter_list != []
# イベント実行中かエンカウント禁止中でなければ
unless $game_system.map_interpreter.running? or
$game_system.encounter_disabled
# トループを決定
n = rand($game_map.encounter_list.size)
troop_id = $game_map.encounter_list[n]
# トループが有効なら
if $data_troops[troop_id] != nil
# バトル呼び出しフラグをセット
$game_temp.battle_calling = true
$game_temp.battle_troop_id = troop_id
$game_temp.battle_can_escape = true
$game_temp.battle_can_lose = false
$game_temp.battle_proc = nil
end
end
end
# B ボタンが押された場合
if Input.trigger?(Input::B)
# イベント実行中かメニュー禁止中でなければ
unless $game_system.map_interpreter.running? or
$game_system.menu_disabled
# メニュー呼び出しフラグと SE 演奏フラグをセット
$game_temp.menu_calling = true
$game_temp.menu_beep = true
end
end
# デバッグモードが ON かつ F9 キーが押されている場合
if $DEBUG and Input.press?(Input::F9)
# デバッグ呼び出しフラグをセット
$game_temp.debug_calling = true
end
# ドット移動中でなくプレイヤーの移動中である場合を除き
unless !$game_player.dot_moving and $game_player.moving?
# 各種画面の呼び出しを実行
if $game_temp.battle_calling
call_battle
elsif $game_temp.shop_calling
call_shop
elsif $game_temp.name_calling
call_name
elsif $game_temp.menu_calling
call_menu
elsif $game_temp.save_calling
call_save
elsif $game_temp.debug_calling
call_debug
end
end
end
end
复制代码
作者:
graykid
时间:
2009-10-7 19:18
多谢,但不知道怎么改
作者:
darkten
时间:
2009-10-9 11:06
多谢,但不知道怎么改
graykid 发表于 2009-10-7 19:18
把脚本直接插入脚本编辑器,main上面即可...
不过受影响的只是主角,而且是只限于玩家的控制下才有效果...
(就是说事件设置的移动指令还是默认的32像素...)
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1