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

Project1

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

如何制作一次性存档?(只可读1次)

 关闭 [复制链接]

Lv3.寻梦者 (版主)

  /) /)<

梦石
0
星屑
4212
在线时间
4890 小时
注册时间
2009-2-16
帖子
8434

开拓者短篇七成年组季军

跳转到指定楼层
1
发表于 2009-6-8 06:18:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
RMXP的存档有很多弊端,比如赌博前存,输了再读..打怪开箱前存,出装备就继续,出垃圾就读...
所以想弄一个一次性存档(很多游戏都用这个)
既:随地都可以存档,但是,存后只能读1次,然后该存档消失
当然,默认的存档功能不被磨灭的前提下的另一种功能...

哪位大大能给写个脚本吗?谢谢了~~

Lv4.逐梦者

梦石
0
星屑
6875
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

2
发表于 2009-6-8 06:38:31 | 只看该作者
class Scene_Load < Scene_File
  def on_decision(filename)
    unless FileTest.exist?(filename)
      $game_system.se_play($data_system.buzzer_se)
      return
    end
    $game_system.se_play($data_system.load_se)
    file = File.open(filename, "rb")
    read_save_data(file)
    file.close
    $game_system.bgm_play($game_system.playing_bgm)
    $game_system.bgs_play($game_system.playing_bgs)
    $game_map.update
    $scene = Scene_Map.new
###############################################
    File.delete(filename)
################################################
  end
end

这样的话所有的存档都是一次性的了
不过玩家还是可以存档后在磁盘里复制存档文件
这方法也就防那些大脑迟钝的小白而已- -!
而且要是什么时候别人忘记存档或者突然事情游戏被关闭了的话
就意味着要从头开始- -
{/fd}

另外一种好点的方法就是
在 $scene = nil 和 exit
这2个的时候自动保存存档 记录某些数据
比如时间什么的
在游戏里判断时间来决定要不要让玩家赌博

不过别人还是可以在磁盘里复制

反正单机游戏想控制这方面不大容易- -











你知道得太多了

回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

  /) /)<

梦石
0
星屑
4212
在线时间
4890 小时
注册时间
2009-2-16
帖子
8434

开拓者短篇七成年组季军

3
 楼主| 发表于 2009-6-8 06:42:47 | 只看该作者
囧..有什么方法使一次性存档隐藏?
而且我不想把所有的都变一次性= =
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
3 小时
注册时间
2008-4-22
帖子
13
4
发表于 2009-6-8 09:48:07 | 只看该作者
那尝试切换如何?

比如利用2楼的脚本达到目的后又恢复。这只是猜测性的,我是新手所以不敢确定。
目前处于纯新手阶段,请大家多多指教
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
5
发表于 2009-6-9 13:43:26 | 只看该作者
首先文件是活生生的数据,只要它存在就不可能做到绝对的隐藏,以下方案也只不过防君子不防小人罢了:

1、将文件的隐藏属性打开,这个对于打开了资源管理器“显示隐藏文件”的人无效;

2、将文件放置到诡异的位置,比如系统临时文件夹内什么的;

3、判断文件的创建时间,复制的文件或连同文件的修改时间一同复制,只有这个创建时间变动了,所以根据这个属性来唯一标识文件~

你觉得哪种最好?
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

  /) /)<

梦石
0
星屑
4212
在线时间
4890 小时
注册时间
2009-2-16
帖子
8434

开拓者短篇七成年组季军

6
 楼主| 发表于 2009-6-9 20:06:27 | 只看该作者
第3种太麻烦了..我觉的第2种不错{/se}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
7
发表于 2009-6-9 21:17:36 | 只看该作者
把一次性存档文件放到临时文件夹中,读档后删除一次性存档,并在 Scene_Title 判断一次性存档是否存在
在 RANGE 那里设置需要一次性存档的索引范围(从 0 开始):
  1. #==============================================================================
  2. # ■ Scene_File
  3. #------------------------------------------------------------------------------
  4. #  存档画面及读档画面的超级类。
  5. #==============================================================================

  6. class Scene_File
  7.   RANGE = 0..1
  8.   @@path = " " * 512
  9.   Win32API.new("kernel32", "GetTempPathA", %w%L P%, 'L').call(512, @@path)
  10.   @@path.strip!
  11.   @@path.slice!(-1, 1)
  12.   #--------------------------------------------------------------------------
  13.   # ● 获取临时文件夹路径
  14.   #--------------------------------------------------------------------------
  15.   def self.path
  16.     @@path
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 生成文件名
  20.   #     file_index : 文件名的索引 (0~3)
  21.   #--------------------------------------------------------------------------
  22.   def make_filename(file_index)
  23.     return (RANGE === file_index ? @@path : "") +
  24.       "Save#{file_index + 1}.rxdata"
  25.   end
  26. end


  27. #==============================================================================
  28. # ■ Window_SaveFile
  29. #------------------------------------------------------------------------------
  30. #  显示存档以及读档画面、保存文件的窗口。
  31. #==============================================================================

  32. class Window_SaveFile < Window_Base
  33.   #--------------------------------------------------------------------------
  34.   # ● 初始化对像
  35.   #     file_index : 存档文件的索引 (0~3)
  36.   #     filename   : 文件名
  37.   #--------------------------------------------------------------------------
  38.   def initialize(file_index, filename)
  39.     super(0, 64 + file_index % 4 * 104, 640, 104)
  40.     self.contents = Bitmap.new(width - 32, height - 32)
  41.     @file_index = file_index
  42.     @filename = filename
  43.     @time_stamp = Time.at(0)
  44.     @file_exist = FileTest.exist?(@filename)
  45.     if @file_exist
  46.       file = File.open(@filename, "r")
  47.       @time_stamp = file.mtime
  48.       @characters = Marshal.load(file)
  49.       @frame_count = Marshal.load(file)
  50.       @game_system = Marshal.load(file)
  51.       @game_switches = Marshal.load(file)
  52.       @game_variables = Marshal.load(file)
  53.       @total_sec = @frame_count / Graphics.frame_rate
  54.       file.close
  55.     end
  56.     refresh
  57.     @selected = false
  58.   end
  59. end


  60. #==============================================================================
  61. # ■ Scene_Load
  62. #------------------------------------------------------------------------------
  63. #  处理读档画面的类。
  64. #==============================================================================

  65. class Scene_Load < Scene_File
  66.   alias on_decision_old on_decision if !method_defined? :on_decision_old
  67.   #--------------------------------------------------------------------------
  68.   # ● 确定时的处理
  69.   #--------------------------------------------------------------------------
  70.   def on_decision(filename)
  71.     on_decision_old(filename)
  72.     File.delete(filename) if filename.include?(@@path)
  73.   end
  74. end

  75. #==============================================================================
  76. # ■ Scene_Title
  77. #------------------------------------------------------------------------------
  78. #  处理标题画面的类。
  79. #==============================================================================

  80. class Scene_Title
  81.   #--------------------------------------------------------------------------
  82.   # ● 主处理
  83.   #--------------------------------------------------------------------------
  84.   def main
  85.     # 战斗测试的情况下
  86.     if $BTEST
  87.       battle_test
  88.       return
  89.     end
  90.     # 载入数据库
  91.     $data_actors        = load_data("Data/Actors.rxdata")
  92.     $data_classes       = load_data("Data/Classes.rxdata")
  93.     $data_skills        = load_data("Data/Skills.rxdata")
  94.     $data_items         = load_data("Data/Items.rxdata")
  95.     $data_weapons       = load_data("Data/Weapons.rxdata")
  96.     $data_armors        = load_data("Data/Armors.rxdata")
  97.     $data_enemies       = load_data("Data/Enemies.rxdata")
  98.     $data_troops        = load_data("Data/Troops.rxdata")
  99.     $data_states        = load_data("Data/States.rxdata")
  100.     $data_animations    = load_data("Data/Animations.rxdata")
  101.     $data_tilesets      = load_data("Data/Tilesets.rxdata")
  102.     $data_common_events = load_data("Data/CommonEvents.rxdata")
  103.     $data_system        = load_data("Data/System.rxdata")
  104.     # 生成系统对像
  105.     $game_system = Game_System.new
  106.     # 生成标题图形
  107.     @sprite = Sprite.new
  108.     @sprite.bitmap = RPG::Cache.title($data_system.title_name)
  109.     # 生成命令窗口
  110.     s1 = "新游戏"
  111.     s2 = "继续"
  112.     s3 = "退出"
  113.     @command_window = Window_Command.new(192, [s1, s2, s3])
  114.     @command_window.back_opacity = 160
  115.     @command_window.x = 320 - @command_window.width / 2
  116.     @command_window.y = 288
  117.     # 判定继续的有效性
  118.     # 存档文件一个也不存在的时候也调查
  119.     # 有効为 @continue_enabled 为 true、无效为 false
  120.     @continue_enabled = false
  121.     for i in 0..3
  122.       if FileTest.exist?((Scene_File::RANGE === i ? Scene_File.path : "") +
  123.           "Save#{i+1}.rxdata")
  124.         @continue_enabled = true
  125.       end
  126.     end
  127.     # 继续为有效的情况下、光标停止在继续上
  128.     # 无效的情况下、继续的文字显示为灰色
  129.     if @continue_enabled
  130.       @command_window.index = 1
  131.     else
  132.       @command_window.disable_item(1)
  133.     end
  134.     # 演奏标题 BGM
  135.     $game_system.bgm_play($data_system.title_bgm)
  136.     # 停止演奏 ME、BGS
  137.     Audio.me_stop
  138.     Audio.bgs_stop
  139.     # 执行过渡
  140.     Graphics.transition
  141.     # 主循环
  142.     loop do
  143.       # 刷新游戏画面
  144.       Graphics.update
  145.       # 刷新输入信息
  146.       Input.update
  147.       # 刷新画面
  148.       update
  149.       # 如果画面被切换就中断循环
  150.       if $scene != self
  151.         break
  152.       end
  153.     end
  154.     # 装备过渡
  155.     Graphics.freeze
  156.     # 释放命令窗口
  157.     @command_window.dispose
  158.     # 释放标题图形
  159.     @sprite.bitmap.dispose
  160.     @sprite.dispose
  161.   end
  162. end
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

℃ake

梦石
0
星屑
50
在线时间
8 小时
注册时间
2009-6-6
帖子
787
8
发表于 2009-6-9 21:37:09 | 只看该作者
没用的,人家可以存4次档,赌博前存4次,输了读,然后输了又读,如果输赢的几率是1:1的话,还是没用的。
我爱66RPG,但我讨厌66.
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

9
发表于 2009-6-9 21:46:19 | 只看该作者
记得 系统临时文件夹 里的东西在开机的时候会被清空的吧.

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-16
帖子
450
10
发表于 2009-6-9 21:48:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-13 13:47

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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