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

Project1

 找回密码
 注册会员
搜索
楼主: 「旅」
打印 上一主题 下一主题

[讨论] 脚本学习~提问教程贴~~(更新:2月11日)

 关闭 [复制链接]

Lv1.梦旅人

虱子

梦石
0
星屑
121
在线时间
1782 小时
注册时间
2010-6-19
帖子
3597
11
发表于 2011-2-9 18:48:50 | 只看该作者
回复 okasssss 的帖子

清空,因为在Scene_Save和Scene_Load都没有存储/读取该变量的脚本

http://rpg.blue/thread-175056-1-2.html
PVZ型塔防物一个
http://rpg.blue/thread-155199-1-2.html
RMXP技术讨论区手动认可帖,得到答案请认可
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
32 小时
注册时间
2010-7-7
帖子
18
12
发表于 2011-2-9 18:58:14 | 只看该作者
回复 Wind2010 的帖子

谢谢,我还要认真学习.........
回复 支持 反对

使用道具 举报

Lv3.寻梦者

宛若

梦石
0
星屑
1568
在线时间
526 小时
注册时间
2007-8-19
帖子
1493

极短24参与开拓者

13
发表于 2011-2-9 20:33:25 | 只看该作者
回复 okasssss 的帖子

想要不清空有两个方法
1、将其变成Game_System等类的实例变量
2、将其的读取与保存写入Scene_Load与Scene_Save
[url=http://rpg.blue/thread-219730-1-1.html]http://unhero.sinaapp.com/wi.php[/url]
[color=Red]如你所见这是个死坑,没错这就是打我的脸用的[/color]
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1530
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

14
 楼主| 发表于 2011-2-10 08:58:38 | 只看该作者
本帖最后由 「旅」 于 2011-2-10 09:08 编辑

回复 okasssss 的帖子

恩这个提问很赞哦~~~问得很好,是学习脚本必须知道的一个重要内容哟~~~
喵那个,在RGSS里其实是有两种方式可以存储、读取数据的~~~我们先来认识较简单的一种吧~~~
  1. @time_m = load_data(filename)
  2. save_data(@time_m, filename)
复制代码
如上~第一行是"读取"了filename的数据后赋值到@time_m变量里,而第二行则是将@time_m的数据"写入"到filename里面~

filename是一个字符串哦~~~它的内容是某个文件的路径~~~例如:
  1. @time_m = load_data("Data/Actors.rxdata")
  2. p @time_m
复制代码
这时你测试时弹出的内容其实就是"Data/Actors.rxdata"这个文件的数据了(角色的数据库)~~~
  1. save_data("你好吗?", "RMXP.rxdata")
复制代码
还有储存操作~~~如果在路径上没有那个文件的话,他就会自己生成一个哦~现在你可以看看游戏目录下多出什么了~~


好的,接下来讲第二种储存和读取的方法~~~你可以打开Scene_Save和Scene_Load的73~82行看看~~~
  1.     # 储存
  2.     Marshal.dump($game_system, file)
  3.     Marshal.dump($game_switches, file)
  4.     Marshal.dump($game_variables, file)
  5.     Marshal.dump($game_self_switches, file)
  6.     Marshal.dump($game_screen, file)
  7.     Marshal.dump($game_actors, file)
  8.     Marshal.dump($game_party, file)
  9.     Marshal.dump($game_troop, file)
  10.     Marshal.dump($game_map, file)
  11.     Marshal.dump($game_player, file)
复制代码

  1.     # 读取
  2.     $game_system = Marshal.load(file)
  3.     $game_switches = Marshal.load(file)
  4.     $game_variables = Marshal.load(file)
  5.     $game_self_switches = Marshal.load(file)
  6.     $game_screen = Marshal.load(file)
  7.     $game_actors = Marshal.load(file)
  8.     $game_party = Marshal.load(file)
  9.     $game_troop = Marshal.load(file)
  10.     $game_map = Marshal.load(file)
  11.     $game_player = Marshal.load(file)
复制代码
如上~~~知道为什么这个东西和之前讲的那种有区别吗?应该很容易就可以判断出来哟~~~
恩没错,这个东西的特点在于它是多个数据的~~~它可以一次性把很多的数据放在同一个文件哦~~~

但是为什么把它放在新建页面测试时出现错误了呢?嘿嘿大家可以搜索一下write_save_data和read_save_data哟~~~
搜索的第二个结果就是我们上面的那些内容~~~而第一个内容,如下:
  1.     file = File.open(filename, "rb")
  2.     read_save_data(file)
  3.     file.close
复制代码
  1.     file = File.open(filename, "wb")
  2.     write_save_data(file)
  3.     file.close
复制代码
这个就是原因了~~~固定格式之一哦~~~必须在首尾写上那两个东西~~~
另外读取的话,File.open的第2个参数是"rb"。写入则是"wb"~~是和write和read对应的~~~

可能同学们就会奇怪了,为什么需要这么麻烦呢……喵我来告诉大家~~
因为这个是多个数据写入或读取于一个文件,为了确保不会出现意外就要这样哦~(如果重新使用等,就会很乱了)

另外要注意的是,我们存入什么数据的顺序,和读取的顺序一定要一定哦~~~写入第一个是$game_system的话,那么读取第一个也要是$game_system~~不然数据就会全都乱套了~~~

最后呢,继续解答okasssss酱的疑问~~~喵那个@time_m的话,最好就是放在一个数据类里哦~~~不然如果每个变量都需要保存、读取的话,那样代码会很长,而且效率会很低的~~~
那么什么是数据类呢?其实就是脚本最前端的Game_Temp、Game_System、Game_Xxxx这些类……
他们的好处在于,保存或读取时可以一次性把类里的实变量都一同保存、读取~~~很方便的~~~~
p.s他们实例的变量是$game_temp、$game_system、$game_xxx。

喵示范一下~~~首先把@time_m放入Game_System(我个人建议这个数据类)的initialize里初始化。

  1. @time_m = 0
复制代码
p.s如果不初始化的话,很容易发生错误的~~~

然后模仿上面的attr_accessor :xxxx...写一个吧~~~(如果不知道这个的话,可以看我上篇解答的附加内容2)

  1. attr_accessor :time_m
复制代码
恩就这样,然后就没有了~~~(啥居然没有了!?)恩对的哦~~~

接下来我们进入游戏测试吧~~~
p.s因为要新建游戏或读取游戏后Game_System才有在$game_system生成,所以我们到游戏地图上的事件里测试~~~
  1. p $game_system.time_m
  2. $game_system.time_m += 100
  3. p $game_system.time_m
复制代码
喵最后测试成功~~~

好了终于废话完了~~语言表达不是很好的说,各位看的时候辛苦了><

点评

p.s为什么要放在Game_System里呢?因为默认已经处理好他的储存和读取了哦~~所以可以直接拿来利用~~~  发表于 2011-2-10 09:00
回复 支持 反对

使用道具 举报

Lv1.梦旅人

虱子

梦石
0
星屑
121
在线时间
1782 小时
注册时间
2010-6-19
帖子
3597
15
发表于 2011-2-10 09:05:05 | 只看该作者
回复 「旅」 的帖子

学习了,原来还可以这样储存...我都是直接在Scene_Load和Scene_Save加入存储内容的0 0

点评

喵其实第1个是偷偷用了第2个的内容的~~不过用起来很方便就是了~~~  发表于 2011-2-10 09:09

http://rpg.blue/thread-175056-1-2.html
PVZ型塔防物一个
http://rpg.blue/thread-155199-1-2.html
RMXP技术讨论区手动认可帖,得到答案请认可
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1055 小时
注册时间
2010-6-17
帖子
85
16
发表于 2011-2-10 12:40:56 | 只看该作者
大家好像都是问一些很难得问题啊- -
我问一个很菜的问题,如何判断角色的攻击命中了敌人呢?
if self.is_a?(Game_Actor) and self.damage>0
我只会写上面那个自己被命中的

点评

Game_Actor改成Game_Enemy  发表于 2011-2-10 14:34
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1530
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

17
 楼主| 发表于 2011-2-10 18:04:47 | 只看该作者
本帖最后由 「旅」 于 2011-2-10 18:05 编辑

回复 clannad 的帖子

这个问题嘛,根据情况不同有很多种选择的说~~~
  1.     $game_party.actors[队伍角色顺序].damage_pop
  2.     $game_troop.enemies[队伍敌人顺序].damage_pop
  3.     $game_actors[角色id].damage_pop
复制代码
以上是我找到的几种最简单的~~~
p.s第3个其实和第1个一样,不过他们的编号不同,一个是队伍里的编号,一个是数据库里的编号~~具体为什么是这样嘛,等我明天有空再讲哦~~~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1055 小时
注册时间
2010-6-17
帖子
85
18
发表于 2011-2-10 18:24:50 | 只看该作者
回复 「旅」 的帖子

。。。。。.damage.pop是什么意思啊?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

虱子

梦石
0
星屑
121
在线时间
1782 小时
注册时间
2010-6-19
帖子
3597
19
发表于 2011-2-10 18:32:27 | 只看该作者
回复 clannad 的帖子

显示伤害的开关,设置了damage后再把damage.pop打开就可以显示伤害

PS:如果没有命中damage是"Miss" 注意是字符串

点评

好的,学习了  发表于 2011-2-10 18:48

http://rpg.blue/thread-175056-1-2.html
PVZ型塔防物一个
http://rpg.blue/thread-155199-1-2.html
RMXP技术讨论区手动认可帖,得到答案请认可
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1530
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

20
 楼主| 发表于 2011-2-11 09:18:56 | 只看该作者
本帖最后由 「旅」 于 2011-2-11 09:28 编辑

也许大家接触过@command_window.opacity = 120这个东西~~给新人讲解一下好了~~~
喵告诉大家哦~~其实.opacity这个东西并非真正的变量哟~~注意他有一个点~~而这个格式就是操作方法的~~
所以其实它是一个方法来着~~
(p.s其实这个内容在脚本入门里有,不过他讲得很模糊呢~~)



  1. class Person
  2.   def name
  3.     return @name
  4.   end
  5.   def name=(name)
  6.     @name = name
  7.   end
  8. end
复制代码
这个代码就是脚本入门里的~~~首先是return的用法~~~return可以将一个数值运送到调用它的地方~~
例如——
a = Person.new
p a.name
这时就会出现一个nil的提醒~~~因为@name根本没有初始化~~所以是nil(空)哦~~~
(那么我们试试初始化吧~~~有些同学也许注意到了,在默认脚本里类的开头常可以看到initialize(中文就是初始化)~~那个东西其实在a = Person.new时就会调用到哦~~也就是说只要.new就会调用initialize。p.s这个情况是唯一的哟~~)

各位加上这句~~~
  1.   def initialize
  2.     @name = "阿尔南瓜"
  3.   end
复制代码
然后再使用p a.name~~我们发现真的把@name给运送来了~~撒花~~
(p.s大家要注意运送的功劳都是return的哦~~def name这个name可以改成别的,因为他只是一个方法名~~但如果我们改为"return @other"的话,就不会显示"阿尔南瓜"了~~~)
所以return的好处在于,一般情况下,我们是不能读取类里的实变量的~可是有了这个后我们可以突破界限了~

然后还有def name=(name)这个~~也就是我们最开始用到的~~他附带了一个参数~~
这样的话,我们就可以从外界写入一个数值,然后改变类里面的实变量了~~~这两样可以简单理解为"读取"和"写入"~~~
(p.s大家要记住这两样东西~~真正写起脚本的话,这个是无处不在的哟~~~)

最后介绍一下attr_reader、attr_writer、attr_accessor~~~
其实更简单哟~~~他就是等于简化了代码~~~例如我们写入attr_accessor :name
就等于自动完成了下面这两句~~~

  1.   def name
  2.     return @name
  3.   end
  4.   def name=(name)
  5.     @name = name
  6.   end
复制代码
而attr_reader(读取)就是只有前一句~~attr_writer(写入)是只有后一句~~~
喵现在大家应该大致可以了解默认脚本里Game_Xxxxx那些东西了吧~~~

点评

最后一句return的话可以省略return  发表于 2011-2-11 09:28
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-25 00:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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