注册会员 登录
Project1 返回首页

喵呜喵5的树洞 https://rpg.blue/?291206 [收藏] [复制] [分享] [RSS]

日志

【脚本】地图显示图片

热度 1已有 821 次阅读2021-7-12 00:56 |个人分类:脚本

本脚本的范例工程:https://pan.miaowm5.com/index.php/s/spgd9tJ5KCt4tea

=begin
===============================================================================
  地图显示图片 By 喵呜喵5
===============================================================================

【说明】

  根据变量在地图上显示图片,支持许多的自定义操作

=end
$m5script ||= {}
$m5script[:M5Pic20210711] = 20210711
module M5Pic20210711;VAR_CONFIG =[
=begin
#==============================================================================
#  设定部分
#==============================================================================

  下面的每一对大括号对应地图上的一个图片,中间的内容就是图片的属性
  具体的格式请参考下面给出的范例(※注意每大括号最后的逗号)

  添加内容的格式为:

    需要设置的属性: 属性的值 ,

  (※ 冒号和属性的值之间请加上空格,不要忘记每条设置最后的逗号)

  可以设置的属性如下:

  VAR      变量的ID,根据此变量ID决定要显示的图片
           不配置此属性表示变量值固定为 0
  IMAGE    要显示的图片,请参考下面的范例配置,设置格式为:
           [
             {图片1的属性1: 值1, 图片1的属性2: 值2,},
             {图片2的属性1: 值3, 图片2的属性2: 值4,},
           ]
           图片支持以下属性:

             VALUE  当变量为此值时,按照配置显示对应图片
                    同一个图片只有一个满足条件的配置能生效,优先级从上到下
                    变量的值不等于任何一个图片时,图片隐藏
                    填写 [范围1, 范围2] 可以在变量处于特定范围时显示图片
                    不配置此属性表示变量为任何值都显示此图片
             IMAGE  要显示的图片文件名,前后要加上英文引号
                    填写成 [图片1, 图片2] 的形式则会循环播放列表中的图片
                    (※ 播放列表的图片过多时可能存在效率问题)
             SPEED  当图片循环播放时播放速度(单位:帧)
             LOOP   填写为 true 时,图片将以远景图的方式平铺显示

  X        图片的X坐标
  Y        图片的Y坐标
  Z        图片的Z高度,可以为负数
           高度比较大的图片将遮住高度比较低的图片
  SWI      图片的开关ID,当对应ID的开关打开时不显示这个图片
  INV_SWI  图片的开关ID,当对应ID的开关【关闭】时不显示这个图片
  EVAL     判断图片内容的变量数值变为代码的返回值,VAR属性将被忽略(需要双引号)
           如果不懂意思的话请不要设置这个属性
  SCENE    图片只在特定的 Scene 才显示,如果不懂意思的话请不要设置这个属性

=end

  {
    VAR: 1,
    X: 354,
    Y: 86,
    SWI: 1,
    IMAGE: [
      {
        VALUE: 0,
        IMAGE: '1',
      },
      {
        VALUE: [-100, 0],
        IMAGE: '2',
      },
      {
        VALUE: [0, 100],
        IMAGE: '4',
      }
    ]
  },

  {
    X: 0,
    Y: 86,
    INV_SWI: 2,
    IMAGE: [
      {
        IMAGE: ['1','1','1','1','1','1','1','1','3'],
        SPEED: 10,
      }
    ]
  },

  {
    INV_SWI: 3,
    Z: 300,
    IMAGE: [
      {
        IMAGE: '5',
        LOOP: true,
      }
    ]
  },

  {
    SCENE: Scene_Status,
    EVAL: "$game_party.menu_actor.name",
    X: 354,
    Y: 86,
    Z: 200,
    IMAGE: [
      {
        VALUE: '喵子',
        IMAGE: '1',
      },
      {
        VALUE: '伊萨贝拉',
        IMAGE: '2',
      },
      {
        VALUE: '爱丽丝',
        IMAGE: '3',
      },
      {
        IMAGE: '4',
      }
    ]
  },

  ] # 请不要删除这行

  Z = 0   # 如果图片遮住其他不希望遮住的内容了,请调小这个数值

  PIC_PATH = "Graphics/Pictures/"   # 要显示的图片文件所在的文件夹

  SPEED = 5  # 图片的默认播放速度

  SWI = 5  # 对应ID的开关打开时,关闭本脚本的功能,
           # 这个全局开关优先于各个窗口单独设置的开关
           # 我的其他需要本脚本支持的脚本也会受到这个开关的影响而失效
           # 如果不需要这个开关的话,这里请填 nil

  INV_SWI = nil  # 对应ID的开关【关闭】时,关闭本脚本的功能,
                 # 这个全局开关优先于各个窗口单独设置的开关以及上面设置的开关
                 # 我的其他需要本脚本支持的脚本也会受到这个开关的影响而失效
                 # 如果不需要这个开关的话,这里请填 nil

#==============================================================================
#  设定结束
#==============================================================================
class Main
  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  def initialize(config)
    @sprite = nil
    @image_config = nil
    @bitmap_cache = {}
    @anime_index = 0
    get_config(config)
    update
  end
  #--------------------------------------------------------------------------
  # ● 获取窗口的设置
  #--------------------------------------------------------------------------
  def get_config(config)
    @config = config.clone
    @config[:X] ||= 0
    @config[:Y] ||= 0
    @config[:Z] ||= 0
    @config[:Z] += Z
    return if @config[:EVAL]
    @config[:EVAL] = @config[:VAR] ? "$game_variables[#{@config[:VAR]}]" : "0"
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  def update
    return close if close_judge?
    update_content
    return close unless @image_config
    if @sprite
      if Graphics.frame_count % @image_config[:SPEED] == 0
        last_index = @anime_index
        @anime_index = (@anime_index + 1) % @image_config[:IMAGE].length
        update_image if last_index != @anime_index
      end
    else
      update_image
    end
  end
  #--------------------------------------------------------------------------
  # ● 隐藏图片
  #--------------------------------------------------------------------------
  def close
    if @sprite
      @sprite.dispose
      @sprite = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● 图片是否应该隐藏? (true:关闭)
  #--------------------------------------------------------------------------
  def close_judge?
    return true if INV_SWI && !$game_switches[INV_SWI]
    return true if SWI && $game_switches[SWI]
    return true if @config[:INV_SWI] && !$game_switches[@config[:INV_SWI]]
    return true if @config[:SWI] && $game_switches[@config[:SWI]]
    false
  end
  #--------------------------------------------------------------------------
  # ● 判断图片是否需要更新
  #--------------------------------------------------------------------------
  def update_content
    content = @content
    begin
      @content = eval(@config[:EVAL])
    rescue
      p "图片:#{@config}","错误:#{$!.to_s}","追踪:#{$!.backtrace}"
      msgbox('地图显示图片脚本的某个窗口发生错误,错误信息已输出到控制台')
      exit
    end
    refresh unless content == @content
  end
  #--------------------------------------------------------------------------
  # ● 刷新图片的配置
  #--------------------------------------------------------------------------
  def refresh
    value = @content
    @image_config = @config[:IMAGE].find do |img|
      next true unless img[:VALUE]
      next false unless img[:IMAGE]
      if (img[:VALUE].instance_of?(Array))
        v = value.to_i
        next v <= img[:VALUE].max && v >= img[:VALUE].min
      else
        next value == img[:VALUE]
      end
    end
    return unless @image_config
    prepare_sprite
    update_image
  end
  #--------------------------------------------------------------------------
  # ● 读取图片
  #--------------------------------------------------------------------------
  def load_bitmap(file)
    path = PIC_PATH + file
    @bitmap_cache[path] = Bitmap.new(path) unless @bitmap_cache[path]
    @bitmap_cache[path]
  end
  #--------------------------------------------------------------------------
  # ● 准备图片精灵
  #--------------------------------------------------------------------------
  def prepare_sprite
    image_loop = @image_config[:LOOP]
    if @sprite
      if image_loop
        if @sprite.instance_of?(Sprite)
          @sprite.dispose
          @sprite = nil
        end
      elsif @sprite.instance_of?(Plane)
        @sprite.dispose
        @sprite = nil
      end
    end
    unless @sprite
      if image_loop then @sprite = Plane.new
      else
        @sprite = Sprite.new
        @sprite.x = @config[:X]
        @sprite.y = @config[:Y]
      end
      @sprite.z = @config[:Z]
    end
    @anime_index = 0
    # 以下两个处理修改了原始的配置对象
    unless @image_config[:IMAGE].instance_of?(Array)
      @image_config[:IMAGE] = [@image_config[:IMAGE]]
    end
    @image_config[:SPEED] = SPEED unless @image_config[:SPEED]
  end
  #--------------------------------------------------------------------------
  # ● 刷新图片
  #--------------------------------------------------------------------------
  def update_image
    @sprite || prepare_sprite
    image_file = @image_config[:IMAGE][@anime_index]
    @sprite.bitmap = load_bitmap(image_file)
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    @sprite && @sprite.dispose
    @bitmap_cache.values.each{|bitmap| bitmap.dispose}
  end
end
end # M5Pic20210711
#--------------------------------------------------------------------------
# ● Scene_Base
#--------------------------------------------------------------------------
class Scene_Base
  #--------------------------------------------------------------------------
  # ● 生成图片
  #--------------------------------------------------------------------------
  alias m5_20210711_start start
  def start
    m5_20210711_start
    @m5_20210711_var_pic = []
    (M5Pic20210711::VAR_CONFIG + self.class.m5_20210711_pic).each do |config|
      next unless config
      next unless self.class == (config[:SCENE] ? config[:SCENE] : Scene_Map)
      next unless config[:IMAGE]
      @m5_20210711_var_pic.push(M5Pic20210711::Main.new(config))
    end
    @m5_20210711_var_pic.compact!
  end
  #--------------------------------------------------------------------------
  # ● 更新图片
  #--------------------------------------------------------------------------
  alias m5_20210711_update update
  def update
    m5_20210711_update
    return if scene_changing?
    return unless @m5_20210711_var_pic
    @m5_20210711_var_pic.each {|pic| pic.update if pic}
  end
  #--------------------------------------------------------------------------
  # ● 释放图片
  #--------------------------------------------------------------------------
  alias m5_20210711_terminate terminate
  def terminate
    m5_20210711_terminate
    return unless @m5_20210711_var_pic
    @m5_20210711_var_pic.each {|pic| pic.dispose if pic}
  end
  #--------------------------------------------------------------------------
  # ● 为其他脚本提供的接口
  #--------------------------------------------------------------------------
  def self.m5_20210711_pic(config = nil)
    @m5_20210711_add_pic ||= []
    return @m5_20210711_add_pic unless config
    hash = { EVAL: "#{config}.var", SCENE: self }
    [:X, :Y, :Z, :IMAGE, :SWI, :INV_SWI].each do |key|
      hash[key] = config.const_get(key) rescue nil
    end
    @m5_20210711_add_pic.push hash
  end
end


鸡蛋
1

鲜花

刚表态过的朋友 (1 人)

评论 (0 个评论)

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

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

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

GMT+8, 2024-4-19 04:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部