赞 | 12 |
VIP | 107 |
好人卡 | 6 |
积分 | 4 |
经验 | 31122 |
最后登录 | 2024-6-29 |
在线时间 | 1606 小时 |
Lv2.观梦者 傻♂逼
- 梦石
- 0
- 星屑
- 374
- 在线时间
- 1606 小时
- 注册时间
- 2007-3-13
- 帖子
- 6562
|
4楼
楼主 |
发表于 2008-8-2 06:17:15
|
只看该作者
next
这个可以做出比较美观的ARPG了
带ACT风~~
- 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
- #--------------------------------------------------------------------------
- # ● 左に移動可能かどうかの判定2
- #--------------------------------------------------------------------------
- def left2(x, y, distance, d = 4)
- 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
- right1(((@x * 128 + @revise_x) / 128.0).round,
- ((@y * 128 + @revise_y) / 128.0).round, distance, true)
- end
- #--------------------------------------------------------------------------
- # ● 右に移動可能かどうかの判定1
- #--------------------------------------------------------------------------
- def right1(x, y, distance, right = false)
- 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
- #--------------------------------------------------------------------------
- # ● 右に移動可能かどうかの判定2
- #--------------------------------------------------------------------------
- def right2(x, y, distance, d = 6)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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 += 5
- # 移動時アニメが OFF で、停止時アニメが ON の場合
- elsif @step_anime
- # アニメカウントを 1 増やす
- @anime_count += 1
- end
- # アニメカウントが最大値を超えた場合
- # ※最大値は、基本値 18 から移動速度 * 1 を引いた値
- if @anime_count > 18 - @move_speed * 2
- # 停止時アニメが OFF かつ 停止中の場合
- if not @step_anime and @stop_count > 0
- # パターンをオリジナルに戻す
- @pattern = @original_pattern
- # 停止時アニメが ON または 移動中の場合
- else
- # パターンを更新
- @pattern = (@pattern + 1) % 9
- 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)
- #------------------------------------------------------------------------------
- # キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event
- # クラスのスーパークラスとして使用されます。
- #==============================================================================
- 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)
- 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
- #------------------------------------------------------------------------------
- # イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
- # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
- #==============================================================================
- 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,使用和转载请保留此信息
- #==============================================================================
复制代码 |
|