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

Project1

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

[已经过期] 我想制作一个手表...

[复制链接]

Lv1.梦旅人

梦石
0
星屑
132
在线时间
11 小时
注册时间
2019-7-5
帖子
7
跳转到指定楼层
1
发表于 2019-7-22 10:27:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
就是制作一个物品,使用它会显示时间,用的是这个日历
  1. #==============================================================================
  2. # ** 虚拟日历
  3. #  作者:影月千秋
  4. #  适用:VA
  5. #------------------------------------------------------------------------------
  6. # * 简介:
  7. #  模拟时间流逝,并在地图(菜单)进行显示
  8. #  可以自定义计时规则和显示效果
  9. #  请为本脚本准备变量和开关,在下方进行设定
  10. #  不出意外的话本脚本不再维护
  11. #------------------------------------------------------------------------------
  12. # * 使用方法:
  13. #  将此脚本插入到其他脚本以下,Main 以上,在下面给出的设定区进行设定后即可
  14. #  在事件中操作指定的变量和开关,便可以获取和改变时间
  15. #  也可以通过事件脚本进行操作
  16. #  允许的脚本呼叫:
  17. #    Smomo.calendar(type) 取得日历的内部数据
  18. #   参数说明:type 想要获得的数据名
  19. #       【:all】 获取所有数据的数组 依次为:时段 色调 刷新标志 周期历时 周期序号
  20. #       【:zone】获取当前时段的名称(如:"早晨")
  21. #       【:tone】不常用,获取当前色调(Tone色调类的实例)
  22. #       【:need_change】没有任何实用意义,不常用,可以获取需要刷新的标志
  23. #       【:period】当前周期经过的时间(如:1366)
  24. #       【:prd】当前周期的序号,对应在周期名字(如:3)
  25. #       【:pname】当前周期的名字,与prd是对应的(如:周三)
  26. #   例:【Smomo.calendar(:zone)】获取时段名
  27. #  发布帖:
  28. #   http://rm.66rpg.com/thread-330684-1-1.html
  29. #------------------------------------------------------------------------------
  30. # * 版本
  31. #   V 4.0 2017.02.05 删掉了估计没什么人用的 routine;修复了周期更新异常的 bug
  32. #   V 3.4 2016.08.01 增加了一个人性化的报错提示: 未设置 Speed 对应变量
  33. #   V 3.3 2014.09.30 解决了时段计时与时间在变量干涉下不同步的问题
  34. #   V 3.2 2014.09.07 添加了公共接口routine
  35. #   V 3.1 2014.09.07 优化了室内地图的标记方式 修正了暂停计时时色调的转换问题
  36. #   V 3.0 2014.07.31 修正了2.7以为成功实际上未修正成功的问题 并做了一些其他调整
  37. #   V 2.9 2014.07.28 修正了Map不能为:none从2.3版延续过来的睿智错误
  38. #   V 2.8 2014.07.26 对2.7的小修正 并修改了自定义提示语
  39. #   V 2.7 2014.07.24 修正了事件推进时不刷新周期的问题
  40. #   V 2.6 2014.05.24 修正了日期出现0的BUG
  41. #   V 2.5 2014.04.06 规范化脚本 消除冗余 重建逻辑结构 需要依赖Smomo脚本核心
  42. #   V 2.4 2014.01.31 修正读档时报错的BUG
  43. #   V 2.3 2014.01.29 可以自定义地图窗体的位置
  44. #   V 2.2 2013.12.27 修正Window_MoVMe的错误
  45. #   V 2.1 2013.12.15 修正过卡的BUG
  46. #   V 2.0 2013.10.04 基本重写
  47. #   V 1.0 2013.08.31 公开
  48. #------------------------------------------------------------------------------
  49. # * 声明:
  50. #   本脚本由来自【影月千秋】,使用和转载请保留此信息
  51. #==============================================================================

  52. $smomo ||= {}
  53. if $smomo["Calendar"].nil?
  54. $smomo["Calendar"] = 4.0

  55. #==============================================================================
  56. # ** Smomo::Calendar
  57. #==============================================================================
  58. module Smomo
  59. module Calendar
  60.   
  61.   # 一般情况下可以不予配置直接使用本系统
  62.   # 但为了获得比较理想的效果,建议仔细进行配置
  63.   # 配置比较繁琐,请务必耐心阅读注释
  64.   
  65.   Use = 1
  66.   # [开关 ID] 只有当此开关打开时,才会计时(可自主更改开关位置)
  67.    # 打开开关前,请确保下方 Speed 对应的变量不为 0
  68.   
  69.   Speed = 1
  70.   # [变量 ID] 此变量的值代表经过多少帧后最小计时单位增加一(可自主更改变量位置)
  71.    # 一般情况下,1 秒 = 60 帧
  72.   
  73.   System = [
  74.     # ["单位名", 满多少进一, 是否以零起始],
  75.     ["分", 60, true],
  76.     ["时", 24, true],
  77.     ["日", 30],
  78.     ["月", 12],
  79.     ["年", 9999],
  80.   ]
  81.   # 设定计时制,排在前面的单位小于后面的单位
  82.    # 有的单位允许零值,比如 3:00,有的不行,比如 3 月 1 日
  83.     # 默认不允许零值,如果允许,请将“是否以零起始”填为[true]
  84.    # 称第一个单位为最小计时单位
  85.   
  86.   Var = 81
  87.   # [变量 ID] 设定记时制占用变量的起始编号
  88.    # 会占用以这个号码为首的连续数个变量
  89.     # 占用的变量个数即之前 System 中设置的单位的个数
  90.   
  91.   Start = [38, 12, 5, 2, 2017]
  92.   # 设置游戏起始时间,与上面 System 中的单位从上到下依次对应
  93.   
  94.   PeriodName = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
  95.   # 周期
  96.    # 每经过一定长度的最小计时单位,会循环推进到下一个周期
  97.    # 具体经过的最小计时单位数在 Zone 中设定
  98.    
  99.   Start_PeriodName = 0
  100.   # 游戏起始时的周期,用序号指代(从 0 开始数)
  101.   
  102.   TimeZone = true
  103.   # [true/false] 是否启用时段功能,即一个周期内是否有各时段的区分
  104.   
  105.   Zone = [
  106.   # [时段长度, Tone.new(红, 绿, 蓝, 灰), "名称"],
  107.     [120, Tone.new( -75,-100,   0,  75), "夜晚"], # 0...120
  108.     [120, Tone.new(-125,-125, -10, 125), "深夜"], # 120...240
  109.     [120, Tone.new( -75,-100,   0,  75), "黎明"], # 240...360
  110.     [300, Tone.new(   0,   0,   0,   0), "上午"], # 360...660
  111.     [240, Tone.new(  50,  50,  10, -30), "中午"], # 660...900
  112.     [120, Tone.new(   0,   0,   0,   0), "下午"], # 900...1020
  113.     [120, Tone.new(  34, -34, -68, 170), "黄昏"], # 1020...1140
  114.     [300, Tone.new( -75,-100,   0,  75), "夜晚"], # 1140...1440 则1440为周期长度
  115.   ]
  116.   # 设置时段周期内各时段的长度、色调及名称
  117.    # 时段长度以最小计时单位为单位
  118.    # 到达对应时段时 会自动改变画面的色调
  119.    # 所有时段的长度加起来就是周期长度
  120.     # 所以,就算不需要使用时段功能,也一定要保证时段长度之和是一个合适的值
  121.   
  122.   IndoorMap = /<IndoorMap>/i
  123.   # 用于匹配室内地图备注的正则式
  124.    # 默认为 /<IndoorMap>/i
  125.     # 即在地图的备注上写 <IndoorMap> 就可以标记其为室内地图,不区分大小写
  126.    # 处于室内地图时,不会受到时段色调的影响
  127.   
  128.   Menu = true
  129.   # [true/false] 是否在菜单内显示日历
  130.    # true 使用  false 不使用
  131.    # 如果预设不能满足要求 请自行在下方自定义区更改
  132.   
  133.   Map = :bottom
  134.   # [:top/:bottom/:none] 是否在地图上显示日历
  135.    # :top 顶部  :bottom 底部  :none 不使用
  136.    # 如果预设不能满足要求 请自行在下方自定义区更改
  137.   
  138.   Format = {
  139.     # 菜单日历用的格式
  140.     menu: %W!
  141.             <4年>.<2月>.<2日>
  142.             \\I[234]___<Period>
  143.             <2时>:<2分>_<Zone>
  144.           !,
  145.     # 地图日历用的格式
  146.     map:  %W!
  147.             \\I[234]公元<4年>年<2月>月<2日>日___<Period>___<Zone>_<2时>:<2分>
  148.           !
  149.   }
  150.   # 日历输出格式,此处写多少行,游戏内就会依次对应输出多少行
  151.    # 每一行的内部不要使用空格( ),空格用下划线(_)代替
  152.    # 尽量不要使用英文感叹号(!),如果一定要用请在之前加上反斜杠(\!)
  153.    # 使用 <符号> 的形式来代替指定的数据,其他的文字用于修饰
  154.    # 可用的符号:
  155.     # 在上面计时制中设定的单位 可以加上一个数字来代表格式化位数
  156.      # 如:<2时>:<2分> 显示 09:33,<时>:<分> 显示 9:33
  157.     # <Period> 当前周期的名字(如:星期三)
  158.     # <Zone>   当前时段的名字(如:早晨)
  159.    # 两个符号必须用两对<>分别括起来 不能写在同一对<>内
  160.    # 允许使用转义字符 但是必须有两个反斜杠
  161.     # 如 显示图标 \I[3] 应写成 \\I[3]
  162. end
  163. end

  164. #==============================================================================
  165. # 如果你懂脚本,可以在下面调整时间窗口的显示方式
  166. #==============================================================================

  167. #============================================================================
  168. # ** Window_MoMenuCalendar 菜单画面中,显示当前游戏内部虚拟日历的窗口
  169. #============================================================================
  170. class Window_MoMenuCalendar < Window_Base
  171.   include Smomo::Calendar
  172.   
  173.   def initialize(gold_window)
  174.     unless $game_switches[Use]
  175.       super(0, 0, 1, 1)
  176.       self.opacity = 0
  177.       return
  178.     end
  179.     height = Format[:menu].size * 30 + 20
  180.     super(0, gold_window.y - height, gold_window.width, height)
  181.     format = Marshal.load Marshal.dump(Format[:menu])
  182.     format.each_with_index do |t, l|
  183.       t.gsub!(/_/){" "}
  184.       System.each_with_index do |(u, m), i|
  185.         t.gsub!(/<(\d*)#{u}>/){
  186.           format("%0#{$1 ? $1.to_i : nil}d", $game_variables[Var + i])
  187.         }
  188.       end
  189.       t.gsub!(/<Period>/){"#{PeriodName[Smomo::Calendar.prd]}"}
  190.       t.gsub!(/<Zone>/){"#{Smomo::Calendar.zone}"}
  191.       draw_text_ex(0, l * 30, t)
  192.     end
  193.   end
  194. end
  195. #============================================================================
  196. # ** Window_MoMapCalendar 地图画面中,显示当前游戏内部虚拟日历的窗口
  197. #                         但本质上是一个精灵
  198. #============================================================================
  199. class Window_MoMapCalendar < Window_Base
  200.   include Smomo::Calendar
  201.   
  202.   def initialize
  203.     height = Format[:map].size * 30 + 10
  204.     @sprite = Sprite.new
  205.     @sprite.y = Smomo::Calendar::Map == :top ? 0 : Graphics.height - height
  206.     @sprite.bitmap = Bitmap.new Graphics.width, height
  207.     @use = true
  208.     update
  209.     refresh
  210.   end
  211.   
  212.   def update
  213.     unless @use == $game_switches[Use]
  214.       @use = $game_switches[Use]
  215.       @sprite.x = @use ? 0 : Graphics.width
  216.       refresh
  217.     else
  218.       if @use && $game_variables[Speed].zero?
  219.         raise "请先将 Speed 对应变量设为非零值!"
  220.       end
  221.       refresh if @use && Graphics.frame_count % $game_variables[Speed] == 0 ||
  222.       $game_map.need_refresh
  223.     end
  224.   end
  225.   
  226.   def dispose
  227.     @sprite.bitmap.dispose if @sprite.bitmap
  228.     @sprite.dispose
  229.   end
  230.   
  231.   def refresh
  232.     contents.clear
  233.     contents.gradient_fill_rect(0, 0, @sprite.width, @sprite.height,
  234.     Color.new(30, 30, 30), Color.new(0, 0, 0, 0))
  235.     format = Marshal.load Marshal.dump(Format[:map])
  236.     format.each_with_index do |t, l|
  237.       t.gsub!(/_/){" "}
  238.       System.each_with_index do |(u, m), i|
  239.         t.gsub!(/<(\d*)#{u}>/){
  240.           format("%0#{$1 ? $1.to_i : nil}d", $game_variables[Var + i])
  241.         }
  242.       end
  243.       t.gsub!(/<Period>/){"#{PeriodName[Smomo::Calendar.prd]}"}
  244.       t.gsub!(/<Zone>/){"#{Smomo::Calendar.zone}"}
  245.       draw_text_ex(0, l * 30 + 5, t)
  246.     end
  247.   end
  248.   #------------------------------------------------------------------------
  249.   # * 偷梁换柱 如果不明白这段的意义 请勿随意删除
  250.   #------------------------------------------------------------------------
  251.   def contents
  252.     @sprite.bitmap
  253.   end
  254.   def windowskin
  255.     Cache.system "Window"
  256.   end
  257. end
  258. #==============================================================================
  259. # ** Scene_Menu 建立菜单场景的窗口
  260. #==============================================================================
  261. class Scene_Menu
  262.   alias ewc_start start
  263.   def start
  264.     ewc_start
  265.     return unless Smomo::Calendar::Menu
  266.     # 在下面添加自定义内容
  267.     @mocalendar_window = Window_MoMenuCalendar.new(@gold_window)
  268.   end
  269. end
  270. #==============================================================================
  271. # ** Scene_Map 建立地图场景的窗口
  272. #==============================================================================
  273. class Scene_Map
  274.   alias ewc_create_all_windows create_all_windows
  275.   def create_all_windows
  276.     ewc_create_all_windows
  277.     return if Smomo::Calendar::Map == :none
  278.     # 在下面添加自定义内容
  279.     @mocalendar_window = Window_MoMapCalendar.new
  280.   end
  281. end
  282. #=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+#
  283. #------------------------------------------------------------------------------#
  284.                                "请勿跨过这块区域"
  285. #------------------------------------------------------------------------------#
  286. #+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=#

  287. #==============================================================================
  288. # ** Smomo::Calendar
  289. #==============================================================================
  290. module Smomo::Calendar
  291.   #
  292.   PeriodSize = Zone.inject(0){|s, (l)| s + l}
  293.   Zone.each_with_index{|z, i| z[0] += i == 0 ? 0 : Zone[i - 1][0]}
  294.   _ = Marshal.load Marshal.dump Zone
  295.   _.each_with_index{|z, i| Zone[i][0] = (i == 0 ? 0 : _[i - 1][0])...z[0]}
  296.   _ = 1
  297.   System.each_with_index do |u, i|
  298.     _ *= i == 0 ? 1 : System[i - 1][1]
  299.     u[2] = !!u[2]
  300.     u[3] = _
  301.   end
  302.   #
  303.   class << self
  304.     attr_reader :zone, :prd
  305.     attr_accessor :period
  306.     define_method(:data){[@zone, @tone, @need_change, @period, @prd]}
  307.     define_method(:data=){|d| @zone, @tone, @need_change, @period, @prd = d}
  308.     define_method(:function){|type| type == :all ? data : eval(type.to_s)}
  309.     #
  310.     def pname
  311.       PeriodName[@prd]
  312.     end
  313.     #
  314.     def ini
  315.       $game_variables.instance_exec do
  316.         System.each_index{|i| @data[Var + i] = Start[i]}
  317.       end
  318.       @tone = Tone.new 0, 0, 0, 0
  319.       @need_change = false
  320.       @prd = Start_PeriodName
  321.       set_period
  322.       fire_in_the_hole
  323.     end
  324.     #
  325.     def set_period
  326.       u = System.each_index.map{|i| $game_variables[Var + i]}
  327.       v = System.map{|a| a[3]}
  328.       @period =
  329.         u.zip(v).each_with_object(:*).map(&:inject).inject(:+) % PeriodSize
  330.     end
  331.     #
  332.     def i_look_into_the_sky_as_time_passes_by
  333.       return unless $game_switches[Use]
  334.       return if $game_message.visible
  335.       raise "请先将 Speed 对应变量设为非零值!" if $game_variables[Speed].zero?
  336.       return unless Graphics.frame_count % $game_variables[Speed] == 0
  337.       $game_variables[Var] += 1
  338.       fire_in_the_hole
  339.     end
  340.     #
  341.     def wtf var, ori, lat
  342.       @period += System[var - Var][3] * (lat - ori)
  343.       fire_in_the_hole
  344.     end
  345.     #
  346.     def fire_in_the_hole
  347.       ensure_time_legal
  348.       ensure_period_legal
  349.       check_period_and_zone
  350.       change_tone if TimeZone
  351.     end
  352.     #
  353.     def ensure_time_legal
  354.       $game_variables.instance_exec do
  355.         System.each_with_index do |(u, m, o), i|
  356.           while @data[Var + i] > m - (o ? 1 : 0)
  357.             @data[Var + i] -= m
  358.             @data[Var + i + 1] += 1
  359.           end
  360.           while @data[Var + i] < 1 - (o ? 1 : 0)
  361.             @data[Var + i] += m
  362.             @data[Var + i + 1] -= 1
  363.           end
  364.         end
  365.       end
  366.     end
  367.     #
  368.     def ensure_period_legal
  369.       @prd += @period / PeriodSize
  370.       @period = @period % PeriodSize
  371.       @prd = @prd % PeriodName.size
  372.     end
  373.     #
  374.     def check_period_and_zone
  375.       tone, @zone = Zone.find{|(r, t, n)| r.include?(@period)}[1, 2]
  376.       @tone == tone ? nil : [@tone = tone, @need_change = true]
  377.     end
  378.     #
  379.     def change_tone im = false, reset = false
  380.       return unless @need_change || im
  381.       @need_change = false
  382.       if indoor? || !$game_switches[Use] && reset
  383.         $game_map.screen.start_tone_change Tone.new(0, 0, 0, 0), 0
  384.       else
  385.         return unless $game_switches[Use]
  386.         $game_map.screen.start_tone_change @tone, im ? 0 : 60
  387.       end
  388.     end
  389.     #
  390.     def indoor?
  391.       $game_map.instance_exec{ @map }.note =~ IndoorMap
  392.     end
  393.   end
  394. end
  395. #==============================================================================
  396. # ** Smomo.calendar(*a, &b)
  397. #==============================================================================
  398. def Smomo.calendar *a, &b
  399.   Smomo::Calendar.function *a, &b
  400. end
  401. #==============================================================================
  402. # ** Game_Switches
  403. #==============================================================================
  404. class Game_Switches
  405.   alias ewc_on_change on_change
  406.   def on_change
  407.     ewc_on_change
  408.     Smomo::Calendar.change_tone true, true
  409.   end
  410. end
  411. #==============================================================================
  412. # ** Game_Variables
  413. #==============================================================================
  414. class Game_Variables
  415.   alias :ewc_set_var :[]=
  416.   def []= variable_id, value
  417.     min = Smomo::Calendar::Var
  418.     max = min + Smomo::Calendar::System.size - 1
  419.     if variable_id.between? min, max
  420.       Smomo::Calendar.wtf variable_id, @data[variable_id], value
  421.     end
  422.     ewc_set_var variable_id, value
  423.   end
  424. end
  425. #==============================================================================
  426. # ** Scene_Map
  427. #==============================================================================
  428. class Scene_Map
  429.   alias ewc_update update
  430.   def update
  431.     ewc_update
  432.     Smomo::Calendar.i_look_into_the_sky_as_time_passes_by
  433.   end
  434.   alias ewc_post_transfer post_transfer
  435.   def post_transfer
  436.     Smomo::Calendar.change_tone(true)
  437.     ewc_post_transfer
  438.   end
  439. end
  440. #==============================================================================
  441. # ** DataManager
  442. #==============================================================================
  443. class << DataManager
  444.   alias ewc_setup_new_game setup_new_game
  445.   def setup_new_game
  446.     ewc_setup_new_game
  447.     Smomo::Calendar.ini
  448.   end
  449.   alias ewc_make_save_contents make_save_contents
  450.   def make_save_contents
  451.     contents = ewc_make_save_contents
  452.     contents[:mocalendar] = Smomo::Calendar.data
  453.     contents
  454.   end
  455.   alias ewc_extract_save_contents extract_save_contents
  456.   def extract_save_contents contents
  457.     ewc_extract_save_contents contents
  458.     Smomo::Calendar.data = contents[:mocalendar]
  459.   end
  460. end

  461. else # if $smomo
  462.   msgbox "请不要重复加载此脚本 : )\n【虚拟日历】"
  463. end
  464. #==============================================================================#
  465. #=====                        =================================================#
  466.             "脚 本 尾"
  467. #=====                        =================================================#
  468. #==============================================================================#
复制代码

评分

参与人数 2+2 收起 理由
2231340752 + 1
zyzzyzzyzzyz + 1 精品文章

查看全部评分

Lv3.寻梦者

梦石
0
星屑
1083
在线时间
140 小时
注册时间
2019-5-12
帖子
57
2
发表于 2019-7-22 15:46:21 | 只看该作者
楼主是想做物品而不是脚本发布吧?设置一个物品和x号公共事件,在物品的使用效果里添加x号公共事件,在X号公共事件里添加呼叫脚本,呼叫脚本请看主楼脚本17~26行。大概是这样
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
132
在线时间
11 小时
注册时间
2019-7-5
帖子
7
3
 楼主| 发表于 2019-7-23 09:29:55 | 只看该作者
真の玛娜君 发表于 2019-7-22 15:46
楼主是想做物品而不是脚本发布吧?设置一个物品和x号公共事件,在物品的使用效果里添加x号公共事件,在X号公共 ...

我试过,一直出错......
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1083
在线时间
140 小时
注册时间
2019-5-12
帖子
57
4
发表于 2019-7-23 12:46:32 | 只看该作者
王也从心 发表于 2019-7-23 09:29
我试过,一直出错......

这个我只能让它一直开着,停下时间也会停止...时间过的还很快...
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-28 07:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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