查看: 2863|回复: 7

[已经解决] 有没有大神能抠出截图存档中的截图脚本啊

[复制链接]
梦石
0
星屑
50
在线时间
91 小时
注册时间
2012-3-3
回帖
56
发表于 2013-4-28 14:11:48 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Mr丶木头 于 2013-5-19 13:25 编辑

这是成就脚本在地球村找到的,但是成就界面孤零零的只有文字和获得时间很难看,
小白我想改进这个界面,加入获得成就时的截图,发现找不到VA截图的脚本,
所以请大神把截图功能抠出来,
如果能整合一下这个荣誉系统和截图脚本再好不过了

这个是地球村荣誉系统的脚本
[pre lang="ruby" line="1"]#==============================================================================
# ★ RGSS3_荣誉系统 Ver1.00
#==============================================================================
#尼玛啊!!!我讨厌日文啊
#使用方法:
#         gain_medal(0)
#==============================================================================
# □ 设定项目
#==============================================================================
module TMMEDAL
  COMMAND_MEDAL = "成就"     # 菜单中的名字
  
  # 一个荣誉也没有时隐藏菜单(true隐藏;false不隐藏)
  HIDE_COMMAND = false
  
  # 荣誉获得时的效果音
  SE_GAIN_MEDAL = RPG::SE.new("Powerup", 90, 140)
  
  # 荣誉名称及简介的设置
  #例如:MEDAL_DATA[0] = ["名字", 187(icon), "简介"]
  MEDAL_DATA = {}
  MEDAL_DATA[0] = ["名字?",       187, "简介?"]
  MEDAL_DATA[1] = ["探索者",       **, "第一次找到隐藏地点"]
  MEDAL_DATA[2] = ["      ",       190, ""]
end

#==============================================================================
# ■ Game_Party
#==============================================================================
class Game_Party
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :medals                   # 獲得済みメダル
  attr_reader   :new_medals               # 新規獲得メダル
  attr_accessor :medal_info_count         # メダル情報表示カウント
  attr_accessor :medal_info_opacity       # メダル情報表示不透明度
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias tmmedal_game_party_initialize initialize
  def initialize
    tmmedal_game_party_initialize
    @medals = []
    @new_medals = []
    @medal_info_count = 0
    @medal_info_opacity = 0
  end
  #--------------------------------------------------------------------------
  # ○ メダルの獲得
  #--------------------------------------------------------------------------
  def gain_medal(medal_id)
    return if @medals.any? {|medal| medal[0] == medal_id }
    t = Time.now.strftime(" (%Y/%m/%d %H:%M)")
    @medals.push([medal_id, t])
    @new_medals.push([medal_id, t])
  end
  #--------------------------------------------------------------------------
  # ○ 獲得メダル情報の消去
  #--------------------------------------------------------------------------
  def delete_new_medal
    @new_medals.shift
  end
end

#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ○ メダルの獲得
  #--------------------------------------------------------------------------
  def gain_medal(medal_id)
    $game_party.gain_medal(medal_id)
  end
end

#==============================================================================
# ■ Window_MenuCommand
#==============================================================================
class Window_MenuCommand
  #--------------------------------------------------------------------------
  # ● 独自コマンドの追加用
  #--------------------------------------------------------------------------
  alias tmmedal_window_menucommand_add_original_commands add_original_commands
  def add_original_commands
    tmmedal_window_menucommand_add_original_commands
    unless TMMEDAL::HIDE_COMMAND && !medal_enabled
      add_command(TMMEDAL::COMMAND_MEDAL, :medal, medal_enabled)
    end
  end
  #--------------------------------------------------------------------------
  # ○ メダルの有効状態を取得
  #--------------------------------------------------------------------------
  def medal_enabled
    !$game_party.medals.empty?
  end
end

#==============================================================================
# □ Window_MedalInfo
#==============================================================================
class Window_MedalInfo < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(Graphics.width - window_width, 0, window_width, fitting_height(1))
    self.opacity = 0
    self.contents_opacity = $game_party.medal_info_opacity
    refresh
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    return 240
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    if $game_party.medal_info_count > 0
      self.contents_opacity += 16
      $game_party.medal_info_count -= 1
      $game_party.delete_new_medal if $game_party.medal_info_count == 0
    else
      self.contents_opacity -= 16
      if self.contents_opacity == 0
        open unless $game_party.new_medals.empty?
      end
    end
    $game_party.medal_info_opacity = self.contents_opacity
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウを開く
  #--------------------------------------------------------------------------
  def open
    refresh
    TMMEDAL::SE_GAIN_MEDAL.play
    $game_party.medal_info_count = 150
    self.contents_opacity = 0
    self
  end
  #--------------------------------------------------------------------------
  # ○ リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    unless $game_party.new_medals.empty?
      draw_background(contents.rect)
      medal = TMMEDAL::MEDAL_DATA[$game_party.new_medals[0][0]]
      rect = contents.rect.clone
      draw_icon(medal[1], rect.x, rect.y)
      rect.x += 24
      rect.width -= 24
      draw_text(rect, medal[0])
    end
  end
  #--------------------------------------------------------------------------
  # ○ 背景の描画
  #--------------------------------------------------------------------------
  def draw_background(rect)
    temp_rect = rect.clone
    temp_rect.width /= 2
    contents.gradient_fill_rect(temp_rect, back_color2, back_color1)
    temp_rect.x = temp_rect.width
    contents.gradient_fill_rect(temp_rect, back_color1, back_color2)
  end
  #--------------------------------------------------------------------------
  # ○ 背景色 1 の取得
  #--------------------------------------------------------------------------
  def back_color1
    Color.new(0, 0, 0, 192)
  end
  #--------------------------------------------------------------------------
  # ○ 背景色 2 の取得
  #--------------------------------------------------------------------------
  def back_color2
    Color.new(0, 0, 0, 0)
  end
end

#==============================================================================
# □ Window_Medal
#==============================================================================
class Window_Medal < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
    super
    refresh
    select(0)
    activate
  end
  #--------------------------------------------------------------------------
  # ● 桁数の取得
  #--------------------------------------------------------------------------
  def col_max
    return 1
  end
  #--------------------------------------------------------------------------
  # ● 項目数の取得
  #--------------------------------------------------------------------------
  def item_max
    @data ? @data.size : 1
  end
  #--------------------------------------------------------------------------
  # ● アイテムの取得
  #--------------------------------------------------------------------------
  def item
    @data && index >= 0 ? @data[index] : nil
  end
  #--------------------------------------------------------------------------
  # ● アイテムリストの作成
  #--------------------------------------------------------------------------
  def make_item_list
    @data = $game_party.medals
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    medal = TMMEDAL::MEDAL_DATA[item[0]]
    rect = item_rect(index)
    draw_icon(medal[1], rect.x, rect.y)
    rect.x += 24
    rect.width -= 216
    draw_text(rect, medal[0])
    rect.x = contents.width - 192
    rect.width = 192
    draw_text(rect, item[1], 2)
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    if item
      medal = TMMEDAL::MEDAL_DATA[item[0]]
      text = medal[2]
      @help_window.set_text(text)
    end
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    make_item_list
    create_contents
    draw_all_items
  end
end

#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map
  #--------------------------------------------------------------------------
  # ● 全ウィンドウの作成
  #--------------------------------------------------------------------------
  alias tmmedal_scene_map_create_all_windows create_all_windows
  def create_all_windows
    tmmedal_scene_map_create_all_windows
    create_medal_window
  end
  #--------------------------------------------------------------------------
  # ○ メダルウィンドウの作成
  #--------------------------------------------------------------------------
  def create_medal_window
    @medal_window = Window_MedalInfo.new
  end
end

#==============================================================================
# ■ Scene_Menu
#==============================================================================
class Scene_Menu
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウの作成
  #--------------------------------------------------------------------------
  alias tmmedal_scene_menu_create_command_window create_command_window
  def create_command_window
    tmmedal_scene_menu_create_command_window
    @command_window.set_handler(:medal, method(:command_medal))
  end
  #--------------------------------------------------------------------------
  # ○ コマンド[メダル]
  #--------------------------------------------------------------------------
  def command_medal
    SceneManager.call(Scene_Medal)
  end
end

#==============================================================================
# □ Scene_Medal
#==============================================================================
class Scene_Medal < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    create_help_window
    create_item_window
  end
  #--------------------------------------------------------------------------
  # ○ アイテムウィンドウの作成
  #--------------------------------------------------------------------------
  def create_item_window
    wy = @help_window.height
    wh = Graphics.height - wy
    @item_window = Window_Medal.new(0, wy, Graphics.width, wh)
    @item_window.viewport = @viewport
    @item_window.help_window = @help_window
    @item_window.set_handler(:cancel, method(:return_scene))
  end
end
[/pre]

这个是压力君的截图存档脚本
[pre lang="ruby" line="1"]#==============================================================================
# [PS0]截图存档
#      Window_SaveFile_Plus
#------------------------------------------------------------------------------
#     一种带有截图的存档,同时可以自定义存档数量。
#==============================================================================
# [核心脚本]
#    - 快速储存Bitmap的Marshal         By 柳之一
#------------------------------------------------------------------------------
# [更新记录]
#    - 2012.02.16 By 各种压力的猫君
#      * 修正地图边缘时截图不完整的错误
#    - 2012.01.28 By 各种压力的猫君
#      * 去掉效率较差的双线性缩放算法;
#      * 新增存档管理功能(F5键,复制/移动/删除存档)
#    - 2011.12.27 By 各种压力的猫君
#      * 补上截图阴影;
#      * 新增“不缩放”截图(推荐使用,尤其是大分辨率);
#      * 修正选择不存在的存档时存档列表窗口卡死以及奇怪的SE;
#      * 新增“存档中”提示窗口、覆盖存档提示、删除存档功能(Z键,对应键盘D)
#    - 2011.12.26 By 各种压力的猫君
#      * 功能齐全的测试版
#    - 2011.12.16 By 各种压力的猫君
#      * 移植至RGSS3,遵循PS0协议;
#      * 丰富自定义选项,整合双线性插值算法精简版
#    - 2008.05.26 By 沉影不器
#      * 蓝本(VX新截图存档)
#------------------------------------------------------------------------------
# [使用方法]
#    - 删除原Scene_File、Window_SaveFile 并将本脚本插入到原Scene_File位置。
#    - 或者直接将本脚本插入到MAIN以上,并确保本脚本位于上述两个脚本以下。
#==============================================================================
$_PS0 = {} if $_PS0 == nil  
$_PS0["Window_SaveFile_Plus"] = 20120216
#==============================================================================
# [PS0] 通用配置模块  
#==============================================================================
module PS0
  module Window_SaveFile_Plus

    # 最大存档数(范围正整数)
    MAX_SAVE = 18

    # 存档目录(默认值 "Saves/";根目录 "")
    SAVE_DIR = "Saves/"   

    # 无存档时显示的文字
    NO_DATA  = "无存档"

    # 保存时显示的信息
    SAVE_NOW = "存档中..."

    # 复制存档时的帮助文字
    HELP_COPY = "要复制到哪个位置?"

    # 移动存档时的帮助文字
    HELP_MOVE = "要移动到哪个位置?"

    # 是否显示存档中窗口(true:显示;false:不显示)
    # - 分辨率较大时建议显示
    SHOW_SAVE_NOW = false

    # 截图缩放使用的插值算法
    # - "NN" 最邻近(速度最快,质量最差,RM默认算法)
    # - "NZ" 不缩放(速度快,质量好,以主角为中心切边,非全屏)
    Zoom_Type = "NZ"

    # 双线性插值能获得更好的截图缩放质量,但所需时间较最邻近插值更长。
    # 缩略图尺寸(范围整数,单位像素)
    # - VA默认分辨率(544×416)推荐使用340×260
    # - VA最大分辨率(640×480)推荐使用425×325
    # - 本脚本兼容分辨率解放,窗口大小将自动计算。
    #   请自行计算截图分辨率,注意要确保宽高比一致,
    #   若使用“不缩放”模式则可以不保持一致。
    Thumbnail_Width  = 340  # 宽度
    Thumbnail_Height = 260  # 高度

    # 缩略图位置微调(范围整数,单位像素)
    Thumbnail_ox = -2    # 横向
    Thumbnail_oy = -2-32 # 纵向

    # 各窗口切换时的渐变帧数
    TRANS_DURATION = 5

  end
end
#==============================================================================
# [核心脚本] 快速储存Bitmap的Marshal By 柳之一
#==============================================================================
class Font
  def marshal_dump
  end
  def marshal_load(obj)
  end
end
class Bitmap
  RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  def _dump(limit)
    data = "rgba" * width * height
    RtlMoveMemory_pi.call(data, address, data.length)
    [width, height, Zlib::Deflate.deflate(data)].pack("LLa*")
  end
  def self._load(str)
    w, h, zdata = str.unpack("LLa*")
    b = self.new(w, h)
    RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4)
    return b
  end
  def address
    buffer, ad = "rgba", object_id * 2 + 16
    RtlMoveMemory_pi.call(buffer, ad, 4)
    ad = buffer.unpack("L")[0] + 8
    RtlMoveMemory_pi.call(buffer, ad, 4)
    ad = buffer.unpack("L")[0] + 16
    RtlMoveMemory_pi.call(buffer, ad, 4)
    return buffer.unpack("L")[0]
  end
end
#==============================================================================
# ■ Game_Temp
#==============================================================================
class Game_Temp
  attr_accessor :save_bitmap
  attr_accessor :save_snapshoot
  alias new_initialize initialize
  def initialize
    new_initialize
    @save_bitmap = Bitmap.new(1, 1)
    @save_snapshoot = Bitmap.new(1, 1)
  end
end
#==============================================================================
# ■ SceneManager
#==============================================================================
module SceneManager
  def self.snapshot_for_save
    $game_temp.save_bitmap = Graphics.snap_to_bitmap
    unless FileTest.exist?(PS0::Window_SaveFile_Plus::SAVE_DIR)
      Dir.mkdir(PS0::Window_SaveFile_Plus::SAVE_DIR)
    end
  end
end
#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map < Scene_Base
  alias save_terminate terminate
  def terminate
    SceneManager.snapshot_for_save
    save_terminate
  end
end
#==============================================================================
# ■ DataManager
#==============================================================================
module DataManager
  def self.save_file_exists?
    !Dir.glob(PS0::Window_SaveFile_Plus::SAVE_DIR + 'Save*.rvdata2').empty?
  end
  def self.make_filename(index)
    sprintf(PS0::Window_SaveFile_Plus::SAVE_DIR + "Save%02d.rvdata2", index + 1)
  end
  #--------------------------------------------------------------------------
  # ● セーブヘッダの作成
  #--------------------------------------------------------------------------
  def self.make_save_header
    d_rect = Rect.new(0, 0, PS0::Window_SaveFile_Plus::Thumbnail_Width,
                            PS0::Window_SaveFile_Plus::Thumbnail_Height)
    case PS0::Window_SaveFile_Plus::Zoom_Type
    when "NN"
      s_rect = $game_temp.save_bitmap.rect
      $game_temp.save_snapshoot = Bitmap.new(d_rect.width, d_rect.height)
      $game_temp.save_snapshoot.stretch_blt(d_rect, $game_temp.save_bitmap, s_rect)
    when "NZ"
      x = [$game_player.screen_x - d_rect.width/2, 0].max
      x = [x, Graphics.width - d_rect.width].min
      y = [$game_player.screen_y - d_rect.height/2, 0].max
      y = [y, Graphics.height - d_rect.height].min
      s_rect = Rect.new(x, y, d_rect.width, d_rect.height)
      $game_temp.save_snapshoot = Bitmap.new(d_rect.width, d_rect.height)
      $game_temp.save_snapshoot.blt(0, 0, $game_temp.save_bitmap, s_rect)
    end
    header = {}
    header[:characters] = $game_party.characters_for_savefile
    header[:playtime_s] = $game_system.playtime_s
    header[:snapshoot]  = $game_temp.save_snapshoot
    header
  end
  #--------------------------------------------------------------------------
  # ● セーブの実行
  #--------------------------------------------------------------------------
  def self.save_game(index)
    saving_window = Window_Saving.new
    Graphics.update
    begin
      save_game_without_rescue(index)
    rescue
       delete_save_file(index)
       false
    end
    saving_window.dispose
    return true
  end
end
#==============================================================================
# ■ Window_Yes_Or_No
#------------------------------------------------------------------------------
#  提供“是”、“否”两个选项的窗口(替换、删除存档用)
#==============================================================================
class Window_Yes_Or_No < Window_HorzCommand
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(yes, no)
    @yes = yes
    @no = no
    super(130, 0)
    self.visible = false
    self.active = false
    @index = 0
  end
  #--------------------------------------------------------------------------
  # ● 桁数の取得
  #--------------------------------------------------------------------------
  def col_max
    return 2
  end
  #--------------------------------------------------------------------------
  # ● コマンドリストの作成
  #--------------------------------------------------------------------------
  def make_command_list
    add_command(@yes,   :yes)
    add_command(@no,    :cancel)
  end
  #--------------------------------------------------------------------------
  # ● 決定ボタンが押されたときの処理
  #--------------------------------------------------------------------------
  def process_ok
    Input.update
    call_ok_handler
  end
  #--------------------------------------------------------------------------
  # ● 按下取消键时的处理
  #--------------------------------------------------------------------------
  def process_cancel
    Input.update
    call_cancel_handler
  end
  #--------------------------------------------------------------------------
  # ● 启用窗口
  #--------------------------------------------------------------------------
  def activate
    temp = self.y + self.height - Graphics.height
    if temp > 0
      self.y -= (temp + 12)
    end
    self.active = true
    self
  end
end
#==============================================================================
# ■ Window_Saving
#------------------------------------------------------------------------------
#  显示保存信息的窗口
#==============================================================================
class Window_Saving < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    w = PS0::Window_SaveFile_Plus::SAVE_NOW.length * 16 + 32
    x = (Graphics.width - w)/2
    y = (Graphics.height - fitting_height(1))/2
    super(x, y, w, fitting_height(1))
    self.visible = PS0::Window_SaveFile_Plus::SHOW_SAVE_NOW
    draw_text_ex(4, 0, PS0::Window_SaveFile_Plus::SAVE_NOW)
  end
end
#==============================================================================
# ■ Window_SaveManagerCommand
#------------------------------------------------------------------------------
#  存档管理窗口
#==============================================================================
class Window_SaveManagerCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize(*args)
    @copy, @move, @delete, @cancel = args[0..3]
    super(130, 0)
    self.visible = false
    self.active = false
    @index = 0
  end
  #--------------------------------------------------------------------------
  # ● 获取窗口的宽度
  #--------------------------------------------------------------------------
  def window_width
    return 100
  end
  #--------------------------------------------------------------------------
  # ● 获取项目数
  #--------------------------------------------------------------------------
  def item_max
    return 4
  end
  #--------------------------------------------------------------------------
  # ● 生成指令列表
  #--------------------------------------------------------------------------
  def make_command_list
    add_command(@copy,   :copy  )
    add_command(@move,   :move  )
    add_command(@delete, :delete)
    add_command(@cancel, :cancel)
  end
  #--------------------------------------------------------------------------
  # ● 按下确定键时的处理
  #--------------------------------------------------------------------------
  def process_ok
    Input.update
    call_ok_handler
  end
  #--------------------------------------------------------------------------
  # ● 启用窗口
  #--------------------------------------------------------------------------
  def activate
    temp = self.y + self.height - Graphics.height
    if temp > 0
      self.y -= (temp + 12)
    end
    self.active = true
    self
  end
end
#==============================================================================
# ■ Window_FileCommand
#------------------------------------------------------------------------------
#  截图存档左侧的选择窗口。
#==============================================================================
class Window_FileCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0)
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_height
    return Graphics.height-fitting_height(1)
  end
  #--------------------------------------------------------------------------
  # ● 表示行数の取得
  #--------------------------------------------------------------------------
  def visible_line_number
    item_max
  end
  #--------------------------------------------------------------------------
  # ● コマンドリストの作成
  #--------------------------------------------------------------------------
  def make_command_list
    add_main_commands
  end
  #--------------------------------------------------------------------------
  # ● 主要コマンドをリストに追加
  #--------------------------------------------------------------------------
  def add_main_commands
    for i in 1..PS0::Window_SaveFile_Plus::MAX_SAVE
      if i < 10
        text = Vocab::File + " 0" + i.to_s
      else
        text = Vocab::File + " " + i.to_s
      end
      add_command(text, :file)
    end
  end
  #--------------------------------------------------------------------------
  # ● 決定ボタンが押されたときの処理
  #--------------------------------------------------------------------------
  def process_ok
  end
end
#==============================================================================
# ■ Window_SaveFile
#------------------------------------------------------------------------------
#  セーブ画面およびロード画面で表示する、セーブファイルのウィンドウです。
#==============================================================================
class Window_SaveFile < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     index : セーブファイルのインデックス
  #--------------------------------------------------------------------------
  def initialize(index)
    super(160, 0, Graphics.width-160, Graphics.height-fitting_height(1))
    @file_index = index
    @selected = true
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    change_color(normal_color)
    w = (self.width-PS0::Window_SaveFile_Plus::Thumbnail_Width-16)/2
    h = (self.height-PS0::Window_SaveFile_Plus::Thumbnail_Height-16)/2
    width  = w + PS0::Window_SaveFile_Plus::Thumbnail_ox
    height = h + PS0::Window_SaveFile_Plus::Thumbnail_oy
    draw_shadow(width+5, height+5)
    draw_text((self.width-32-PS0::Window_SaveFile_Plus::NO_DATA.length*16)/2,
              self.height/2-32, PS0::Window_SaveFile_Plus::NO_DATA.length*32,
              line_height, PS0::Window_SaveFile_Plus::NO_DATA)
    draw_party_characters(32, Graphics.height-fitting_height(1)-32)
    draw_playtime(-10, contents.height - line_height-10, contents.width - 4, 2)
    draw_snapshoot(width, height)
  end
  #--------------------------------------------------------------------------
  # ● パーティキャラの描画
  #--------------------------------------------------------------------------
  def draw_party_characters(x, y)
    header = DataManager.load_header(@file_index)
    return unless header
    header[:characters].each_with_index do |data, i|
      draw_character(data[0], data[1], x + i * 48, y)
    end
  end
  #--------------------------------------------------------------------------
  # ● プレイ時間の描画
  #--------------------------------------------------------------------------
  def draw_playtime(x, y, width, align)
    header = DataManager.load_header(@file_index)
    return unless header
    draw_text(x, y, width, line_height, header[:playtime_s], 2)
  end
  #--------------------------------------------------------------------------
  # ● 绘制截图
  #--------------------------------------------------------------------------
  def draw_snapshoot(x, y)
    header = DataManager.load_header(@file_index)
    return unless header
    bitmap = header[:snapshoot]
    contents.blt(x, y, bitmap, bitmap.rect)
    bitmap.dispose
  end
  #--------------------------------------------------------------------------
  # ● 绘制阴影
  #--------------------------------------------------------------------------
  def draw_shadow(x, y)
    header = DataManager.load_header(@file_index)
    return unless header
    contents.fill_rect(x, y, PS0::Window_SaveFile_Plus::Thumbnail_Width,
                             PS0::Window_SaveFile_Plus::Thumbnail_Height, Color.new(0, 0, 0))
    contents.blur
  end
end
#==============================================================================
# ■ Scene_File
#------------------------------------------------------------------------------
#  セーブ画面とロード画面の共通処理を行うクラスです。
#==============================================================================
class Scene_File < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    create_help_window
    create_savefile_viewport
    create_command_window
    create_savefile_window
    create_manager_window
    create_replace_window
    create_delete_window
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    @savefile_viewport.dispose
    @savefile_window.dispose
    @command_window.dispose
    @window_manager.dispose
    @window_replace.dispose
    @window_delete.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    update_savefile_selection
  end
  #--------------------------------------------------------------------------
  # ● 创建替换窗口
  #--------------------------------------------------------------------------
  def create_replace_window
    @window_replace = Window_Yes_Or_No.new("替换", "取消")
    @window_replace.set_handler(:yes,    method(:do_replace))
    @window_replace.set_handler(:cancel, method(:do_cancel))
  end
  #--------------------------------------------------------------------------
  # ● 创建删除窗口
  #--------------------------------------------------------------------------
  def create_delete_window
    @window_delete  = Window_Yes_Or_No.new("删除", "取消")
    @window_delete.set_handler(:yes,    method(:do_delete))
    @window_delete.set_handler(:cancel, method(:do_return_manager))
    @window_delete.x += 40
  end
  #--------------------------------------------------------------------------
  # ● 创建管理窗口
  #--------------------------------------------------------------------------
  def create_manager_window
    @window_manager = Window_SaveManagerCommand.new("复制", "移动", "删除", "取消")
    @window_manager.set_handler(:copy  , method(:on_copy?))
    @window_manager.set_handler(:move  , method(:on_move?))
    @window_manager.set_handler(:delete, method(:on_delete?))
    @window_manager.set_handler(:cancel, method(:do_cancel))
  end
  #--------------------------------------------------------------------------
  # ● ヘルプウィンドウの作成
  #--------------------------------------------------------------------------
  def create_help_window
    @help_window = Window_Help.new(1)
    @help_window.set_text(help_window_text)
  end
  #--------------------------------------------------------------------------
  # ● ヘルプウィンドウのテキストを取得
  #--------------------------------------------------------------------------
  def help_window_text
    return ""
  end
  #--------------------------------------------------------------------------
  # ● セーブファイルビューポートの作成
  #--------------------------------------------------------------------------
  def create_savefile_viewport
    @savefile_viewport = Viewport.new
    @savefile_viewport.rect.y = @help_window.height
    @savefile_viewport.rect.height -= @help_window.height
  end
  #--------------------------------------------------------------------------
  # ● セーブファイルウィンドウの作成
  #--------------------------------------------------------------------------
  def create_savefile_window
    @savefile_window = Window_SaveFile.new(@index)
    @savefile_window.viewport = @savefile_viewport
  end
  #--------------------------------------------------------------------------
  # ● 生成存档列表窗口
  #--------------------------------------------------------------------------
  def create_command_window
    @command_window = Window_FileCommand.new
    @command_window.index = first_savefile_index
    @index = @command_window.index
    @command_window.viewport = @savefile_viewport
    @command_window.set_handler(:file,      method(:on_savefile_ok))
  end
  #--------------------------------------------------------------------------
  # ● セーブファイル選択の更新
  #--------------------------------------------------------------------------
  def update_savefile_selection
    if @source_index != nil
      if Input.trigger?(:C)
        if @index == @source_index
          Sound.play_buzzer
        elsif FileTest.exist?(DataManager.make_filename(@index))
          Graphics.freeze
          @command_window.deactivate
          @window_replace.y = 72 + @index * 24
          @window_replace.activate
          @window_replace.visible = true
          @window_replace.refresh
          Sound.play_ok
          Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
        else
          return on_copy_ok
        end
      elsif Input.trigger?(:B)
        return do_return_manager
      end
    else
      if Input.trigger?(:C)
        if self.is_a?(Scene_Save) and FileTest.exist?(DataManager.make_filename(@index))
          Graphics.freeze
          @command_window.deactivate
          @window_replace.y = 72 + @index * 24
          @window_replace.activate
          @window_replace.visible = true
          @window_replace.refresh
          Sound.play_ok
          Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
        else
          return on_savefile_ok
        end
      elsif Input.trigger?(:B)
        return on_savefile_cancel
      elsif Input.trigger?(:F5)
        unless @window_manager.active == true or
               @window_delete.active == true or
               @window_replace.active == true
          return on_manager?
        end
      end
    end
    @need_refresh = true if @index != @command_window.index
    if @need_refresh
      Graphics.freeze
      @index = @command_window.index
      @savefile_window.dispose
      create_savefile_window
      @need_refresh = false
      Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
    end
  end
  #--------------------------------------------------------------------------
  # ● セーブファイル[決定]
  #--------------------------------------------------------------------------
  def on_savefile_ok
  end
  #--------------------------------------------------------------------------
  # ● セーブファイル[キャンセル]
  #--------------------------------------------------------------------------
  def on_savefile_cancel
    Sound.play_cancel
    return_scene
  end
  #--------------------------------------------------------------------------
  # ● セーブファイル[決定]
  #--------------------------------------------------------------------------
  def on_copy_ok
    Graphics.freeze
    source_name = DataManager.make_filename(@source_index)
    new_name    = DataManager.make_filename(@index)
    case @source_type
    when "copy"
      # 复制存档文件(API)
      Win32API.new('kernel32',"CopyFileA",'ppl','').call(source_name,new_name,0)
    when "move"
      # 重命名存档
      File.rename(source_name, new_name)
    end
    # 返回
    @help_window.set_text(help_window_text)
    @source_index = nil
    do_return_savelist
  end
  #--------------------------------------------------------------------------
  # ● セーブファイル[复制]
  #--------------------------------------------------------------------------
  def on_copy?
    Graphics.freeze
    @help_window.set_text(PS0::Window_SaveFile_Plus::HELP_COPY)
    @source_index = @index
    @source_type = "copy"
    do_return_savelist
  end
  #--------------------------------------------------------------------------
  # ● セーブファイル[移动]
  #--------------------------------------------------------------------------
  def on_move?
    Graphics.freeze
    @help_window.set_text(PS0::Window_SaveFile_Plus::HELP_MOVE)
    @source_index = @index
    @source_type = "move"
    do_return_savelist
  end
  #--------------------------------------------------------------------------
  # ● セーブファイル[管理]
  #--------------------------------------------------------------------------
  def on_manager?
    if FileTest.exist?(DataManager.make_filename(@index))
      Graphics.freeze
      @command_window.deactivate
      @window_manager.y = 72 + @index * 24
      @window_manager.activate
      @window_manager.visible = true
      @window_manager.refresh
      Sound.play_ok
      Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
    else
      Sound.play_buzzer
    end
  end
  #--------------------------------------------------------------------------
  # ● セーブファイル[删除]
  #--------------------------------------------------------------------------
  def on_delete?
    Graphics.freeze
    @window_manager.deactivate
    @command_window.deactivate
    @window_delete.y = 72 + 72 + @index * 24
    @window_delete.activate
    @window_delete.visible = true
    @window_delete.refresh
    Sound.play_ok
    Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  end
  #--------------------------------------------------------------------------
  # ● 删除
  #--------------------------------------------------------------------------
  def do_delete
    Graphics.freeze
    File.delete(DataManager.make_filename(@index))
    @window_delete.index  = 0
    @window_manager.index = 0
    @window_delete.visible  = false
    @window_manager.visible = false
    @window_delete.deactivate
    @window_manager.deactivate
    @command_window.activate
    @need_refresh = true
    Sound.play_save
    if DataManager.save_file_exists?
      Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
    else
      return_scene
    end
  end
  #--------------------------------------------------------------------------
  # ● 替换
  #--------------------------------------------------------------------------
  def do_replace
    Graphics.freeze
    if @source_index != nil
      return on_copy_ok
    else
      return on_savefile_ok
    end
    @window_replace.visible = false
    @window_replace.deactivate
    @need_refresh = true
  end
  #--------------------------------------------------------------------------
  # ● 取消
  #--------------------------------------------------------------------------
  def do_cancel
    Graphics.freeze
    Sound.play_cancel
    @window_delete.index  = 0
    @window_replace.index = 0
    @window_manager.index = 0
    @window_delete.visible  = false
    @window_replace.visible = false
    @window_manager.visible = false
    @window_delete.deactivate
    @window_replace.deactivate
    @window_manager.deactivate
    @command_window.activate
    Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  end
  #--------------------------------------------------------------------------
  # ● 返回管理菜单
  #--------------------------------------------------------------------------
  def do_return_manager
    Graphics.freeze
    @help_window.set_text(help_window_text)
    @command_window.index = @source_index unless @source_index == nil
    @source_index = nil
    @source_type = nil
    @command_window.deactivate
    @window_delete.index  = 0
    @window_replace.index = 0
    @window_delete.visible  = false
    @window_replace.visible = false
    @window_delete.deactivate
    @window_replace.deactivate
    @window_manager.y = 72 + @index * 24
    @window_manager.activate
    @window_manager.visible = true
    @window_manager.refresh
    Sound.play_cancel
    Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  end
  #--------------------------------------------------------------------------
  # ● 返回文件列表(复制、移动 用)
  #--------------------------------------------------------------------------
  def do_return_savelist
    @window_manager.visible = false
    @window_manager.deactivate
    @command_window.activate
    @need_refresh = true
    Sound.play_ok
  end
end
#==============================================================================
# [PS0] End of Script
#==============================================================================
[/pre]
梦石
0
星屑
70
在线时间
1083 小时
注册时间
2013-3-29
回帖
2158
发表于 2013-4-28 15:08:16 | 显示全部楼层
是截图存档的代码把:
  1. #==============================================================================
  2. # [PS0]截图存档
  3. #      Window_SaveFile_Plus
  4. #------------------------------------------------------------------------------
  5. #     一种带有截图的存档,同时可以自定义存档数量。
  6. #==============================================================================
  7. # [核心脚本]
  8. #    - 快速储存Bitmap的Marshal         By 柳之一
  9. #------------------------------------------------------------------------------
  10. # [更新记录]
  11. #    - 2012.02.16 By 各种压力的猫君
  12. #      * 修正地图边缘时截图不完整的错误
  13. #    - 2012.01.28 By 各种压力的猫君
  14. #      * 去掉效率较差的双线性缩放算法;
  15. #      * 新增存档管理功能(F5键,复制/移动/删除存档)
  16. #    - 2011.12.27 By 各种压力的猫君
  17. #      * 补上截图阴影;
  18. #      * 新增“不缩放”截图(推荐使用,尤其是大分辨率);
  19. #      * 修正选择不存在的存档时存档列表窗口卡死以及奇怪的SE;
  20. #      * 新增“存档中”提示窗口、覆盖存档提示、删除存档功能(Z键,对应键盘D)
  21. #    - 2011.12.26 By 各种压力的猫君
  22. #      * 功能齐全的测试版
  23. #    - 2011.12.16 By 各种压力的猫君
  24. #      * 移植至RGSS3,遵循PS0协议;
  25. #      * 丰富自定义选项,整合双线性插值算法精简版
  26. #    - 2008.05.26 By 沉影不器
  27. #      * 蓝本(VX新截图存档)
  28. #------------------------------------------------------------------------------
  29. # [使用方法]
  30. #    - 删除原Scene_File、Window_SaveFile 并将本脚本插入到原Scene_File位置。
  31. #    - 或者直接将本脚本插入到MAIN以上,并确保本脚本位于上述两个脚本以下。
  32. #==============================================================================
  33. $_PS0 = {} if $_PS0 == nil  
  34. $_PS0["Window_SaveFile_Plus"] = 20120216
  35. #==============================================================================
  36. # [PS0] 通用配置模块  
  37. #==============================================================================
  38. module PS0
  39.   module Window_SaveFile_Plus

  40.     # 最大存档数(范围正整数)
  41.     MAX_SAVE = 18

  42.     # 存档目录(默认值 "Saves/";根目录 "")
  43.     SAVE_DIR = "Saves/"   

  44.     # 无存档时显示的文字
  45.     NO_DATA  = "无存档"

  46.     # 保存时显示的信息
  47.     SAVE_NOW = "存档中..."

  48.     # 复制存档时的帮助文字
  49.     HELP_COPY = "要复制到哪个位置?"

  50.     # 移动存档时的帮助文字
  51.     HELP_MOVE = "要移动到哪个位置?"

  52.     # 是否显示存档中窗口(true:显示;false:不显示)
  53.     # - 分辨率较大时建议显示
  54.     SHOW_SAVE_NOW = false

  55.     # 截图缩放使用的插值算法
  56.     # - "NN" 最邻近(速度最快,质量最差,RM默认算法)
  57.     # - "NZ" 不缩放(速度快,质量好,以主角为中心切边,非全屏)
  58.     Zoom_Type = "NZ"

  59.     # 双线性插值能获得更好的截图缩放质量,但所需时间较最邻近插值更长。
  60.     # 缩略图尺寸(范围整数,单位像素)
  61.     # - VA默认分辨率(544×416)推荐使用340×260
  62.     # - VA最大分辨率(640×480)推荐使用425×325
  63.     # - 本脚本兼容分辨率解放,窗口大小将自动计算。
  64.     #   请自行计算截图分辨率,注意要确保宽高比一致,
  65.     #   若使用“不缩放”模式则可以不保持一致。
  66.     Thumbnail_Width  = 340  # 宽度
  67.     Thumbnail_Height = 260  # 高度

  68.     # 缩略图位置微调(范围整数,单位像素)
  69.     Thumbnail_ox = -2    # 横向
  70.     Thumbnail_oy = -2-32 # 纵向

  71.     # 各窗口切换时的渐变帧数
  72.     TRANS_DURATION = 5

  73.   end
  74. end
  75. #==============================================================================
  76. # [核心脚本] 快速储存Bitmap的Marshal By 柳之一
  77. #==============================================================================
  78. class Font
  79.   def marshal_dump
  80.   end
  81.   def marshal_load(obj)
  82.   end
  83. end
  84. class Bitmap
  85.   RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  86.   RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  87.   def _dump(limit)
  88.     data = "rgba" * width * height
  89.     RtlMoveMemory_pi.call(data, address, data.length)
  90.     [width, height, Zlib::Deflate.deflate(data)].pack("LLa*")
  91.   end
  92.   def self._load(str)
  93.     w, h, zdata = str.unpack("LLa*")
  94.     b = self.new(w, h)
  95.     RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4)
  96.     return b
  97.   end
  98.   def address
  99.     buffer, ad = "rgba", object_id * 2 + 16
  100.     RtlMoveMemory_pi.call(buffer, ad, 4)
  101.     ad = buffer.unpack("L")[0] + 8
  102.     RtlMoveMemory_pi.call(buffer, ad, 4)
  103.     ad = buffer.unpack("L")[0] + 16
  104.     RtlMoveMemory_pi.call(buffer, ad, 4)
  105.     return buffer.unpack("L")[0]
  106.   end
  107. end
  108. #==============================================================================
  109. # ■ Game_Temp
  110. #==============================================================================
  111. class Game_Temp
  112.   attr_accessor :save_bitmap
  113.   attr_accessor :save_snapshoot
  114.   alias new_initialize initialize
  115.   def initialize
  116.     new_initialize
  117.     @save_bitmap = Bitmap.new(1, 1)
  118.     @save_snapshoot = Bitmap.new(1, 1)
  119.   end
  120. end
  121. #==============================================================================
  122. # ■ SceneManager
  123. #==============================================================================
  124. module SceneManager
  125.   def self.snapshot_for_save
  126.     $game_temp.save_bitmap = Graphics.snap_to_bitmap
  127.     unless FileTest.exist?(PS0::Window_SaveFile_Plus::SAVE_DIR)
  128.       Dir.mkdir(PS0::Window_SaveFile_Plus::SAVE_DIR)
  129.     end
  130.   end
  131. end
  132. #==============================================================================
  133. # ■ Scene_Map
  134. #==============================================================================
  135. class Scene_Map < Scene_Base
  136.   alias save_terminate terminate
  137.   def terminate
  138.     SceneManager.snapshot_for_save
  139.     save_terminate
  140.   end
  141. end
  142. #==============================================================================
  143. # ■ DataManager
  144. #==============================================================================
  145. module DataManager
  146.   def self.save_file_exists?
  147.     !Dir.glob(PS0::Window_SaveFile_Plus::SAVE_DIR + 'Save*.rvdata2').empty?
  148.   end
  149.   def self.make_filename(index)
  150.     sprintf(PS0::Window_SaveFile_Plus::SAVE_DIR + "Save%02d.rvdata2", index + 1)
  151.   end
  152.   #--------------------------------------------------------------------------
  153.   # ● セーブヘッダの作成
  154.   #--------------------------------------------------------------------------
  155.   def self.make_save_header
  156.     d_rect = Rect.new(0, 0, PS0::Window_SaveFile_Plus::Thumbnail_Width,
  157.                             PS0::Window_SaveFile_Plus::Thumbnail_Height)
  158.     case PS0::Window_SaveFile_Plus::Zoom_Type
  159.     when "NN"
  160.       s_rect = $game_temp.save_bitmap.rect
  161.       $game_temp.save_snapshoot = Bitmap.new(d_rect.width, d_rect.height)
  162.       $game_temp.save_snapshoot.stretch_blt(d_rect, $game_temp.save_bitmap, s_rect)
  163.     when "NZ"
  164.       x = [$game_player.screen_x - d_rect.width/2, 0].max
  165.       x = [x, Graphics.width - d_rect.width].min
  166.       y = [$game_player.screen_y - d_rect.height/2, 0].max
  167.       y = [y, Graphics.height - d_rect.height].min
  168.       s_rect = Rect.new(x, y, d_rect.width, d_rect.height)
  169.       $game_temp.save_snapshoot = Bitmap.new(d_rect.width, d_rect.height)
  170.       $game_temp.save_snapshoot.blt(0, 0, $game_temp.save_bitmap, s_rect)
  171.     end
  172.     header = {}
  173.     header[:characters] = $game_party.characters_for_savefile
  174.     header[:playtime_s] = $game_system.playtime_s
  175.     header[:snapshoot]  = $game_temp.save_snapshoot
  176.     header
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● セーブの実行
  180.   #--------------------------------------------------------------------------
  181.   def self.save_game(index)
  182.     saving_window = Window_Saving.new
  183.     Graphics.update
  184.     begin
  185.       save_game_without_rescue(index)
  186.     rescue
  187.        delete_save_file(index)
  188.        false
  189.     end
  190.     saving_window.dispose
  191.     return true
  192.   end
  193. end
  194. #==============================================================================
  195. # ■ Window_Yes_Or_No
  196. #------------------------------------------------------------------------------
  197. #  提供“是”、“否”两个选项的窗口(替换、删除存档用)
  198. #==============================================================================
  199. class Window_Yes_Or_No < Window_HorzCommand
  200.   #--------------------------------------------------------------------------
  201.   # ● オブジェクト初期化
  202.   #--------------------------------------------------------------------------
  203.   def initialize(yes, no)
  204.     [url=home.php?mod=space&uid=40913]@yes[/url] = yes
  205.     @no = no
  206.     super(130, 0)
  207.     self.visible = false
  208.     self.active = false
  209.     @index = 0
  210.   end
  211.   #--------------------------------------------------------------------------
  212.   # ● 桁数の取得
  213.   #--------------------------------------------------------------------------
  214.   def col_max
  215.     return 2
  216.   end
  217.   #--------------------------------------------------------------------------
  218.   # ● コマンドリストの作成
  219.   #--------------------------------------------------------------------------
  220.   def make_command_list
  221.     add_command(@yes,   :yes)
  222.     add_command(@no,    :cancel)
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ● 決定ボタンが押されたときの処理
  226.   #--------------------------------------------------------------------------
  227.   def process_ok
  228.     Input.update
  229.     call_ok_handler
  230.   end
  231.   #--------------------------------------------------------------------------
  232.   # ● 按下取消键时的处理
  233.   #--------------------------------------------------------------------------
  234.   def process_cancel
  235.     Input.update
  236.     call_cancel_handler
  237.   end
  238.   #--------------------------------------------------------------------------
  239.   # ● 启用窗口
  240.   #--------------------------------------------------------------------------
  241.   def activate
  242.     temp = self.y + self.height - Graphics.height
  243.     if temp > 0
  244.       self.y -= (temp + 12)
  245.     end
  246.     self.active = true
  247.     self
  248.   end
  249. end
  250. #==============================================================================
  251. # ■ Window_Saving
  252. #------------------------------------------------------------------------------
  253. #  显示保存信息的窗口
  254. #==============================================================================
  255. class Window_Saving < Window_Base
  256.   #--------------------------------------------------------------------------
  257.   # ● オブジェクト初期化
  258.   #--------------------------------------------------------------------------
  259.   def initialize
  260.     w = PS0::Window_SaveFile_Plus::SAVE_NOW.length * 16 + 32
  261.     x = (Graphics.width - w)/2
  262.     y = (Graphics.height - fitting_height(1))/2
  263.     super(x, y, w, fitting_height(1))
  264.     self.visible = PS0::Window_SaveFile_Plus::SHOW_SAVE_NOW
  265.     draw_text_ex(4, 0, PS0::Window_SaveFile_Plus::SAVE_NOW)
  266.   end
  267. end
  268. #==============================================================================
  269. # ■ Window_SaveManagerCommand
  270. #------------------------------------------------------------------------------
  271. #  存档管理窗口
  272. #==============================================================================
  273. class Window_SaveManagerCommand < Window_Command
  274.   #--------------------------------------------------------------------------
  275.   # ● 初始化对象
  276.   #--------------------------------------------------------------------------
  277.   def initialize(*args)
  278.     @copy, @move, @delete, [url=home.php?mod=space&uid=9053]@cancel[/url] = args[0..3]
  279.     super(130, 0)
  280.     self.visible = false
  281.     self.active = false
  282.     @index = 0
  283.   end
  284.   #--------------------------------------------------------------------------
  285.   # ● 获取窗口的宽度
  286.   #--------------------------------------------------------------------------
  287.   def window_width
  288.     return 100
  289.   end
  290.   #--------------------------------------------------------------------------
  291.   # ● 获取项目数
  292.   #--------------------------------------------------------------------------
  293.   def item_max
  294.     return 4
  295.   end
  296.   #--------------------------------------------------------------------------
  297.   # ● 生成指令列表
  298.   #--------------------------------------------------------------------------
  299.   def make_command_list
  300.     add_command(@copy,   :copy  )
  301.     add_command(@move,   :move  )
  302.     add_command(@delete, :delete)
  303.     add_command(@cancel, :cancel)
  304.   end
  305.   #--------------------------------------------------------------------------
  306.   # ● 按下确定键时的处理
  307.   #--------------------------------------------------------------------------
  308.   def process_ok
  309.     Input.update
  310.     call_ok_handler
  311.   end
  312.   #--------------------------------------------------------------------------
  313.   # ● 启用窗口
  314.   #--------------------------------------------------------------------------
  315.   def activate
  316.     temp = self.y + self.height - Graphics.height
  317.     if temp > 0
  318.       self.y -= (temp + 12)
  319.     end
  320.     self.active = true
  321.     self
  322.   end
  323. end
  324. #==============================================================================
  325. # ■ Window_FileCommand
  326. #------------------------------------------------------------------------------
  327. #  截图存档左侧的选择窗口。
  328. #==============================================================================
  329. class Window_FileCommand < Window_Command
  330.   #--------------------------------------------------------------------------
  331.   # ● オブジェクト初期化
  332.   #--------------------------------------------------------------------------
  333.   def initialize
  334.     super(0, 0)
  335.   end
  336.   #--------------------------------------------------------------------------
  337.   # ● ウィンドウ幅の取得
  338.   #--------------------------------------------------------------------------
  339.   def window_height
  340.     return Graphics.height-fitting_height(1)
  341.   end
  342.   #--------------------------------------------------------------------------
  343.   # ● 表示行数の取得
  344.   #--------------------------------------------------------------------------
  345.   def visible_line_number
  346.     item_max
  347.   end
  348.   #--------------------------------------------------------------------------
  349.   # ● コマンドリストの作成
  350.   #--------------------------------------------------------------------------
  351.   def make_command_list
  352.     add_main_commands
  353.   end
  354.   #--------------------------------------------------------------------------
  355.   # ● 主要コマンドをリストに追加
  356.   #--------------------------------------------------------------------------
  357.   def add_main_commands
  358.     for i in 1..PS0::Window_SaveFile_Plus::MAX_SAVE
  359.       if i < 10
  360.         text = Vocab::File + " 0" + i.to_s
  361.       else
  362.         text = Vocab::File + " " + i.to_s
  363.       end
  364.       add_command(text, :file)
  365.     end
  366.   end
  367.   #--------------------------------------------------------------------------
  368.   # ● 決定ボタンが押されたときの処理
  369.   #--------------------------------------------------------------------------
  370.   def process_ok
  371.   end
  372. end
  373. #==============================================================================
  374. # ■ Window_SaveFile
  375. #------------------------------------------------------------------------------
  376. #  セーブ画面およびロード画面で表示する、セーブファイルのウィンドウです。
  377. #==============================================================================
  378. class Window_SaveFile < Window_Base
  379.   #--------------------------------------------------------------------------
  380.   # ● オブジェクト初期化
  381.   #     index : セーブファイルのインデックス
  382.   #--------------------------------------------------------------------------
  383.   def initialize(index)
  384.     super(160, 0, Graphics.width-160, Graphics.height-fitting_height(1))
  385.     @file_index = index
  386.     @selected = true
  387.     refresh
  388.   end
  389.   #--------------------------------------------------------------------------
  390.   # ● リフレッシュ
  391.   #--------------------------------------------------------------------------
  392.   def refresh
  393.     contents.clear
  394.     change_color(normal_color)
  395.     w = (self.width-PS0::Window_SaveFile_Plus::Thumbnail_Width-16)/2
  396.     h = (self.height-PS0::Window_SaveFile_Plus::Thumbnail_Height-16)/2
  397.     width  = w + PS0::Window_SaveFile_Plus::Thumbnail_ox
  398.     height = h + PS0::Window_SaveFile_Plus::Thumbnail_oy
  399.     draw_shadow(width+5, height+5)
  400.     draw_text((self.width-32-PS0::Window_SaveFile_Plus::NO_DATA.length*16)/2,
  401.               self.height/2-32, PS0::Window_SaveFile_Plus::NO_DATA.length*32,
  402.               line_height, PS0::Window_SaveFile_Plus::NO_DATA)
  403.     draw_party_characters(32, Graphics.height-fitting_height(1)-32)
  404.     draw_playtime(-10, contents.height - line_height-10, contents.width - 4, 2)
  405.     draw_snapshoot(width, height)
  406.   end
  407.   #--------------------------------------------------------------------------
  408.   # ● パーティキャラの描画
  409.   #--------------------------------------------------------------------------
  410.   def draw_party_characters(x, y)
  411.     header = DataManager.load_header(@file_index)
  412.     return unless header
  413.     header[:characters].each_with_index do |data, i|
  414.       draw_character(data[0], data[1], x + i * 48, y)
  415.     end
  416.   end
  417.   #--------------------------------------------------------------------------
  418.   # ● プレイ時間の描画
  419.   #--------------------------------------------------------------------------
  420.   def draw_playtime(x, y, width, align)
  421.     header = DataManager.load_header(@file_index)
  422.     return unless header
  423.     draw_text(x, y, width, line_height, header[:playtime_s], 2)
  424.   end
  425.   #--------------------------------------------------------------------------
  426.   # ● 绘制截图
  427.   #--------------------------------------------------------------------------
  428.   def draw_snapshoot(x, y)
  429.     header = DataManager.load_header(@file_index)
  430.     return unless header
  431.     bitmap = header[:snapshoot]
  432.     contents.blt(x, y, bitmap, bitmap.rect)
  433.     bitmap.dispose
  434.   end
  435.   #--------------------------------------------------------------------------
  436.   # ● 绘制阴影
  437.   #--------------------------------------------------------------------------
  438.   def draw_shadow(x, y)
  439.     header = DataManager.load_header(@file_index)
  440.     return unless header
  441.     contents.fill_rect(x, y, PS0::Window_SaveFile_Plus::Thumbnail_Width,
  442.                              PS0::Window_SaveFile_Plus::Thumbnail_Height, Color.new(0, 0, 0))
  443.     contents.blur
  444.   end
  445. end
  446. #==============================================================================
  447. # ■ Scene_File
  448. #------------------------------------------------------------------------------
  449. #  セーブ画面とロード画面の共通処理を行うクラスです。
  450. #==============================================================================
  451. class Scene_File < Scene_MenuBase
  452.   #--------------------------------------------------------------------------
  453.   # ● 開始処理
  454.   #--------------------------------------------------------------------------
  455.   def start
  456.     super
  457.     create_help_window
  458.     create_savefile_viewport
  459.     create_command_window
  460.     create_savefile_window
  461.     create_manager_window
  462.     create_replace_window
  463.     create_delete_window
  464.   end
  465.   #--------------------------------------------------------------------------
  466.   # ● 終了処理
  467.   #--------------------------------------------------------------------------
  468.   def terminate
  469.     super
  470.     @savefile_viewport.dispose
  471.     @savefile_window.dispose
  472.     @command_window.dispose
  473.     @window_manager.dispose
  474.     @window_replace.dispose
  475.     @window_delete.dispose
  476.   end
  477.   #--------------------------------------------------------------------------
  478.   # ● フレーム更新
  479.   #--------------------------------------------------------------------------
  480.   def update
  481.     super
  482.     update_savefile_selection
  483.   end
  484.   #--------------------------------------------------------------------------
  485.   # ● 创建替换窗口
  486.   #--------------------------------------------------------------------------
  487.   def create_replace_window
  488.     @window_replace = Window_Yes_Or_No.new("替换", "取消")
  489.     @window_replace.set_handler(:yes,    method(:do_replace))
  490.     @window_replace.set_handler(:cancel, method(:do_cancel))
  491.   end
  492.   #--------------------------------------------------------------------------
  493.   # ● 创建删除窗口
  494.   #--------------------------------------------------------------------------
  495.   def create_delete_window
  496.     @window_delete  = Window_Yes_Or_No.new("删除", "取消")
  497.     @window_delete.set_handler(:yes,    method(:do_delete))
  498.     @window_delete.set_handler(:cancel, method(:do_return_manager))
  499.     @window_delete.x += 40
  500.   end
  501.   #--------------------------------------------------------------------------
  502.   # ● 创建管理窗口
  503.   #--------------------------------------------------------------------------
  504.   def create_manager_window
  505.     @window_manager = Window_SaveManagerCommand.new("复制", "移动", "删除", "取消")
  506.     @window_manager.set_handler(:copy  , method(:on_copy?))
  507.     @window_manager.set_handler(:move  , method(:on_move?))
  508.     @window_manager.set_handler(:delete, method(:on_delete?))
  509.     @window_manager.set_handler(:cancel, method(:do_cancel))
  510.   end
  511.   #--------------------------------------------------------------------------
  512.   # ● ヘルプウィンドウの作成
  513.   #--------------------------------------------------------------------------
  514.   def create_help_window
  515.     @help_window = Window_Help.new(1)
  516.     @help_window.set_text(help_window_text)
  517.   end
  518.   #--------------------------------------------------------------------------
  519.   # ● ヘルプウィンドウのテキストを取得
  520.   #--------------------------------------------------------------------------
  521.   def help_window_text
  522.     return ""
  523.   end
  524.   #--------------------------------------------------------------------------
  525.   # ● セーブファイルビューポートの作成
  526.   #--------------------------------------------------------------------------
  527.   def create_savefile_viewport
  528.     @savefile_viewport = Viewport.new
  529.     @savefile_viewport.rect.y = @help_window.height
  530.     @savefile_viewport.rect.height -= @help_window.height
  531.   end
  532.   #--------------------------------------------------------------------------
  533.   # ● セーブファイルウィンドウの作成
  534.   #--------------------------------------------------------------------------
  535.   def create_savefile_window
  536.     @savefile_window = Window_SaveFile.new(@index)
  537.     @savefile_window.viewport = @savefile_viewport
  538.   end
  539.   #--------------------------------------------------------------------------
  540.   # ● 生成存档列表窗口
  541.   #--------------------------------------------------------------------------
  542.   def create_command_window
  543.     @command_window = Window_FileCommand.new
  544.     @command_window.index = first_savefile_index
  545.     @index = @command_window.index
  546.     @command_window.viewport = @savefile_viewport
  547.     @command_window.set_handler(:file,      method(:on_savefile_ok))
  548.   end
  549.   #--------------------------------------------------------------------------
  550.   # ● セーブファイル選択の更新
  551.   #--------------------------------------------------------------------------
  552.   def update_savefile_selection
  553.     if @source_index != nil
  554.       if Input.trigger?(:C)
  555.         if @index == @source_index
  556.           Sound.play_buzzer
  557.         elsif FileTest.exist?(DataManager.make_filename(@index))
  558.           Graphics.freeze
  559.           @command_window.deactivate
  560.           @window_replace.y = 72 + @index * 24
  561.           @window_replace.activate
  562.           @window_replace.visible = true
  563.           @window_replace.refresh
  564.           Sound.play_ok
  565.           Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  566.         else
  567.           return on_copy_ok
  568.         end
  569.       elsif Input.trigger?(:B)
  570.         return do_return_manager
  571.       end
  572.     else
  573.       if Input.trigger?(:C)
  574.         if self.is_a?(Scene_Save) and FileTest.exist?(DataManager.make_filename(@index))
  575.           Graphics.freeze
  576.           @command_window.deactivate
  577.           @window_replace.y = 72 + @index * 24
  578.           @window_replace.activate
  579.           @window_replace.visible = true
  580.           @window_replace.refresh
  581.           Sound.play_ok
  582.           Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  583.         else
  584.           return on_savefile_ok
  585.         end
  586.       elsif Input.trigger?(:B)
  587.         return on_savefile_cancel
  588.       elsif Input.trigger?(:F5)
  589.         unless @window_manager.active == true or
  590.                @window_delete.active == true or
  591.                @window_replace.active == true
  592.           return on_manager?
  593.         end
  594.       end
  595.     end
  596.     @need_refresh = true if @index != @command_window.index
  597.     if @need_refresh
  598.       Graphics.freeze
  599.       @index = @command_window.index
  600.       @savefile_window.dispose
  601.       create_savefile_window
  602.       @need_refresh = false
  603.       Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  604.     end
  605.   end
  606.   #--------------------------------------------------------------------------
  607.   # ● セーブファイル[決定]
  608.   #--------------------------------------------------------------------------
  609.   def on_savefile_ok
  610.   end
  611.   #--------------------------------------------------------------------------
  612.   # ● セーブファイル[キャンセル]
  613.   #--------------------------------------------------------------------------
  614.   def on_savefile_cancel
  615.     Sound.play_cancel
  616.     return_scene
  617.   end
  618.   #--------------------------------------------------------------------------
  619.   # ● セーブファイル[決定]
  620.   #--------------------------------------------------------------------------
  621.   def on_copy_ok
  622.     Graphics.freeze
  623.     source_name = DataManager.make_filename(@source_index)
  624.     new_name    = DataManager.make_filename(@index)
  625.     case @source_type
  626.     when "copy"
  627.       # 复制存档文件(API)
  628.       Win32API.new('kernel32',"CopyFileA",'ppl','').call(source_name,new_name,0)
  629.     when "move"
  630.       # 重命名存档
  631.       File.rename(source_name, new_name)
  632.     end
  633.     # 返回
  634.     @help_window.set_text(help_window_text)
  635.     @source_index = nil
  636.     do_return_savelist
  637.   end
  638.   #--------------------------------------------------------------------------
  639.   # ● セーブファイル[复制]
  640.   #--------------------------------------------------------------------------
  641.   def on_copy?
  642.     Graphics.freeze
  643.     @help_window.set_text(PS0::Window_SaveFile_Plus::HELP_COPY)
  644.     @source_index = @index
  645.     @source_type = "copy"
  646.     do_return_savelist
  647.   end
  648.   #--------------------------------------------------------------------------
  649.   # ● セーブファイル[移动]
  650.   #--------------------------------------------------------------------------
  651.   def on_move?
  652.     Graphics.freeze
  653.     @help_window.set_text(PS0::Window_SaveFile_Plus::HELP_MOVE)
  654.     @source_index = @index
  655.     @source_type = "move"
  656.     do_return_savelist
  657.   end
  658.   #--------------------------------------------------------------------------
  659.   # ● セーブファイル[管理]
  660.   #--------------------------------------------------------------------------
  661.   def on_manager?
  662.     if FileTest.exist?(DataManager.make_filename(@index))
  663.       Graphics.freeze
  664.       @command_window.deactivate
  665.       @window_manager.y = 72 + @index * 24
  666.       @window_manager.activate
  667.       @window_manager.visible = true
  668.       @window_manager.refresh
  669.       Sound.play_ok
  670.       Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  671.     else
  672.       Sound.play_buzzer
  673.     end
  674.   end
  675.   #--------------------------------------------------------------------------
  676.   # ● セーブファイル[删除]
  677.   #--------------------------------------------------------------------------
  678.   def on_delete?
  679.     Graphics.freeze
  680.     @window_manager.deactivate
  681.     @command_window.deactivate
  682.     @window_delete.y = 72 + 72 + @index * 24
  683.     @window_delete.activate
  684.     @window_delete.visible = true
  685.     @window_delete.refresh
  686.     Sound.play_ok
  687.     Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  688.   end
  689.   #--------------------------------------------------------------------------
  690.   # ● 删除
  691.   #--------------------------------------------------------------------------
  692.   def do_delete
  693.     Graphics.freeze
  694.     File.delete(DataManager.make_filename(@index))
  695.     @window_delete.index  = 0
  696.     @window_manager.index = 0
  697.     @window_delete.visible  = false
  698.     @window_manager.visible = false
  699.     @window_delete.deactivate
  700.     @window_manager.deactivate
  701.     @command_window.activate
  702.     @need_refresh = true
  703.     Sound.play_save
  704.     if DataManager.save_file_exists?
  705.       Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  706.     else
  707.       return_scene
  708.     end
  709.   end
  710.   #--------------------------------------------------------------------------
  711.   # ● 替换
  712.   #--------------------------------------------------------------------------
  713.   def do_replace
  714.     Graphics.freeze
  715.     if @source_index != nil
  716.       return on_copy_ok
  717.     else
  718.       return on_savefile_ok
  719.     end
  720.     @window_replace.visible = false
  721.     @window_replace.deactivate
  722.     @need_refresh = true
  723.   end
  724.   #--------------------------------------------------------------------------
  725.   # ● 取消
  726.   #--------------------------------------------------------------------------
  727.   def do_cancel
  728.     Graphics.freeze
  729.     Sound.play_cancel
  730.     @window_delete.index  = 0
  731.     @window_replace.index = 0
  732.     @window_manager.index = 0
  733.     @window_delete.visible  = false
  734.     @window_replace.visible = false
  735.     @window_manager.visible = false
  736.     @window_delete.deactivate
  737.     @window_replace.deactivate
  738.     @window_manager.deactivate
  739.     @command_window.activate
  740.     Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  741.   end
  742.   #--------------------------------------------------------------------------
  743.   # ● 返回管理菜单
  744.   #--------------------------------------------------------------------------
  745.   def do_return_manager
  746.     Graphics.freeze
  747.     @help_window.set_text(help_window_text)
  748.     @command_window.index = @source_index unless @source_index == nil
  749.     @source_index = nil
  750.     @source_type = nil
  751.     @command_window.deactivate
  752.     @window_delete.index  = 0
  753.     @window_replace.index = 0
  754.     @window_delete.visible  = false
  755.     @window_replace.visible = false
  756.     @window_delete.deactivate
  757.     @window_replace.deactivate
  758.     @window_manager.y = 72 + @index * 24
  759.     @window_manager.activate
  760.     @window_manager.visible = true
  761.     @window_manager.refresh
  762.     Sound.play_cancel
  763.     Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  764.   end
  765.   #--------------------------------------------------------------------------
  766.   # ● 返回文件列表(复制、移动 用)
  767.   #--------------------------------------------------------------------------
  768.   def do_return_savelist
  769.     @window_manager.visible = false
  770.     @window_manager.deactivate
  771.     @command_window.activate
  772.     @need_refresh = true
  773.     Sound.play_ok
  774.   end
  775. end
  776. #==============================================================================
  777. # [PS0] End of Script
  778. #==============================================================================
复制代码

坑的进度如上                                                                                                        点击↑
回复

使用道具 举报

梦石
0
星屑
50
在线时间
91 小时
注册时间
2012-3-3
回帖
56
 楼主| 发表于 2013-5-5 12:50:39 | 显示全部楼层
黄濑凉太 发表于 2013-4-28 15:08
是截图存档的代码把:

我是只想要截图功能,大神给的脚本怎么用呢?
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2013-5-5 13:23:20 | 显示全部楼层
Mapshot_Button = Input::F7
Screenshot_Button = Input::F6


[pre lang="ruby" line="1"]=begin
  
#===============================================================================

Title: Map Screenshot

Author: Tsukihime

Date: Apr 15, 2013

--------------------------------------------------------------------------------

** Change log

Apr 15, 2013

   - updated script to use GDI+ interface

   - added support for region map overlay and passage map overlay

Apr 6, 2013

   - fixed bug where drawing events crashed the game

Apr 2, 2013

   - map data is now setup by an instance of Game_Map, to account for custom

     map scripts adding to the map

Jul 27

   - Export dirNames are now optional

May 28

   - updated overlay mapping compatibility to draw the overlays

     based on the player's current position

   - fixed issue where import hash was commented out

   - Added support for Yami's overlay mapping

May 24, 2012

   - fixed large characters

   - some optimizations for calculating bounds and dimensions

May 5, 2012

   - fixed waterfall autotile

   - added screenshot feature

May 4, 2012

   - fixed tiles with alpha channel

   - fixed shadows

   - fixed wall autotiles

May 1, 2012

   - fixed wall autotile, although there is still an issue with some tiles

Apr 29, 2012

   - fixed shadow map drawing

   - added region highlighting

   - added damage tile highlighting

Apr 28, 2012

   - Initial Release

------------------------------------------------------------------------------

** Description



This script allows you to take a full image of any of your game's maps

and export. An image of the map is referred to as a "mapshot" (as opposed to

screenshot).



The script provides various configuration options to control what kinds of

things you want to see on your map, such as events, vehicles, region ID's, or

specific tile properties.



------------------------------------------------------------------------------

** Usage



The default key for taking a mapshot is F7. This can be changed in the

configuration section.



To take a mapshot, first start the game, and then hit F7.

A message will appear informing you that a mapshot was successfully taken.



Alternatively, you can use script calls to take mapshots.



    Map_Saver.new(map_id).export

   

Aside from exporting images, you are able to use the image that the

map saver captures.



   ms = Map_Saver.new(map_id)

   bmp = ms.map_image

   

This gives you a reference to a Bitmap object that contains an image of

your map.

--------------------------------------------------------------------------------

  ** Credits



  Cremno

    -GDI+ interface code

  Cidiomar

    -for drawing autotiles and shadows,

    -providing efficient bmp and png exporters

  Moon

    -auto-tile related info

  Mephistox

    -testing and suggestions

================================================================================

=end

$imported = {} if $imported.nil?

$imported["TH_MapSaver"] = true

#===============================================================================

# ** Configuration

#===============================================================================

module TH

  module Map_Saver

   

    #Mapshot options. This takes an image of the entire map

    Mapshot_Button = Input::F7

    Mapshot_Scale = 1

   

    #Screenshot options. This takes an image of the visible map

    Screenshot_Button = Input::F6

    Screenshot_Scale = 1

   

    #Folder that the map will be exported to

    Mapshot_Directory = "Mapshots"

    Screenshot_Directory = "Screenshots"

   

    # format you want to export to. You should stick with png.

    # Options: [bmp, png]

    Export_Format = "png"

   

    # Sprite draw options

    Draw_Events = false

    Draw_Player = false

    Draw_Followers = false

    Draw_Vehicles = false

   

    #Should shadows be drawn? What color?

    Draw_Shadow = true

    Shadow_Color = Color.new(0, 0, 0, 128)

   

    # Should regions be drawn? Requires "Region Overlay Map" script

    Draw_Regions = false

   

    # Should passage settings be drawn? Requires "Passage Overlay Map" script

    Draw_Passages = false

   

    #Should damage tiles be highlighted? What color?

    Highlight_Damage = true

    Damage_Color = Color.new(128, 0, 0, 128)

  end

end



#==============================================================================

# ** Module: Map_Tiles

# Contains data and methods useful for working with maps and tiles

#==============================================================================



module Map_Tiles

  AUTOTILE_PARTS = [[18,17,14,13], [ 2,14,17,18], [13, 3,17,18], [ 2, 3,17,18],

                    [13,14,17, 7], [ 2,14,17, 7], [13, 3,17, 7], [ 2, 3,17, 7],

                    [13,14, 6,18], [ 2,14, 6,18], [13, 3, 6,18], [ 2, 3, 6,18],

                    [13,14, 6, 7], [ 2,14, 6, 7], [13, 3, 6, 7], [ 2, 3, 6, 7],

                    [16,17,12,13], [16, 3,12,13], [16,17,12, 7], [12, 3,16, 7],

                    [10, 9,14,13], [10, 9,14, 7], [10, 9, 6,13], [10, 9, 6, 7],

                    [18,19,14,15], [18,19, 6,15], [ 2,19,14,15], [ 2,19, 6,15],

                    [18,17,22,21], [ 2,17,22,21], [18, 3,22,21], [ 2, 3,21,22],

                    [16,19,12,15], [10, 9,22,21], [ 8, 9,12,13], [ 8, 9,12, 7],

                    [10,11,14,15], [10,11, 6,15], [18,19,22,23], [ 2,19,22,23],

                    [16,17,20,21], [16, 3,20,21], [ 8,11,12,15], [ 8, 9,20,21],

                    [16,19,20,23], [10,11,22,23], [ 8,11,20,23], [ 0, 1, 4, 5]]

  WATERFALL_PIECES = [[ 2, 1, 6, 5], [ 0, 1, 4, 5], [ 2, 3, 6, 7], [0, 3, 4, 7]]

  WALL_PIECES =  [[10, 9, 6, 5], [ 8, 9, 4, 5], [ 2, 1, 6, 5], [ 0, 1, 4, 5],

                  [10,11, 6, 7], [ 8,11, 4, 7], [ 2, 3, 6, 7], [ 0, 3, 4, 7],

                  [10, 9,14,13], [ 8, 9,12,13], [ 2, 1,14,13], [ 0, 1,12,13],

                  [10,11,14,15], [8, 11,12,15], [ 2, 3,14,15], [ 0, 3,12,15]]



  A1_TILES = [[0, 0], [0, 96], [192, 0], [192, 96],

               [256, 0], [448, 0], [256, 96], [448, 96],

               [0, 192], [192, 192], [0, 288], [192, 288],

               [256, 192], [448, 192], [256, 288], [448, 288]]

   

  

  #--------------------------------------------------------------------------

  # * Checks if a tile is a wall

  #--------------------------------------------------------------------------

  def is_wall?(data)

    return true if data.between?(2288, 2335)

    return true if data.between?(2384, 2431)

    return true if data.between?(2480, 2527)

    return true if data.between?(2576, 2623)

    return true if data.between?(2672, 2719)

    return true if data.between?(2768, 2815)

    return true if data.between?(4736, 5119)

    return true if data.between?(5504, 5887)

    return true if data.between?(6272, 6655)

    return true if data.between?(7040, 7423)

    return true if data > 7807

    false

  end

  #--------------------------------------------------------------------------

  # * Checks if a tile is roof

  #--------------------------------------------------------------------------

  def is_roof?(data)

    return true if data.between?(4352, 4735)

    return true if data.between?(5120, 5503)

    return true if data.between?(5888, 6271)

    return true if data.between?(6656, 7039)

    return true if data.between?(7424, 7807)

    false

  end  

  #--------------------------------------------------------------------------

  # * Checks if a tile is soil

  #--------------------------------------------------------------------------

  def is_soil?(data)

    return true if data.between?(2816, 4351) && !is_table?(data)

    return true if data > 1663 && !is_stair?(data)

    false

  end   

  #--------------------------------------------------------------------------

  # * Checks if a tile is a stair

  #--------------------------------------------------------------------------

  def is_stair?(data)

     return true if data.between?(1541, 1542)

     return true if data.between?(1549, 1550)

     return true if data.between?(1600, 1615)

     false

  end

  #--------------------------------------------------------------------------

  # * Checks if a tile is a table

  #--------------------------------------------------------------------------

  def is_table?(data)

    return true if data.between?(3152, 3199)

    return true if data.between?(3536, 3583)

    return true if data.between?(3920, 3967)

    return true if data.between?(4304, 4351)

    false

  end



  #--------------------------------------------------------------------------

  # * The tileset to be used

  #--------------------------------------------------------------------------

  def tileset

    $data_tilesets[@tileset_id]

  end

  

  #--------------------------------------------------------------------------

  # * Region ID

  #--------------------------------------------------------------------------

  def region_id(x, y)

    valid?(x, y) ? @map.data[x, y, 3] >> 8 : 0

  end

  

  #--------------------------------------------------------------------------

  # * Gets all of the tiles for each layer at position x,y

  #--------------------------------------------------------------------------

  def layered_tiles(x, y)

    [2, 1, 0].collect {|z| @map.data[x, y, z] }

  end

  

  def layered_tiles_flag?(x, y, bit)

    layered_tiles(x, y).any? {|tile_id| tileset.flags[tile_id] & bit != 0 }

  end

   

  def valid?(x, y)

    x >= 0 && x < width && y >= 0 && y < height

  end

  

  def damage_floor?(x, y)

    valid?(x, y) && layered_tiles_flag?(x, y, 0x100)

  end

  

  #--------------------------------------------------------------------------

  # * Specifies which type of autotile is used

  #--------------------------------------------------------------------------

  def auto_tile(id)

    id / 48

  end

  

  #--------------------------------------------------------------------------

  # * Specifies the specific arrangement of autotiles used

  #--------------------------------------------------------------------------

  def auto_index(id)

    id % 48

  end

  

  #--------------------------------------------------------------------------

  # * Put the auto-tile pieces together

  #--------------------------------------------------------------------------

  def make_autotile(rects, sx, sy)

    @tile.clear

    for i in 0...4

      @auto_rect.x = (rects % 4) * 16 + sx

      @auto_rect.y = (rects / 4) * 16 + sy

      @tile.blt((i % 2) * 16,(i / 2) * 16, @tilemap, @auto_rect)

    end

  end

     

  #--------------------------------------------------------------------------

  # * Get auto-tile A1 tiles

  #--------------------------------------------------------------------------

  def autotile_A1(tile_id)

    @tilemap = @bitmaps[0]

    autotile = tile_id / 48

    auto_id = tile_id % 48

    sx, sy = A1_TILES[autotile]

    if is_wall?(tile_id + 2048)

      rects = WATERFALL_PIECES[auto_id]

    else  

      rects = AUTOTILE_PARTS[auto_id]

    end

    make_autotile(rects, sx, sy)

  end

  

  #--------------------------------------------------------------------------

  # * Get auto-tile A2 tiles.

  # 64x96 tiles, 8 per row, 4 rows

  #--------------------------------------------------------------------------

  def autotile_A2(tile_id)

    autotile = tile_id / 48

    auto_id = tile_id % 48

    @tilemap = @bitmaps[1]

    sx = (autotile % 8) * 64

    sy = (autotile / 8 % 4) * 96

    rects = AUTOTILE_PARTS[auto_id]

    make_autotile(rects, sx, sy)

  end

  

  #--------------------------------------------------------------------------

  # * Get auto-tile A3 tiles.

  # 64x64 tiles, 8 per row, 4 rows

  #--------------------------------------------------------------------------

  def autotile_A3(tid)

    @tilemap = @bitmaps[2]

    sx = (auto_tile(tid) % 8) * 64

    sy = (auto_tile(tid) / 8 % 4) * 64

    rects = WALL_PIECES[auto_index(tid)]

    make_autotile(rects, sx, sy)

  end

  

  #--------------------------------------------------------------------------

  # * Get auto-tile A4 tiles (walls)

  #--------------------------------------------------------------------------

  def autotile_A4(tile_id)

    @tilemap = @bitmaps[3]

    autotile = tile_id / 48

    auto_id = tile_id % 48

    sx = (autotile % 8) * 64

    sy = (autotile / 16 * 160) + (autotile / 8 % 2) * 96

    if is_wall?(tile_id + 5888)

      rects = WALL_PIECES[auto_id]

    else

      rects = AUTOTILE_PARTS[auto_id]

    end

    make_autotile(rects, sx, sy)

  end

  

  #--------------------------------------------------------------------------

  # * Get auto-tile A5 tiles (normal)

  #--------------------------------------------------------------------------

  def autotile_A5(tile_id)

    @tilemap = @bitmaps[4]

    sx = (tile_id) % 8 * tilesize

    sy = (tile_id) / 8 * tilesize

    @src_rect.set(sx, sy, tilesize, tilesize)

    @tile.clear

    @tile.blt(0, 0, @tilemap, @src_rect)

  end

  

  #--------------------------------------------------------------------------

  # * Get normal tiles B, C, D, E

  #--------------------------------------------------------------------------

  def normal_tile(tile_id)

    @tilemap = @bitmaps[5 + tile_id / 256]

    sx = (tile_id / 128 % 2 * 8 + tile_id % 8) * tilesize;

    sy = (tile_id % 256 / 8 % 16) * tilesize;

    @src_rect.set(sx, sy, tilesize, tilesize)

    @tile.clear

    @tile.blt(0, 0, @tilemap, @src_rect)

  end

   

  #--------------------------------------------------------------------------

  # * Get bitmap for the specified tile id

  #--------------------------------------------------------------------------

  def get_bitmap(id)

    if id < 1024

      normal_tile(id)

    elsif id < 1664

      autotile_A5(id - 1536)

    elsif id < 2816

      autotile_A1(id - 2048)

    elsif id < 4352

      autotile_A2(id - 2816)

    elsif id < 5888

      autotile_A3(id - 4352)

    else

      autotile_A4(id - 5888)

    end

  end

end



#==============================================================================

# **

#==============================================================================



class Game_Player < Game_Character

  

  alias :th_mapsaver_update :update

  def update

    th_mapsaver_update

    if Input.trigger?(TH::Map_Saver::Mapshot_Button)

      s = Map_Saver.new($game_map.map_id)

      s.set_scale(TH::Map_Saver::Mapshot_Scale)

      s.mapshot

    end

    if Input.trigger?(TH::Map_Saver::Screenshot_Button)

      s = Map_Saver.new($game_map.map_id)

      s.set_scale(TH::Map_Saver::Screenshot_Scale)

      s.screenshot

    end

  end

end



class Game_Vehicle < Game_Character

  attr_reader :map_id

end



class Game_Map

  attr_reader :map

end



#==============================================================================

# **

#==============================================================================



class Map_Saver

  include TH::Map_Saver

  include Map_Tiles

  #--------------------------------------------------------------------------

  # * Constants

  #--------------------------------------------------------------------------



  SHADOW_COLOR = TH::Map_Saver::Shadow_Color

  DAMAGE_COLOR = TH::Map_Saver::Damage_Color



  #--------------------------------------------------------------------------

  # * Public instance variables

  #--------------------------------------------------------------------------

  attr_reader :map_image

  

  def initialize(map_id=$game_map.map_id, x=$game_player.x, y=$game_player.y)

    @scale = 1

    @local_x = x

    @local_y = y

    @screen_local = false

    @shadow_bitmap = Bitmap.new(128, 128)

    @draw_layer0 = true

    @draw_layer1 = true

    @draw_layer2 = true

    @draw_events = Draw_Events

    @draw_vehicles = Draw_Vehicles

    @draw_player = Draw_Player

    @draw_followers = Draw_Followers

    @draw_shadow = Draw_Shadow

    @draw_damage = Highlight_Damage

    @draw_regions = Draw_Regions

    @draw_passages = Draw_Passages

    @tile = Bitmap.new(32, 32) #stores the current tile to be drawn

    @tilemap = nil

    @src_rect = Rect.new

    @auto_rect = Rect.new(0, 0, tilesize / 2, tilesize/ 2) #constant

    @tile_rect = Rect.new(0, 0, tilesize, tilesize)        #constant

  end

  

  def load_tilesets

    bitmaps = []

    tileset.tileset_names.each_with_index do |name, i|

      bitmaps = Cache.tileset(name)

    end

    return bitmaps

  end

  

  #--------------------------------------------------------------------------

  # * Refresh, possibly with a new map

  #--------------------------------------------------------------------------

  def redraw(map_id=$game_map.map_id, x=$game_player.x, y=$game_player.y)

    @map_image.dispose if @map_image

    @map_id = map_id

    @local_x = x

    @local_y = y

    @game_map = Game_Map.new

    @game_map.setup(map_id)

    @map = @game_map.map

    @map_info = $data_mapinfos[map_id]

    @screen = $game_map.screen

    @tileset_id = @game_map.tileset.id

    @bitmaps = load_tilesets

   

    get_bounds

    @map_image = Bitmap.new(@width * tilesize, @height * tilesize)

    draw_map

    scale_map if @scale != 1

  end

  

  #--------------------------------------------------------------------------

  # * Pre-process. These will never change when drawing the map.

  #--------------------------------------------------------------------------

  def get_bounds

    @start_x = start_x

    @start_y = start_y

    @end_x = end_x

    @end_y = end_y

    @width = width

    @height = height

    @tilesize = tilesize

  end

  

  def screen_tile_x

    Graphics.width / 32

  end

  

  def screen_tile_y

    Graphics.height / 32

  end

  

  #--------------------------------------------------------------------------

  # * Sets the scale for the map

  #--------------------------------------------------------------------------

  def set_scale(scale)

    @scale = scale

  end

  

  #--------------------------------------------------------------------------

  # * Size of a tile

  #--------------------------------------------------------------------------

  def tilesize

    32

  end

  

  #--------------------------------------------------------------------------

  # * Width and height of the map, both locally and globally

  #--------------------------------------------------------------------------

  def width

    end_x - @start_x

  end

  

  def height

    end_y - @start_y

  end

  

  #--------------------------------------------------------------------------

  # * Starting and end positions, relative to the screen or map

  #--------------------------------------------------------------------------

  def start_x

    @screen_local ? [[$game_player.x - screen_tile_x / 2, @map.width - screen_tile_x].min, 0].max : 0

  end



  def start_y

    @screen_local ? [[$game_player.y - screen_tile_y / 2, @map.height - screen_tile_y].min, 0].max : 0

  end

  

  def end_x

    @screen_local ? [[screen_tile_x, @local_x + screen_tile_x / 2 + 1].max, @map.width].min : @map.width

  end

  

  def end_y

    @screen_local ? [[screen_tile_y, @local_y + screen_tile_y / 2 + 1].max, @map.height].min : @map.height

  end



  #--------------------------------------------------------------------------

  # * Draw tile onto image. x and y values are absolute coords. They should

  # be re-mapped based on the start_x and start_y values

  #--------------------------------------------------------------------------

  def draw_tile(x, y, tile, rect)

    ox = (x - @start_x) * tilesize

    oy = (y - @start_y) * tilesize

    @map_image.blt(ox, oy, tile, rect)

  end

  

  #--------------------------------------------------------------------------

  # * Get bitmap for the specified character

  #--------------------------------------------------------------------------

  def get_character_bitmap(name)

    charmap = Cache.character(name)

    sign = name[/^[\!\$]./]

    if sign && sign.include?('$')

      cw = charmap.width / 3

      ch = charmap.height / 4

    else

      cw = charmap.width / 12

      ch = charmap.height / 8

    end

    return charmap, cw, ch

  end

  

  #--------------------------------------------------------------------------

  # * Draw the character onto the tile

  #--------------------------------------------------------------------------

  def set_character_bitmap(character, x, y)

    charmap, cw, ch = get_character_bitmap(character.character_name)

    index = character.character_index

    pattern = character.pattern < 3 ? character.pattern : 1

    sx = (index % 4 * 3 + pattern) * cw

    sy = (index / 4 * 4 + (character.direction - 2) / 2) * ch

    @src_rect.set(sx, sy, cw, ch)

    x -= cw / (@tilesize * 2) if cw >= @tilesize

    y -= ch / (@tilesize * 2) if ch >= @tilesize  

    draw_tile(x, y, charmap, @src_rect)

  end

  

  #--------------------------------------------------------------------------

  # * create the shadow map

  #--------------------------------------------------------------------------

  def make_shadow_map

    for s in 0 ... 16

      x = s % 4

      y = s / 4

      if s & 0b1000 == 0b1000

        @shadow_bitmap.fill_rect(x*tilesize+16, y*@tilesize+16, 16, 16, SHADOW_COLOR)

      end

      if s & 0b0100 == 0b0100

        @shadow_bitmap.fill_rect(x*tilesize, y*@tilesize+16, 16, 16, SHADOW_COLOR)

      end

      if s & 0b0010 == 0b0010

        @shadow_bitmap.fill_rect(x*tilesize+16, y*@tilesize, 16, 16, SHADOW_COLOR)

      end

      if s & 0b0001 == 0b0001

        @shadow_bitmap.fill_rect(x*tilesize, y*@tilesize, 16, 16, SHADOW_COLOR)

      end

    end

  end

  

  def draw_parallax

    image = Cache.parallax(@map.parallax_name)

    @src_rect.set(0, 0, image.width, image.height)

    @map_image.blt(0, 0, image, @src_rect)

  end

  

  #--------------------------------------------------------------------------

  # * Draw the shadow map

  #--------------------------------------------------------------------------

  def draw_shadow_map

    for x in @start_x ... @end_x

      for y in @start_y ... @end_y

      _x, _y = x*@tilesize, y*@tilesize

        s = @map.data[x, y, 3]  & 0b1111

        if s != 0

          x_ = (s % 4) * @tilesize

          y_ = (s / 4) * @tilesize

          @src_rect.set(x_, y_, @tilesize, @tilesize)

          draw_tile(x, y, @shadow_bitmap, @src_rect)

        end

      end

    end

  end

  

  #--------------------------------------------------------------------------

  # * Draw the specified layer

  #--------------------------------------------------------------------------

  def draw_layer(layer)

    for x in @start_x ... @end_x

      for y in @start_y ... @end_y

        _x, _y = x*@tilesize, y*@tilesize

        tile_id = @map.data[x, y, layer]

        next if tile_id == 0

        get_bitmap(tile_id)

        draw_tile(x, y, @tile, @tile_rect)

      end

    end

  end

  

  #-----------------------------------------------------------------------------

  # Draw game regions

  #-----------------------------------------------------------------------------

  def draw_regions

    if $imported["TH_RegionOverlay"]

      image = SceneManager.scene.instance_variable_get(:@spriteset).instance_variable_get(:@region_map).bitmap

      @src_rect.set(@start_x * tilesize, @start_y * tilesize, image.width, image.height)

      @map_image.blt(0, 0, image, @src_rect, 255)

    end

  end

  

  def draw_passages

    if $imported["TH_OverlayPassageMap"]

      image = SceneManager.scene.instance_variable_get(:@spriteset).instance_variable_get(:@passage_map).bitmap

      @src_rect.set(@start_x * tilesize, @start_y * tilesize, image.width, image.height)

      @map_image.blt(0, 0, image, @src_rect, 255)

    end

  end



  #--------------------------------------------------------------------------

  # * Draw the game player

  #--------------------------------------------------------------------------

  def draw_player

    set_character_bitmap($game_player, $game_player.x, $game_player.y) if @map_id == $game_map.map_id

  end

  

  def draw_followers

  end

  

  #--------------------------------------------------------------------------

  # * Draw map events

  #--------------------------------------------------------------------------

  def draw_events

    @map.events.values.each do |event|

      id = event.pages[0].graphic.tile_id

      char_name = event.pages[0].graphic.character_name

      if id > 0

        normal_tile(id)

        draw_tile(event.x, event.y, @tilemap, @src_rect)

      elsif char_name != ""

        set_character_bitmap(event.pages[0].graphic, event.x, event.y)

      end

    end

  end

  

  #--------------------------------------------------------------------------

  # * Draw map vehicles

  #--------------------------------------------------------------------------

  def draw_vehicles

    $game_map.vehicles.each do |vehicle|

      set_character_bitmap(vehicle, vehicle.x, vehicle.y,) if @map_id == vehicle.map_id

    end

  end

  

  #--------------------------------------------------------------------------

  # * Draw map sprites

  #--------------------------------------------------------------------------

  def draw_sprites

    draw_events if @draw_events

    draw_vehicles if @draw_vehicles

    draw_player if @draw_player

    draw_followers if @draw_followers

  end

  

  #--------------------------------------------------------------------------

  # * Highlight damage tiles

  #--------------------------------------------------------------------------

  def draw_damage

    @tile.clear

    @tile.fill_rect(0, 0, @tilesize, @tilesize, DAMAGE_COLOR)

    @src_rect.set(0, 0, @tilesize, @tilesize)

    for x in @start_x ... @end_x

      for y in @start_y ... @end_y

        _x, _y = x*@tilesize, y*@tilesize

        if damage_floor?(x, y)

          draw_tile(x, y, @tile, @src_rect)

        end

      end

    end

  end

  

  def draw_screen_effects

  end

  #--------------------------------------------------------------------------

  # * Draw the map

  #--------------------------------------------------------------------------

  def draw_map

    make_shadow_map if @draw_shadow

    draw_parallax

    draw_layer(0)

    draw_layer(1)

    draw_shadow_map

    draw_layer(2)

    draw_damage if @draw_damage

    draw_regions if @draw_regions

    draw_passages if @draw_passages

    draw_sprites

    draw_screen_effects

  end

  

  #--------------------------------------------------------------------------

  # * Scale the map

  #--------------------------------------------------------------------------

  def scale_map

    nw = @width * @scale

    nh = @height * @scale

    @src_rect.set(0, 0, @width, @height)

    scaled_map = Bitmap.new(nw, nh)

    scaled_rect = Rect.new(0, 0, nw, nh)

    scaled_map.stretch_blt(scaled_rect, @map_image, @src_rect)

    @map_image = scaled_map

  end

  

  #--------------------------------------------------------------------------

  # * Take a mapshot of the map

  #--------------------------------------------------------------------------

  def mapshot

    @screen_local = false

    redraw

    export(TH::Map_Saver::Mapshot_Directory)

    $game_message.add("Mapshot taken")

  end

   

  #--------------------------------------------------------------------------

  # * Take a screenshot of the map

  #--------------------------------------------------------------------------

  def screenshot

    @screen_local = true

    redraw

    export(TH::Map_Saver::Screenshot_Directory)

    $game_message.add("Screenshot taken")

  end

  

  #--------------------------------------------------------------------------

  # * Get the format to export to

  #--------------------------------------------------------------------------

  def get_format

    TH::Map_Saver::Export_Format

  end

  

  #--------------------------------------------------------------------------

  # * Export the map to a file

  #--------------------------------------------------------------------------

  def export(dirName="")

    format = get_format

    name = @map.display_name != "" ? @map.display_name : @map_info.name

    Dir.mkdir(dirName) unless File.directory?(dirName)

    filename = "%s\\%s.%s" %[dirName, name, format]

    t1 = Time.now

    @map_image.save(filename)

    t2 = Time.now

    $game_message.add("Exported in %f seconds" %[t2 - t1])

  end

end



class Bitmap



  def save(filename, options = {})

    options.merge!(format: File.extname(filename)[1..-1].to_sym)

    retval = false

    #bitmap = Gdiplus::Bitmap.new(:hbitmap, hbitmap)

    #bitmap = Gdiplus::Bitmap.new(:gdidib, *gdidib)

    # this seems to be the fastest one (RGSS 3.0.1, Windows 8 64-bit)

    bitmap = Gdiplus::Bitmap.new(:scan0, width, height, scan0)

    if bitmap

      retval = bitmap.save(:file, filename, options[:format])

      bitmap.dispose

    end

    retval

  end



private



  def _data_struct(offset = 0)

    @_data_struct ||= (DL::CPtr.new((object_id << 1) + 16).ptr + 8).ptr

    (@_data_struct + offset).ptr.to_i

  end



  def gdidib

     [_data_struct(8), _data_struct(16)]

  end



  def hbitmap

    _data_struct(44)

  end



  def scan0

    _data_struct(12)

  end



end



# ★ GDI+ interface

# ★★★★★★★★★★★★

#

# Author : Cremno

#



module Gdiplus

  DLL = 'gdiplus.dll'



  def self.get_function name, import, export = 'L'

    Win32API.new DLL, name, import, export

  end



  FUNCTIONS = {

    GdiplusStartup: get_function('GdiplusStartup', 'PPP'),

    GdiplusShutdown: get_function('GdiplusShutdown', 'P', 'V'),

    GdipDisposeImage: get_function('GdipDisposeImage', 'P'),

    GdipSaveImageToFile: get_function('GdipSaveImageToFile', 'PPPP'),

    GdipCreateBitmapFromGdiDib: get_function('GdipCreateBitmapFromGdiDib', 'LLP'),

    GdipCreateBitmapFromHBITMAP: get_function('GdipCreateBitmapFromHBITMAP', 'LLP'),

    GdipCreateBitmapFromScan0: get_function('GdipCreateBitmapFromScan0', 'LLLLPP')

  }



  @@token = [0].pack('I')

  def self.token

    @@token

  end



  @@clsids = {}

  def self.clsids

    @@clsids

  end



  def self.gen_clsids

    return unless @@clsids.empty?

    func = Win32API.new('rpcrt4.dll', 'UuidFromString', 'PP', 'L')

    {

      bmp:  '557cf400-1a04-11d3-9a73-0000f81ef32e',

      jpeg: '557cf401-1a04-11d3-9a73-0000f81ef32e',

      gif:  '557cf402-1a04-11d3-9a73-0000f81ef32e',

      tiff: '557cf405-1a04-11d3-9a73-0000f81ef32e',

      png:  '557cf406-1a04-11d3-9a73-0000f81ef32e'

    }.each_pair do |k, v|

      clsid = [0].pack('I')

      func.call(v, clsid)

      @@clsids[k] = clsid

    end

    @@clsids[:jpg] = @@clsids[:jpeg]

    @@clsids[:tif] = @@clsids[:tiff]

  end



  # TODO: prepend prefix (Gdip or Gdiplus) automatically

  def self.call(*args)

    name = args.shift

    func = FUNCTIONS[name]

    v = func.call(*args)

    if v && v != 0

      msgbox "GDI+ error: #{v}\n\nFunction: #{name}\nArguments: #{args.inspect}"

      false

    else

      true

    end

  end



  def self.startup

    call :GdiplusStartup, @@token, [1, 0, 0, 0].pack('L4'), 0

  end



  def self.shutdown

    call :GdiplusShutdown, @@token

  end



  class Image



    attr_reader :instance

    def initialize

      @instance = 0

      true

    end



    def save(destination, *args)

      case destination

      when :file

        filename = args.shift << "\0"

        filename.encode!('UTF-16LE')

        argv = [:GdipSaveImageToFile, filename, Gdiplus.clsids[args.shift], 0]

      else

        raise ArgumentError, "unknown GDI+ image destination: #{source}"

      end

      argv.insert(1, @instance)

      Gdiplus.call *argv

    end



    def dispose

      Gdiplus.call :GdipDisposeImage, @instance

    end

  end



  class Bitmap < Image



    def initialize source, *args

      case source

      when :gdidib

        argv = [:GdipCreateBitmapFromGdiDib, args.shift, args.shift]

      when :hbitmap

        argv = [:GdipCreateBitmapFromHBITMAP, args.shift, 0]

      when :scan0

        w = args.shift

        h = args.shift

        argv = [:GdipCreateBitmapFromScan0, w, h, w * -4, 0x26200a, args.shift]

      else

        raise ArgumentError, "unknown GDI+ bitmap source: #{source}"

      end

      argv.push([0].pack('I'))

      retval = Gdiplus.call *argv

      @instance = retval ? argv.last.unpack('I').first : 0

      retval

    end

  end

end



if Gdiplus.startup

  Gdiplus.gen_clsids

  class << SceneManager

    alias_method :run_wo_gdip_shutdown, :run

    def run

      run_wo_gdip_shutdown

      Gdiplus.shutdown

    end

  end

end



#==============================================================================

# * Compatibility add-ons

#==============================================================================

#Yami overlays

if $imported["YSE-OverlayMapping"]

  class Map_Saver

    def draw_overlay_map_ground

      filename = YSA::OVERLAY::GROUND

      filename += $game_map.map_id.to_s

      filename += "-" + $game_variables[YSA::OVERLAY::GROUND_VARIABLE].to_s

      p filename

      image = Cache.overlay(filename)

      @src_rect.set(@start_x*tilesize, @start_y*tilesize, image.width, image.height)

      @map_image.blt(0, 0, image, @src_rect)

    end

   

    def draw_overlay_map_parallax

      filename = YSA::OVERLAY::PARALLAX

      filename += $game_map.map_id.to_s

      filename += "-" + $game_variables[YSA::OVERLAY::PARALLAX_VARIABLE].to_s

      image = Cache.overlay(filename)

      @src_rect.set(@start_x*tilesize, @start_y*tilesize, image.width, image.height)

      @map_image.blt(0, 0, image, @src_rect)

    end

   

    def draw_overlay_map_light

      filename = YSA::OVERLAY::LIGHT

      filename += $game_map.map_id.to_s

      filename += "-" + $game_variables[YSA::OVERLAY::LIGHT_VARIABLE].to_s

      image = Cache.overlay(filename)

      @src_rect.set(@start_x*tilesize, @start_y*tilesize, image.width, image.height)

      @map_image.blt(0, 0, image, @src_rect, 10)

    end

   

    def draw_overlay_map_shadow

      filename = YSA::OVERLAY::SHADOW

      filename += $game_map.map_id.to_s

      filename += "-" + $game_variables[YSA::OVERLAY::SHADOW_VARIABLE].to_s

      image = Cache.overlay(filename)

      @src_rect.set(@start_x*tilesize, @start_y*tilesize, image.width, image.height)

      @map_image.blt(0, 0, image, @src_rect, 10)

    end

  

    alias :th_map_overlay_draw_map :draw_map

    def draw_map

      th_map_overlay_draw_map

      draw_overlay_map_ground if $game_switches[YSA::OVERLAY::GROUND_SWITCH]

      draw_overlay_map_parallax if $game_switches[YSA::OVERLAY::PARALLAX_SWITCH]

      draw_overlay_map_shadow if $game_switches[YSA::OVERLAY::SHADOW_SWITCH]

      draw_overlay_map_light if $game_switches[YSA::OVERLAY::LIGHT_SWITCH]

    end

  end

end



if $imported["TH_AreaOverlay"]

  class Map_Saver

    def draw_overlay_area_map

      image = SceneManager.scene.instance_variable_get(:@spriteset).instance_variable_get(:@area_map).bitmap

      @src_rect.set(@start_x * tilesize, @start_y * tilesize, image.width, image.height)

      @map_image.blt(0, 0, image, @src_rect, 255)

    end

   

    alias :th_area_overlay_draw_map :draw_map

    def draw_map

      th_area_overlay_draw_map

      draw_overlay_area_map

    end

  end

end[/pre]
回复

使用道具 举报

梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
回帖
1526
发表于 2013-5-6 07:51:46 | 显示全部楼层
楼主的意思不是要截图脚本,而是截图的程式码,或者说,他想知道怎么配合荣誉系统,把当前画面存成图档,然后可以在那个荣誉系统中显示图档画面。
修改劇本中,仔細審查原來的劇情大綱,覺得有點不太滿意,嘗試編寫不同主角不同主線的劇情,希望能寫得出來。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
91 小时
注册时间
2012-3-3
回帖
56
 楼主| 发表于 2013-5-11 22:26:57 | 显示全部楼层
j433463 发表于 2013-5-6 07:51
楼主的意思不是要截图脚本,而是截图的程式码,或者说,他想知道怎么配合荣誉系统,把当前画面存成图档,然 ...

是啊,迫于高考压力,近期上不了网了,如果没有什么好的回复的话,这个贴请斑竹帮忙结了吧,等高考完自己研究研究
回复

使用道具 举报

梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
回帖
1526
发表于 2013-5-12 02:27:47 | 显示全部楼层
我觉得您不必想要从截图存档脚本中去抠截图代码,可以考虑用这个存图脚本:

http://cacaosoft.web.fc2.com/tkool/script/rgss3/save_bitmap.html

它可以用 Bitmap 方式从图档取得的位图内容存到指定的图档中,也可以直接将当前游戏画面存成图档,图档格式可以是 BITMAP, JPEG, PNG, GIF 四种,
实际方式在该页中有介绍。

其实您要的只是截取当时画面,这个在 VA 本身的 Graphics.snap_to_bitmap 就可以做到,开启主菜单时截取地图背景就是用它来做的,
在 SceneManager 默认脚本的最底下,生成背景用的场景截图 def self.snapshot_for_background 那边,您自己去参看它的写法,
但截图后关键在于截取到的画面要存到 png 时的方式,这个复杂了点,我也只能照抄着代码来用,并不怎么懂这个东西,说不清楚,
您有空再去找一下吧,vx 和 xp 有谈到 bitmap to png 的一些帖子。

点评

好的,我研究一下,谢谢了!  发表于 2013-5-19 13:26
修改劇本中,仔細審查原來的劇情大綱,覺得有點不太滿意,嘗試編寫不同主角不同主線的劇情,希望能寫得出來。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部