Project1

标题: 横版行走脚本 [打印本页]

作者: 不会脚本    时间: 2012-1-11 13:10
标题: 横版行走脚本
本帖最后由 不会脚本 于 2012-1-13 18:27 编辑
  1. ==============================================================================
  2. # ■ Game_Map
  3. #------------------------------------------------------------------------------
  4. #  一个类来处理地图。它如滚动并可通过确定功能。
  5. # 这个类的实例引用$ game_map。
  6. #==============================================================================

  7. class Game_Map
  8.   #--------------------------------------------------------------------------
  9.   # ● 设置事件
  10.   # !覆盖
  11.   #--------------------------------------------------------------------------
  12.   def setup_events
  13.     @events = {}          # 活动地图
  14.     for i in @map.events.keys
  15.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  16.       @events[i].gravity = 0 if @events[i].get_name =~ /<飛行>/i
  17.     end
  18.     @common_events = {}   # 通用事件
  19.     for i in 1...$data_common_events.size
  20.       @common_events[i] = Game_CommonEvent.new(i)
  21.     end
  22.   end
  23. end
复制代码
  1. #==============================================================================
  2. # ■ Game_Character
  3. #------------------------------------------------------------------------------
  4. #  一个类来处理字符。这个类的类Game_Player和Game_Event
  5. # 是用来作为类的超类。
  6. #==============================================================================

  7. class Game_Character
  8.   #--------------------------------------------------------------------------
  9.   # ● 公共实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_accessor :gravity             # 重力
  12.   #--------------------------------------------------------------------------
  13.   # ● 对象初始化
  14.   #--------------------------------------------------------------------------
  15.   alias bulletActionCharacter_initialize initialize
  16.   def initialize
  17.     bulletActionCharacter_initialize     # 召回
  18.     @gravity = 5
  19.     @xv = 0
  20.     @yv = 0
  21.     @jump_flag = false
  22.     @touch_flag = -1
  23.     @move_count = 0
  24.     @dash_timer = 0
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 移动决定
  28.   # !覆盖
  29.   #--------------------------------------------------------------------------
  30.   def moving?
  31.     return @move_count > 0
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # ● 向左移动
  35.   # !覆盖
  36.   #     turn_ok :允许改变飞行方向
  37.   #--------------------------------------------------------------------------
  38.   def move_left(turn_ok = true)
  39.     turn_left
  40.     @xv = -4 * @move_speed
  41.     @move_count = 16
  42.   end
  43.   #--------------------------------------------------------------------------
  44.   # ● 向右移动
  45.   # !覆盖
  46.   #     turn_ok :允许改变飞行方向
  47.   #--------------------------------------------------------------------------
  48.   def move_right(turn_ok = true)
  49.     turn_right
  50.     @xv = 4 * @move_speed
  51.     @move_count = 16
  52.   end
  53.   #--------------------------------------------------------------------------
  54.   # ● 向上移动
  55.   # !覆盖
  56.   #     turn_ok : 允许改变飞行方向
  57.   #--------------------------------------------------------------------------
  58.   def move_up(turn_ok = true)
  59.     @stop_count = 0
  60.     @yv = -4 * @move_speed
  61.     @move_count = 16
  62.   end
  63.   #--------------------------------------------------------------------------
  64.   # ● 向下移动
  65.   # !覆盖
  66.   #     turn_ok : 允许改变飞行方向
  67.   #--------------------------------------------------------------------------
  68.   def move_down(turn_ok = true)
  69.     @stop_count = 0
  70.     @yv = max_speed = 4 * @move_speed
  71.     @move_count = 16
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● 向左下移动
  75.   # !覆盖
  76.   #--------------------------------------------------------------------------
  77.   def move_lower_left
  78.     turn_left
  79.     @xv = -4 * @move_speed
  80.     @yv = max_speed = 4 * @move_speed
  81.     @move_count = 16
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 向右下移动
  85.   # !覆盖
  86.   #--------------------------------------------------------------------------
  87.   def move_lower_right
  88.     turn_right
  89.     @xv = 4 * @move_speed
  90.     @yv = max_speed = 4 * @move_speed
  91.     @move_count = 16
  92.   end
  93.   #--------------------------------------------------------------------------
  94.   # ● 向左上移动
  95.   # !覆盖
  96.   #--------------------------------------------------------------------------
  97.   def move_upper_left
  98.     turn_left
  99.     @xv = -4 * @move_speed
  100.     @yv = -4 * @move_speed
  101.     @move_count = 16
  102.   end
  103.   #--------------------------------------------------------------------------
  104.   # ● 向右上移动
  105.   # !覆盖
  106.   #--------------------------------------------------------------------------
  107.   def move_upper_right
  108.     turn_right
  109.     @xv = 4 * @move_speed
  110.     @yv = -4 * @move_speed
  111.     @move_count = 16
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # ● 测定可通行地图
  115.   # !覆盖
  116.   #     mode : X方向是0,1 ​​Y方向
  117.   #--------------------------------------------------------------------------
  118.   def map_passable?(mode)
  119.     left_x = @real_x + 32 >> 8    # 4 <<3
  120.     right_x = @real_x + 224 >> 8  # 28 << 3
  121.     up_y = @real_y + 16 >> 8      # 2 << 3
  122.     down_y = @real_y + 224 >> 8   # 28 << 3
  123.     if mode == 0
  124.       if @xv > 0
  125.         return false unless $game_map.passable?(right_x, up_y)
  126.         return false unless $game_map.passable?(right_x, down_y)
  127.       else
  128.         return false unless $game_map.passable?(left_x, up_y)
  129.         return false unless $game_map.passable?(left_x, down_y)
  130.       end
  131.     else
  132.       if @yv > 0
  133.         return false unless $game_map.passable?(left_x, down_y)
  134.         return false unless $game_map.passable?(right_x, down_y)
  135.       else
  136.         return false unless $game_map.passable?(left_x, up_y)
  137.         return false unless $game_map.passable?(right_x, up_y)
  138.       end
  139.     end
  140.     return true
  141.   end
  142.   #--------------------------------------------------------------------------
  143.   # ● 测定可通行地图
  144.   # !覆盖
  145.   #     mode : X方向是0,1 ​​Y方向
  146.   #--------------------------------------------------------------------------
  147.   def passable?(mode = 0)
  148.     return false unless map_passable?(mode)         # 不可超过地图?
  149.     return true if @through or debug_through?       # 滑倒 ON?
  150.     return false if collide_with_characters?(x, y)  # 碰撞?
  151.     return true                                     # 可通行
  152.   end
  153.   #--------------------------------------------------------------------------
  154.   # ● 接触判定
  155.   #     real_x : X 坐标
  156.   #     real_y : Y 坐标
  157.   #--------------------------------------------------------------------------
  158.   def hit_pos?(real_x, real_y)
  159.     if @real_x + 32 < real_x + 224 && real_x + 32 < @real_x + 224   # 4 << 3, 28 << 3
  160.       if @real_y < real_y + 224 && real_y < @real_y + 224
  161.         return true
  162.       end
  163.     end
  164.     return false
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   # ● キャラクター衝突判定
  168.   # !覆盖
  169.   #     x : X 坐标
  170.   #     y : Y 坐标
  171.   #    包括人物和怪物,普通人物的碰撞。
  172.   #--------------------------------------------------------------------------
  173.   def collide_with_characters?(x, y)
  174.     for event in $game_map.events.values          # 搜索所有事件
  175.       next if event.through                       # 下滑OFF?
  176.       next if event.id == self.id                 # 忽略自己
  177.       if hit_pos?(event.real_x, event.real_y)
  178.         @touch_flag = event.id
  179.         return true
  180.       end
  181.     end
  182.     if @priority_type == 1                        # 人物通常是
  183.       unless self.is_a?(Game_Player)
  184.         if hit_pos?($game_player.real_x, $game_player.real_y)     # 接触玩家
  185.           @touch_flag = 0
  186.           return true
  187.         end
  188.       end
  189.     end
  190.     return false
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # ● 更新帧
  194.   # !覆盖
  195.   #--------------------------------------------------------------------------
  196.   def update
  197.     move_dash if dash?
  198.     update_x
  199.     update_y
  200.     if moving?    # 移动中
  201.       @move_count -= 1
  202.       if @walk_anime
  203.         @anime_count += 1.5
  204.       elsif @step_anime
  205.         @anime_count += 1
  206.       end
  207.     else          # 停止中
  208.       if @step_anime
  209.         @anime_count += 1
  210.       elsif @pattern != @original_pattern
  211.         @anime_count += 1.5
  212.       end
  213.       @stop_count += 1 unless @locked
  214.     end
  215.     if @wait_count > 0          # 等待中
  216.       @wait_count -= 1
  217.     elsif @move_route_forcing   # 强行迁移路线
  218.       move_type_custom
  219.     elsif not @locked           # 锁定时除外
  220.       update_self_movement
  221.     end
  222.     update_animation
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ● x坐标更新
  226.   #--------------------------------------------------------------------------
  227.   def update_x
  228.     if !@jump_flag && !moving?
  229.       @xv = 0
  230.       return
  231.     end
  232.     last_x = @real_x
  233.     @real_x += @xv
  234.     @x = @real_x >> 8
  235.     @touch_flag = -1
  236.     unless passable?(0)
  237.       @real_x = last_x
  238.       @x = @real_x >> 8
  239.       @xv = 0
  240.       check_event_trigger_touch()   # 开始测试接触
  241.     end
  242.   end
  243.   #--------------------------------------------------------------------------
  244.   # ● y坐标更新
  245.   #--------------------------------------------------------------------------
  246.   def update_y
  247.     if  @gravity > 0
  248.       @yv += @gravity
  249.       @yv = 64 if @yv > 64
  250.     elsif !moving?
  251.       @yv = 0
  252.       return
  253.     end
  254.     last_y = @real_y
  255.     @real_y += @yv
  256.     @y = @real_y >> 8
  257.     @touch_flag = -1
  258.     unless passable?(1)
  259.       @real_y = last_y
  260.       @y = @real_y >> 8
  261.       @jump_flag = false if @yv > 0
  262.       @yv = 0
  263.       check_event_trigger_touch()   # 开始测试接触
  264.     end
  265.   end
  266.   #--------------------------------------------------------------------------
  267.   # ● 面对玩家
  268.   # !覆盖
  269.   #--------------------------------------------------------------------------
  270.   def turn_toward_player
  271.     if @real_x < $game_player.real_x
  272.       turn_right
  273.     else
  274.       turn_left
  275.     end
  276.   end
  277.   #--------------------------------------------------------------------------
  278.   # ● 随机移动
  279.   # !覆盖
  280.   #--------------------------------------------------------------------------
  281.   def move_random
  282.     case rand(@gravity == 0 ? 4 : 2)
  283.     when 0;  move_left(false)
  284.     when 1;  move_right(false)
  285.     when 2;  move_up(false)
  286.     when 3;  move_down(false)
  287.     end
  288.   end
  289.   #--------------------------------------------------------------------------
  290.   # ● 更接近给玩家
  291.   # !覆盖
  292.   #--------------------------------------------------------------------------
  293.   def move_toward_player
  294.     sx = distance_x_from_player
  295.     sx > 0 ? move_left : move_right
  296.   end
  297.   #--------------------------------------------------------------------------
  298.   # ● 远离玩家
  299.   # !覆盖
  300.   #--------------------------------------------------------------------------
  301.   def move_away_from_player
  302.     sx = distance_x_from_player
  303.     sx > 0 ? move_right : move_left
  304.   end
  305.   #--------------------------------------------------------------------------
  306.   # ● 跳转
  307.   # !覆盖
  308.   #     x_plus : X 坐标的总和
  309.   #     y_plus : Y 坐标的总和
  310.   #--------------------------------------------------------------------------
  311.   def jump(x_plus, y_plus)
  312.     return if @jump_flag
  313.     @yv = -80
  314.     @jump_flag = true
  315.     @stop_count = 0
  316.   end
  317.   #--------------------------------------------------------------------------
  318.   # ● 开始的事件决定了接触
  319.   #--------------------------------------------------------------------------
  320.   def check_event_trigger_touch()
  321.   end
  322. end
复制代码
  1. #==============================================================================
  2. # ■ Game_Event
  3. #------------------------------------------------------------------------------
  4. #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
  5. # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
  6. #==============================================================================

  7. class Game_Event < Game_Character
  8.   #--------------------------------------------------------------------------
  9.   # ● 接触イベントの起動判定
  10.   # !上書き
  11.   #--------------------------------------------------------------------------
  12.   def check_event_trigger_touch()
  13.     return if $game_map.interpreter.running?
  14.     return if @touch_flag != 0
  15.     if @trigger == 2
  16.       start# if not jumping? and @priority_type == 1
  17.     end
  18.   end
  19.   #--------------------------------------------------------------------------
  20.   # ● イベント名の取得
  21.   #--------------------------------------------------------------------------
  22.   def get_name
  23.     return @event.name
  24.   end
  25.   #--------------------------------------------------------------------------
  26.   # ● フレーム更新
  27.   # !上書き
  28.   #--------------------------------------------------------------------------
  29.   def update
  30. #~     if @trigger != nil
  31. #~       if @trigger <= 2  # トリガーが自動でも並列でもない
  32. #~         return if @real_y > $game_map.display_y + (448 << 3)
  33. #~         return if @real_y < $game_map.display_y - (32 << 3)
  34. #~       end
  35. #~     end
  36.     super
  37.     check_event_trigger_auto                    # 自動イベントの起動判定
  38.     if @interpreter != nil                      # 並列処理が有効
  39.       unless @interpreter.running?              # 実行中でない場合
  40.         @interpreter.setup(@list, @event.id)    # セットアップ
  41.       end
  42.       @interpreter.update                       # インタプリタを更新
  43.     end
  44.   end
  45. end



复制代码
  1. #==============================================================================
  2. # ■ Game_Player
  3. #------------------------------------------------------------------------------
  4. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  5. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  6. #==============================================================================

  7. class Game_Player < Game_Character
  8.   #--------------------------------------------------------------------------
  9.   # ● マップ通行可能判定
  10.   # !上書き
  11.   #     x : X 座標
  12.   #     y : Y 座標
  13.   #--------------------------------------------------------------------------
  14.   def map_passable?(mode)
  15.     super(mode)
  16.   end
  17.   #--------------------------------------------------------------------------
  18.   # ● 正面のイベント起動判定
  19.   # !上書き
  20.   #     triggers : トリガーの配列
  21.   #--------------------------------------------------------------------------
  22.   def check_event_trigger_there(triggers)
  23.     return false if $game_map.interpreter.running?
  24.     result = false
  25.     front_x = @real_x
  26.     front_x -= 64 if @direction == 4    # 8 << 3
  27.     front_x += 320 if @direction == 6   # 40 << 3
  28.     front_y = @real_y + 128   # 16 << 3
  29.     for event in $game_map.events.values
  30.       if event.real_x < front_x && event.real_x + 256 > front_x   # 32 << 3
  31.         if event.real_y < front_y && event.real_y + 256 > front_y   # 32 << 3
  32.           if triggers.include?(event.trigger)
  33.             event.start
  34.             result = true
  35.           end
  36.         end
  37.       end
  38.     end
  39.     return result
  40.   end
  41.   #--------------------------------------------------------------------------
  42.   # ● 接触(重なり)によるイベント起動判定
  43.   # !上書き
  44.   #--------------------------------------------------------------------------
  45.   def check_touch_event
  46.     return false
  47.   end
  48.   #--------------------------------------------------------------------------
  49.   # ● 決定ボタンによるイベント起動判定
  50.   # !上書き
  51.   #--------------------------------------------------------------------------
  52.   def check_action_event
  53.     return false if in_airship?
  54.     return check_event_trigger_there([0,1,2])
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● 移動可能判定
  58.   # !上書き
  59.   #--------------------------------------------------------------------------
  60.   def movable?
  61.     return false if @move_route_forcing         # 移動ルート強制中
  62.     return false if @vehicle_getting_on         # 乗る動作の途中
  63.     return false if @vehicle_getting_off        # 降りる動作の途中
  64.     return false if $game_message.visible       # メッセージ表示中
  65.     return false if in_airship? and not $game_map.airship.movable?
  66.     return true
  67.   end
  68.   #--------------------------------------------------------------------------
  69.   # ● ダッシュ状態判定
  70.   #--------------------------------------------------------------------------
  71.   def dash?
  72.     return false if @move_route_forcing
  73.     return false if $game_map.disable_dash?
  74.     return false if in_vehicle?
  75.     return true if @dash_timer > 0
  76.     return false
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   # ● 左に移動
  80.   # !上書き
  81.   #     turn_ok : その場での向き変更を許可
  82.   #--------------------------------------------------------------------------
  83.   def move_left(turn_ok = true)
  84.     turn_left
  85.     max_speed = -16
  86.     @xv = [@xv + 2, max_speed].min if @xv < max_speed and !@jump_flag
  87.     @xv = [@xv - 2, max_speed].max if @xv > max_speed
  88.     @move_count = 1
  89.   end
  90.   #--------------------------------------------------------------------------
  91.   # ● 右に移動
  92.   # !上書き
  93.   #     turn_ok : その場での向き変更を許可
  94.   #--------------------------------------------------------------------------
  95.   def move_right(turn_ok = true)
  96.     turn_right
  97.     max_speed = 16
  98.     @xv = [@xv + 2, max_speed].min if @xv < max_speed
  99.     @xv = [@xv - 2, max_speed].max if @xv > max_speed and !@jump_flag
  100.     @move_count = 1
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● x座標の更新
  104.   #--------------------------------------------------------------------------
  105.   def update_x
  106.     if !@jump_flag && !moving?
  107.       @xv = [@xv + 2, 0].min if @xv < 0
  108.       @xv = [@xv - 2, 0].max if @xv > 0
  109.     end
  110.     last_x = @real_x
  111.     @real_x += @xv
  112.     @x = @real_x >> 8
  113.     @touch_flag = -1
  114.     unless passable?(0)
  115.       @real_x = last_x
  116.       @x = @real_x >> 8
  117.       @xv = 0
  118.       check_event_trigger_touch()   # 接触起動判定
  119.     end
  120.   end
  121.   #--------------------------------------------------------------------------
  122.   # ● ダッシュ移動
  123.   #--------------------------------------------------------------------------
  124.   def move_dash
  125.     @move_count = 1
  126.     @dash_timer -= 1
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● ジャンプ
  130.   #--------------------------------------------------------------------------
  131.   def move_jump(yv)
  132.     Audio.se_play("Audio/SE/wind7.ogg", 70, 150)
  133.     @yv = yv
  134.     @jump_flag = true
  135.   end
  136.   #--------------------------------------------------------------------------
  137.   # ● 方向ボタン入力による移動処理
  138.   # !上書き
  139.   #--------------------------------------------------------------------------
  140.   def move_by_input
  141.     return unless movable?
  142.     return if $game_map.interpreter.running?
  143.     unless dash?
  144.       if Input.press?(Input::LEFT)
  145.         move_left
  146.       elsif Input.press?(Input::RIGHT)
  147.         move_right
  148.       end
  149.       if Input.trigger?(Input::Z)   # ダッシュ
  150.         Audio.se_play("Audio/SE/wind10.ogg", 60, 150)
  151.         @dash_timer = 20
  152.         @yv = -24
  153.         if @direction == 4
  154.           @xv = -16 * 2 - 8
  155.           turn_left
  156.         else
  157.           @xv = 16 * 2 + 8
  158.           turn_right
  159.         end
  160.       end
  161.     end
  162.     if Input.trigger?(Input::Y) && @jump_flag == false    # ジャンプ
  163.       move_jump(-80)
  164.     end
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   # ● 接触イベントの起動判定
  168.   # !上書き
  169.   #--------------------------------------------------------------------------
  170.   def check_event_trigger_touch
  171.     return if $game_map.interpreter.running?
  172.     for event in $game_map.events.values
  173.       next if event.id != @touch_flag
  174.       if event.trigger == 2
  175.         event.start
  176.         break
  177.       end
  178.     end
  179.   end
  180. end

复制代码
  1. #==============================================================================
  2. # ■ Sprite_Character
  3. #==============================================================================

  4. class Sprite_Character < Sprite_Base
  5.   #--------------------------------------------------------------------------
  6.   # ○ 确定范围更新
  7.   #--------------------------------------------------------------------------
  8.   def within_update_range?
  9.     sx = @character.screen_x - 272
  10.     sy = @character.screen_y - 208
  11.     return (sx.abs <= 336 && sy.abs <= 272)
  12.   end
  13. end
复制代码
  1. #==============================================================================
  2. # ■ Spriteset_Map
  3. #==============================================================================

  4. class Spriteset_Map
  5.   #--------------------------------------------------------------------------
  6.   # ● 字符精灵更新
  7.   #--------------------------------------------------------------------------
  8.   def update_characters
  9.     for sprite in @character_sprites
  10.       sprite.update if sprite.within_update_range?
  11.     end
  12.   end
  13. end
复制代码
其实很早以前就想发了,不过个人汉化注释有限……
还有这个脚本出自http://115.com/file/bhyt98va 这个游戏里面……还是我汉化不全的。
范例: 横版行走.rar (217.19 KB, 下载次数: 4258) 脚本出处:http://www.famitsu.com/freegame/tool/chibi/index1.html
作者: rpg伪    时间: 2012-1-11 15:12
谢谢楼主
作者: 乏味—    时间: 2012-1-11 16:11
本帖最后由 乏味— 于 2012-1-11 16:12 编辑

能给个例图吗  LZ 最好加个范例神马的
作者: 不会脚本    时间: 2012-1-11 17:16
本帖最后由 不会脚本 于 2012-1-28 17:05 编辑

顺带……S是跳
作者: 1097849185    时间: 2012-1-11 19:07
斜方向吗
作者: JATQ    时间: 2012-1-27 16:56
S是跳吧




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1