设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2666|回复: 4
打印 上一主题 下一主题

[已经解决] 使用「粘性移动平台」时,调高并剪裁行走图

[复制链接]

Lv5.捕梦者

梦石
0
星屑
26264
在线时间
5355 小时
注册时间
2016-3-8
帖子
1655
跳转到指定楼层
1
发表于 2020-8-6 09:45:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 alexncf125 于 2024-1-25 01:47 编辑

站在平台上时,
能把角色的行走图的位置向上昇高一些么?(当平台的行走图是矿车/飞毯时
能把角色的行走图的下半身裁去一部分么?(当平台的行走图只是矿车时
RUBY 代码复制
  1. #==============================================================================
  2. # 粘性移动平台
  3. # by ???nOBodY???
  4. #==============================================================================
  5. # 设置一个粘性平台,首先你需要一个事件
  6. # 在事件的移动路线里使用脚本:
  7. # self.accessible = true 或 self.accessible = false
  8. # 来开启或关闭事件的粘性状态.
  9. #
  10. # 粘性事件移动时会带着玩家一起移动,直至玩家离开事件
  11. # 平台事件的事件页里,并行处理以下内容:
  12. #
  13. # 如果: 脚本: get_character(0).accessible
  14. #   脚本: get_character(0).through = false
  15. #   如果: 脚本: get_character(0).x == $game_player.x &&
  16. #                               get_character(0).y == $game_player.y
  17. #     脚本: $game_player.platformID = @event_id
  18. #   结束
  19. # 否则
  20. #   Script: get_character(0).through = true
  21. # 结束
  22. #==============================================================================
  23.  
  24. class Game_CharacterBase
  25.   #--------------------------------------------------------------------------
  26.   # * Public Instance Variables
  27.   #--------------------------------------------------------------------------
  28.   attr_accessor :through                  # pass-through
  29.   attr_accessor :accessible               # able to be boarded
  30.   #--------------------------------------------------------------------------
  31.   # * Object Initialization
  32.   #--------------------------------------------------------------------------
  33.   alias movingPlatformsChar_initializer initialize
  34.   def initialize
  35.     movingPlatformsChar_initializer
  36.     @accessible = false
  37.   end
  38.  
  39.   #--------------------------------------------------------------------------
  40.   # ● 通行可能判定
  41.   #     d : 方向(2,4,6,8)
  42.   #--------------------------------------------------------------------------
  43.   def passableEx?(x, y, d)
  44.     x2 = $game_map.round_x_with_direction(x, d)
  45.     y2 = $game_map.round_y_with_direction(y, d)
  46.     return false unless $game_map.valid?(x2, y2)
  47.     return true if @through || debug_through?
  48.     #PATCH
  49.     if !$game_map.events_xy(x2, y2).empty?
  50.       for event in $game_map.events_xy(x2, y2)
  51.         return true if event.accessible
  52.       end
  53.     end
  54.     if !$game_map.events_xy(x, y).empty?
  55.       #no need to check current location
  56.     else
  57.       return false unless map_passable?(x, y, d)
  58.     end
  59.     #return false unless map_passable?(x, y, d)
  60.     #PATCH
  61.     return false unless map_passable?(x2, y2, reverse_dir(d))
  62.     return false if collide_with_characters?(x2, y2)
  63.     return true
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● まっすぐに移動
  67.   #     d       : 方向(2,4,6,8)
  68.   #     turn_ok : その場での向き変更を許可
  69.   #--------------------------------------------------------------------------
  70.   def move_straight(d, turn_ok = true)
  71.     @move_succeed = passableEx?(@x, @y, d)
  72.     if @move_succeed
  73.       set_direction(d)
  74.       @x = $game_map.round_x_with_direction(@x, d)
  75.       @y = $game_map.round_y_with_direction(@y, d)
  76.       @real_x = $game_map.x_with_direction(@x, reverse_dir(d))
  77.       @real_y = $game_map.y_with_direction(@y, reverse_dir(d))
  78.       increase_steps
  79.     elsif turn_ok
  80.       set_direction(d)
  81.       check_event_trigger_touch_front
  82.     end
  83.   end
  84. end
  85.  
  86. #==============================================================================
  87. # ** Game_Player
  88. #------------------------------------------------------------------------------
  89. #  This class handles maps. It includes event starting determinants and map
  90. # scrolling functions. The instance of this class is referenced by $game_map.
  91. #==============================================================================
  92. class Game_Player < Game_Character
  93.   #--------------------------------------------------------------------------
  94.   # * Get Character
  95.   #     param : if -1, player. If 0, this event. Otherwise, event ID.
  96.   #--------------------------------------------------------------------------
  97.   def get_character(param)
  98.     case param
  99.     when -1   # Player
  100.       return $game_player #self?
  101.     when 0    # This event
  102.       events = $game_map.events
  103.       return events == nil ? nil : events[@event_id]
  104.     else      # Particular event
  105.       events = $game_map.events
  106.       return events == nil ? nil : events[param]
  107.     end
  108.   end
  109.  
  110.   #--------------------------------------------------------------------------
  111.   # * Public Instance Variables
  112.   #--------------------------------------------------------------------------
  113.   attr_accessor :platformID               # if greater than 0, an event ID
  114.   #--------------------------------------------------------------------------
  115.   # * Object Initialization
  116.   #--------------------------------------------------------------------------
  117.   alias movingPlatformsPlyr_initializer initialize
  118.   def initialize
  119.     movingPlatformsPlyr_initializer
  120.     @platformID = 0
  121.     @exitingPlatform = false
  122.     @fixingPosition = false
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # * Frame Update
  126.   #--------------------------------------------------------------------------
  127.   alias movingPlatforms_updater update
  128.   def update
  129.     if @platformID > 0
  130.       last_real_x = @real_x
  131.       last_real_y = @real_y
  132.       @x = get_character(@platformID).x
  133.       @y = get_character(@platformID).y
  134.  
  135.       #Get realMoveSpeed & distancePerFrame
  136.       realMoveSpeed = get_character(@platformID).move_speed + 1#(dash? ? 1 : 0)
  137.       distancePerFrame = 2 ** realMoveSpeed / 256.0
  138.  
  139.       temp = @real_x != get_character(@platformID).real_x ||
  140.              @real_y != get_character(@platformID).real_y ? true : false
  141.       if temp && !@fixingPosition
  142.         # Fixing position check
  143.         @fixingPosition=false
  144.         if @real_x != get_character(@platformID).real_x
  145.           if @real_x < get_character(@platformID).real_x
  146.             if get_character(@platformID).real_x <= @real_x + distancePerFrame
  147.               @fixingPosition=true
  148.             end
  149.           end
  150.           if @real_x > get_character(@platformID).real_x
  151.             if get_character(@platformID).real_x >= @real_x - distancePerFrame
  152.               @fixingPosition=true
  153.             end
  154.           end
  155.         end
  156.         if @real_y != get_character(@platformID).real_y
  157.           if @real_y < get_character(@platformID).real_y
  158.             if get_character(@platformID).real_y <= @real_y + distancePerFrame
  159.               @fixingPosition=true
  160.             end
  161.           end
  162.           if @real_y > get_character(@platformID).real_y
  163.             if get_character(@platformID).real_y >= @real_y - distancePerFrame
  164.               @fixingPosition=true
  165.             end
  166.           end
  167.         end
  168.         # Convert to movement
  169.         @real_x = [@real_x - distancePerFrame, @x].max if @x < @real_x
  170.         @real_x = [@real_x + distancePerFrame, @x].min if @x > @real_x
  171.         @real_y = [@real_y - distancePerFrame, @y].max if @y < @real_y
  172.         @real_y = [@real_y + distancePerFrame, @y].min if @y > @real_y
  173.         update_bush_depth unless moving?
  174.         update_animation
  175.       else
  176.         @real_x = get_character(@platformID).real_x
  177.         @real_y = get_character(@platformID).real_y
  178.       end
  179.  
  180.       move_by_input_onPlatform
  181.       if @exitingPlatform
  182.         movingPlatforms_updater
  183.         @platformID = 0
  184.         @exitingPlatform = false
  185.         @fixingPosition = false
  186.       end
  187.       update_scroll(last_real_x, last_real_y)
  188.     else
  189.       movingPlatforms_updater
  190.     end
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # * Processing of Movement via input from the Directional Buttons
  194.   #--------------------------------------------------------------------------
  195.   def move_by_input_onPlatform
  196.     return unless get_character(@platformID).accessible
  197.     return if !movable? || $game_map.interpreter.running?
  198.     case Input.dir4
  199.     when 2
  200.       move_straight(Input.dir4) if Input.dir4 > 0
  201.       @exitingPlatform = @move_succeed ? true : false
  202.     when 4
  203.       move_straight(Input.dir4) if Input.dir4 > 0
  204.       @exitingPlatform = @move_succeed ? true : false
  205.     when 6
  206.       move_straight(Input.dir4) if Input.dir4 > 0
  207.       @exitingPlatform = @move_succeed ? true : false
  208.     when 8
  209.       move_straight(Input.dir4) if Input.dir4 > 0
  210.       @exitingPlatform = @move_succeed ? true : false
  211.     end
  212.   end
  213. end

Lv5.捕梦者

梦石
0
星屑
26264
在线时间
5355 小时
注册时间
2016-3-8
帖子
1655
2
 楼主| 发表于 2020-8-6 19:57:07 | 只看该作者
本帖最后由 alexncf125 于 2020-8-6 19:58 编辑

试了一下
这脚本好像会把平台的行走图与人物的行走图合二为一了
害我把人物的行走图昇高时一併也会把平台的行走图昇高
有大神知道怎样破么...把人物的行走图裁去下半身一部分的方法仍然毫无头绪
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
26264
在线时间
5355 小时
注册时间
2016-3-8
帖子
1655
3
 楼主| 发表于 2020-8-7 11:10:47 | 只看该作者
贴一下第一个的解法,顺道顶一顶
把人物的行走图裁去下半身一部分的方法仍然毫无头绪
  1. class Sprite_Character < Sprite_Base
  2.   alias old_update_position_old update_position
  3.   def update_position
  4.     old_update_position_old
  5.     self.y = @character.screen_y - 8 if @character.is_a?(Game_Player) && $game_player.platformID > 0
  6.   end
  7. end
复制代码

点评

self.oy除2看看?  发表于 2020-8-7 21:16
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
26264
在线时间
5355 小时
注册时间
2016-3-8
帖子
1655
4
 楼主| 发表于 2020-8-7 21:57:16 | 只看该作者
贴一下第二个的解法,顺道结帖
  1. class Sprite_Character < Sprite_Base
  2.   def update_src_rect
  3.     if @tile_id == 0
  4.       index = @character.character_index
  5.       pattern = @character.pattern < 3 ? @character.pattern : 1
  6.       sx = (index % 4 * 3 + pattern) * @cw
  7.       sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
  8.       if @character.is_a?(Game_Player) && $game_player.platformID > 0
  9.         self.src_rect.set(sx, sy, @cw, @ch - 6)
  10.       else
  11.         self.src_rect.set(sx, sy, @cw, @ch)
  12.       end
  13.     end
  14.   end
  15. end
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 06:38

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表