查看: 2067|回复: 4

[已经解决] 请问如何更改较大行走图的显示?已解决

[复制链接]
梦石
0
星屑
1021
在线时间
90 小时
注册时间
2022-12-26
回帖
79
发表于 2023-1-4 21:40:13 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 爱羊真知己 于 2023-1-6 22:08 编辑

也就是当行走图判定所在格被遮挡(通行条件为☆)时,在不可通行部分也被遮挡,但可正常通行的地方不变;当行走图判定所在格为可通行时,在所有其他区域都不会被遮挡。求助各位大佬!
你好!
梦石
0
星屑
9627
在线时间
1287 小时
注册时间
2017-9-27
回帖
148
发表于 2023-1-6 14:05:32 | 显示全部楼层
不太確定楼主说的是不是这个,这是大佬提供的方法:https://rpg.blue/thread-410683-1-1.html
回复

使用道具 举报

梦石
0
星屑
1021
在线时间
90 小时
注册时间
2022-12-26
回帖
79
 楼主| 发表于 2023-1-6 19:54:07 | 显示全部楼层
池田岚一 发表于 2023-1-6 14:05
不太確定楼主说的是不是这个,这是大佬提供的方法:https://rpg.blue/thread-410683-1-1.html ...

不对。我希望用脚本解决。我曾经看到过一个类似的,可惜有墙访问不了。
你好!
回复

使用道具 举报

梦石
0
星屑
29901
在线时间
5734 小时
注册时间
2016-3-8
回帖
1653
发表于 2023-1-6 21:11:15 | 显示全部楼层
本帖最后由 alexncf125 于 2023-1-6 21:14 编辑
爱羊真知己 发表于 2023-1-6 19:54
不对。我希望用脚本解决。我曾经看到过一个类似的,可惜有墙访问不了。 ...


这个?
点击展开/收起##-----------------------------------------------------------------------------
#  Large Sprite ☆ Display Fix v1.3
#  Created by Neon Black at request of seita
#  v1.4 - 12.18.14 - Added position tuning
#  v1.3 - 1.12.14  - Viewport/position issue fixes
#  v1.1 - 8.18.13  - lammer an odd lag issue
#  v1.0 - 8.17.13  - Main script completed
#  For both commercial and non-commercial use as long as credit is given to
#  Neon Black and any additional authors.  Licensed under Creative Commons
#  CC BY 4.0 - http://creativecommons.org/licenses/by/4.0/
##-----------------------------------------------------------------------------

##------
## By default, this script only affects the player.  To allow it to affect
## an event page as well, add a comment with the tag <large sprite> to the page
## of the event you would like to have affected by this.

class Sprite_Character < Sprite_Base
  ##------
  ## The ID of the terrain used to display the large character above ☆ tiles.
  ## If the player is below this tile (y position), the sprite will appear
  ## above all tiles and events from that y position up.  If the player is on
  ## the same tile or above (y position) the event will appear BELOW ☆ tiles
  ## from that position up.
  ##------
  UpperTerrain = 7

  ##------
  ## This value is the pixel tuning used to check the location.  This is
  ## because characters tagged with a '!' in their name are drawn lower than
  ## normal characters and are considered to be lower than these.  This causes
  ## the script to think they are on the tile below where they really are and
  ## draw them above tiles they should appear under.
  ##------
  Tuning = -1

  alias :cp_011214_update_bitmap :update_bitmap
  def update_bitmap(*args)
    if graphic_changed? && @set_upper_area_sprite
      @force_no_gfx_change = true
    else
      @force_no_gfx_change = false
    end
    cp_011214_update_bitmap(*args)
  end

  ## Alias the update method to add in the new graphic check.
  alias :cp_073013_update_pos :update_position
  def update_position(*args)
    cp_073013_update_pos(*args)
    check_encompassed_area if sprite_is_onscreen?
  end

  ## Alias the dispose to dispose the upper sprite.
  alias :cp_073013_dispose :dispose
  def dispose(*args)
    @upper_area_sprite.dispose if @upper_area_sprite
    cp_073013_dispose(*args)
  end

#~   ## Alias the graphic changed method to allow the sprite to revent to what it
#~   ## was during the last frame.  This allows the check to work again.
#~   alias :cp_073013_graphic_changed? :graphic_changed?
#~   def graphic_changed?(*args)
#~     cp_073013_graphic_changed?(*args) || @set_upper_area_sprite
#~   end

  ## Check if the sprite is onscreen.  Reduces redundant drawing.
  def sprite_is_onscreen?
    return false if @character.is_a?(Game_Vehicle) || @character.is_a?(Game_Follower)
    return false unless @character.is_a?(Game_Player) || @character.large_sprite
    return false if @character.screen_z >= 200
    top_left, bot_right = get_edge_corner_dis
    return false if top_left[0] > Graphics.width
    return false if top_left[1] > Graphics.height
    return false if bot_right[0] < 0
    return false if bot_right[1] < 0
    return true
  end

  ## Get the top left and bottom right positions.
  def get_edge_corner_dis
    top_left = [self.x - self.ox, self.y - self.oy]
    bot_right = [top_left[0] + self.width, top_left[1] + self.height]
    return [top_left, bot_right]
  end

  ## Long method that checks each position and draws the upper sprite.
  def check_encompassed_area
    if @set_upper_area_sprite && !@force_no_gfx_change
      old_src = self.src_rect.clone
      self.bitmap = @old_bitmap
      self.src_rect = old_src
    end
    @set_upper_area_sprite = false
    top_left, bot_right = get_edge_corner_dis
    last_x, last_y, copy_region = nil, nil, 0
    map_xd, map_yd = $game_map.display_x * 32, $game_map.display_y * 32
    total_height = (self.height + @character.jump_height).round
    self.width.times do |x|
      xp = map_xd.to_i + top_left[0] + x
      unless xp / 32 == last_x
        last_x = xp / 32
        last_y, copy_region = nil, 0
        total_height.times do |y|
          yp = map_yd.to_i + bot_right[1] + @character.jump_height - y + Tuning
          next if yp.to_i / 32 == last_y
          last_y = yp.to_i / 32
          if last_y == (@character.screen_y + @character.jump_height + Tuning +
                        map_yd).to_i / 32
            break if $game_map.terrain_tag(last_x, last_y) == UpperTerrain
            next
          end
          next if $game_map.terrain_tag(last_x, last_y) != UpperTerrain
          copy_region = [self.height, total_height - y + 1].min
          set_upper_sprite
          break
        end
      end
      next if copy_region == 0
      rect = Rect.new(src_rect.x + x, src_rect.y, 1, copy_region)
      @upper_area_sprite.bitmap.blt(x, 0, self.bitmap, rect)
      self.bitmap.clear_rect(rect)
    end
    if !@set_upper_area_sprite && @upper_area_sprite
      @upper_area_sprite.visible = false
    end
  end

  ## Creates the upper sprite that's a copy of the current sprite.
  def set_upper_sprite
    return if @set_upper_area_sprite
    @upper_area_sprite ||= Sprite.new
    @upper_area_sprite.bitmap = Bitmap.new(self.width, self.height)
    props = ["x", "y", "ox", "oy", "zoom_x", "zoom_y", "angle", "mirror",
             "bush_depth", "opacity", "blend_type", "color", "tone", "visible",
             "viewport"]
    props.each do |meth|
      @upper_area_sprite.method("#{meth}=").call(self.method(meth).call)
    end
    @upper_area_sprite.z = 200
    @set_upper_area_sprite = true
    @old_bitmap, old_src_rect = self.bitmap, self.src_rect.clone
    self.bitmap = Bitmap.new(@old_bitmap.width, @old_bitmap.height)
    self.bitmap.blt(0, 0, @old_bitmap, @old_bitmap.rect)
    self.src_rect = old_src_rect
  end
end

class Game_Event < Game_Character
  attr_reader :large_sprite

  alias :cp_081713_setup_page_settings :setup_page_settings
  def setup_page_settings(*args)
    cp_081713_setup_page_settings(*args)
    get_large_sprite_conditions
  end

  def get_large_sprite_conditions
    @large_sprite = false
    return if @list.nil? || @list.empty?
    @list.each do |line|
      next unless line.code == 108 || line.code == 408
      case line.parameters[0]
      when /<large sprite>/i
        @large_sprite = true
      end
    end
  end
end


还是这个?
点击展开/收起#==============================================================================
# TheoAllen - 双重优先级的事件
# Version : 1.0
# Language : Informal Indonesian
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Contact :
#------------------------------------------------------------------------------
# *> http://www.rpgmakerid.com
# *> http://www.rpgmakervxace.net
# *> http://www.theolized.com
#==============================================================================
# Change Logs:
# -----------------------------------------------------------------------------
# 2013.10.25 - Finished
#==============================================================================
=begin

  ================
  || 介绍 ||
  ----------------
  本脚本可以使事件同时拥有"在人物上方"和"在人物下方"的效果。
  当事件的Y坐标小于玩家的Y坐标,即事件在玩家"上方"时,事件会被玩家覆盖。
  当事件的Y坐标大于玩家的Y坐标,即事件在玩家"下方"时,玩家会被事件覆盖。
  
  ======================
  || 使用方法 ||
  ----------------------
  将本脚本放在插件脚本之下,Main之上
  事件注释: <samechar>
  
  ===================
  使用条款 :
  署名脚本作者, TheoAllen. 你可以自由编辑此脚本,只要你不声明你是脚本的原作者
  如果你想用此脚本于商业游戏,请和我共享收益.别忘了给我一份免费的游戏拷贝.


=end
#==============================================================================
# 无设定
#==============================================================================
class Game_Event
  
  alias theo_samechar_z screen_z
  def screen_z
    return 100 if @samechar
    return theo_samechar_z
  end
  
  alias theo_samechar_setup_page_settings setup_page_settings
  def setup_page_settings
    theo_samechar_setup_page_settings
    @samechar = false
    @list.each do |command|
      next unless [108,408].include?(command.code)
      @samechar = true if command.parameters[0] =~ /<samechar>/i
    end if @list
  end
  
end
回复

使用道具 举报

梦石
0
星屑
1021
在线时间
90 小时
注册时间
2022-12-26
回帖
79
 楼主| 发表于 2023-1-6 21:34:39 | 显示全部楼层
alexncf125 发表于 2023-1-6 21:11
这个?
[fold]##-----------------------------------------------------------------------------
#  Lar ...

额,下了Theo脚本汉化集的我居然没有发现这个脚本。。。谢谢你!
你好!
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部