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

Project1

 找回密码
 注册会员
搜索
123
返回列表 发新帖
楼主: frantice
打印 上一主题 下一主题

[RM中级讨论] 跟我从头学脚本(教学翻译)(已发布)

 关闭 [复制链接]

Lv1.梦旅人

查无此人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2006-5-8
帖子
1399
21
 楼主| 发表于 2006-7-31 17:03:45 | 显示全部楼层
第十三讲: Scene和Window 专题三


我们继续上一将的内容, 今天开始分析BLOCK3:
BLOCK 3:
1 self.contents.font.color = text_color(6)
2 self.contents.draw_text(250, 0, 50, 32, "Gold:")
3 self.contents.font.color = text_color(0)
4 self.contents.draw_text(305, 0, 100, 32, $game_party.gold.to_s)

我们对前3行都应该不陌生了,现在着重看下第4行.末尾的 to_s 是把前面的$game_party.gold转换为字符串, 这样我们就能把它作为文章显示出来. 所以呢,如果我们把一个包含数值的变量放在前面,那么就会报错"Cannot convert Fixnum into String".

BLOCK4 基本和3一样, 只是用地图ID代替了金钱, 所以我们直接跳过去,看最后一快,update.

BLOCK 5:
1 def update
2 if Graphics.frame_count / Graphics.frame_rate != @total_sec
3 refresh
4 end
5 end
6 end
这里我们定义了update方法. 我们会发现, 这种方法不在window内使用, 而是在scene里使用,它更新已存在的窗口, 因为我们在scene 里让它更新.不需要update 的窗口没有任何update 方法, 在后面的Scene 里我们会有更好的了解.
我们现在看第2行.它是什么意思呢? 它是个if 语句, != 代表”不等于”,那么这里的if 就是当时间发生变化的时候, 就刷新. 这样, 新的时间就出来了.

好了,这么一个窗口就做好了, 我们来做第2个窗口, 就是左边显示人物名字和职业的那栏(见示意图)在原先的Window_1下面添加Window_2.
代码:
  1. class Window_2 < Window_Base
  2.   #BLOCK 1
  3.   def initialize
  4.     super(0, 0, 200,380)
  5.     self.contents = Bitmap.new(width-32, height-32)
  6.     self.contents.font.name = "黑体"   
  7.     self.contents.font.size = 20
  8.     #BLOCK 2
  9.     for i in 0...$game_party.actors.size
  10.       x = 0
  11.       y = i * 90
  12.       actor = $game_party.actors[i]
  13.       self.contents.font.color = text_color(6)
  14.       self.contents.draw_text(x, y, 200, 32, actor.name)
  15.       self.contents.font.color = text_color(4)
  16.       self.contents.draw_text(x, y+32, 200, 32, actor.class_name)
  17.     end
  18.   end
  19. end

复制代码

这里我们继续给它分成2块.
BLOCK1 和前面的一样,不多解释了,
BLOCK2
第一行:这是个for… loop语句. .size 是ruby的一个命令,用来知道一个数组,或者一个字符串的大小. $game_party.actors就是一个数组变量, 它包含了当前队伍中的人物. 要知道的是数组的编号是从0开始, 而不是从1 开始的.也就是说, 你队伍中的第一个人的ID不是1, 而是0 . 所以呢,这里的for…loop就从0开始, 到当前队伍总人数为止.(3个点, 不包括这个数) 那为什么不能包括最后一个数呢? 假设有4个人的队伍, 那么i 的值就应该是0, 1, 2, 3. 也就是for i in 0…4 ,明白了吗? 4是人物数量, 但是不能算进去.
第二,三行 因为我们还在loop的循环中, 所以我们这里的计算并不是一次完成的. x=0, 就创建了一个局部变量,值为0,  y = i * 90,也创建了一个局部变量, 值应该是为0, 90, 180, 270.
第四行;  这行是来节省空间的, 并不是必须的一行.但是它很管用, 因为它使下面几行变得更容易理解.看看它是怎么工作的吧:
首先它创建了一个局部变量叫actor, 让它为$game_party.actors[ i ].
--> 然后呢,下面几行中,我们就能用actor.name 的表达来代替$game_party.actors[ID].name , 是不是很方便呢?
第六行:  因为有了第四行,我们这里的表达也清爽多了^0^
第八行:  和第六行类似,除了y 坐标..我们用 y+32 因为我们需要在角色的名字下面显示他的职业(要记住y 值越大显示得就越下面哦) 之所以是32是因为我们什么地方都是32的高度,而且这样也很合适.



第十四讲: Scene和Window 专题四


还有最后一个window ^0^, 就是右边那个显示人名, 等级, HPSP, 以及经验的那部分.新建个脚本Window_3
代码:
  1. class Window_3 < Window_Base
  2.   #BLOCK 1
  3.   def initialize
  4.     super(0, 0, 440,380)
  5.     self.contents = Bitmap.new(width-32, height-32)
  6.     self.contents.font.name = "黑体"   
  7.     self.contents.font.size = 20
  8.     #BLOCK 2
  9.     for i in 0...$game_party.actors.size
  10.       x = 0
  11.       y = i * 150
  12.       if i >= 2
  13.         x=250
  14.         y-=300
  15.       end      
  16.       actor = $game_party.actors[i]
  17.       self.contents.font.color = text_color(6)
  18.       self.contents.draw_text(x, y, 200, 32, actor.name)
  19.       offset_x=contents.text_size(actor.name).width+10
  20.       self.contents.font.color = text_color(4)
  21.       self.contents.draw_text(x+offset_x, y, 200, 32, "Lv: " + actor.level.to_s)
  22.       draw_actor_hp(actor, x, y+32)
  23.       draw_actor_sp(actor, x, y+64)
  24.       draw_actor_exp(actor, x, y+96)
  25.     end
  26.   end
  27. end
  28. BLOCK1  不说了, 大家应该都很熟悉了
  29. BLOCK2
  30. 1 for i in 0...$game_party.actors.size
  31. 2 x = 0
  32. 3 y = i * 150
  33. 4 if i >= 2
  34. 5 x=250
  35. 6 y-=300
  36. 7 end
  37. 8 actor = $game_party.actors[ i]
  38. 9 self.contents.font.color = text_color(6)
  39. 10 self.contents.draw_text(x, y, 200, 32, actor.name)
  40. 11 offset_x=contents.text_size(actor.name).width+10
  41. 12 self.contents.font.color = text_color(4)
  42. 13 self.contents.draw_text(x+offset_x, y, 200, 32, "Lv: " + actor.level.to_s)
  43. 14 draw_actor_hp(actor, x, y+32)
  44. 15 draw_actor_sp(actor, x, y+64)
  45. 16 draw_actor_exp(actor, x, y+96)
  46. 17 end
  47. 18 end
  48. 19 end
复制代码

第四-六行 为什么要多出这个呢?因为我们队伍中的队员不一定是只有2个的,当超过2个时, 我们的界面是把多出来的都给放到右边的, 所以4名队员的坐标应该分别是 (0, 0) , (0, 150), (250, 0), (250, 150 )
第十一行: 这里我们创建了一个新的局部变量叫"offset_x",它的值为角色名字的宽度+10 (留出一点空间) 这个干吗用呢?我们描绘角色的等级水平时用的. 因为我们要Level 描绘在角色名字的右边, 而角色名字又不是统一长度, 所以我们必须要用一个变量来确定level 文字的x 坐标. contents.text_size(actor.name).width 是一个命令,这样我们就能知道这个东西的长度了.我们可以用height替换width 来获得它的宽度.
第十三行: 这个是描绘角色等级水平的地方.我们看到了,它给已存在的x坐标增加了"offset_x" 的值..这样, level 就一直在角色名字的右边了^0^.. 还没忘记.to_s 吧.. 等级是一个integer (抽象的整数类), 我们必须把它转换为字符串.
第十四行: 这个draw_actor_hp哪来的? draw_actor_hp 事实上是一个方法名,(不是变量哦)i因为它后面的括号里有argument. 那么这个方法是哪里定义的呢?.父类 Window_Base 里咯.好,我们到它的父类里找,找到如下:
  def draw_actor_hp(actor, x, y, width = 144)
    # 描绘字符串 "HP"
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, 32, 32, $data_system.words.hp)
    # 计算描绘 MaxHP 所需的空间
    if width - 32 >= 108
      hp_x = x + width - 108
      flag = true
    elsif width - 32 >= 48
      hp_x = x + width - 48
      flag = false
    end
    # 描绘 HP
    self.contents.font.color = actor.hp == 0 ? knockout_color :
      actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color
    self.contents.draw_text(hp_x, y, 48, 32, actor.hp.to_s, 2)
    # 描绘 MaxHP
    if flag
      self.contents.font.color = normal_color
      self.contents.draw_text(hp_x + 48, y, 12, 32, "/", 1)
      self.contents.draw_text(hp_x + 60, y, 48, 32, actor.maxhp.to_s)
    end
  end
就是这里了^0^ . 我们先不管它父类怎么定义, 反正我们的3个window是都建立好了,接下来就是创建我们神奇的scene了^0^

KRKR + NS 学习中..........
回复 支持 反对

使用道具 举报

Lv1.梦旅人

查无此人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2006-5-8
帖子
1399
22
 楼主| 发表于 2006-7-31 17:06:09 | 显示全部楼层
以下引用OCTSJimmy于2006-7-29 16:38:36的发言:

跟我从头学脚本(教学翻译)的CHM文件已经做好了,请F过目,撒花……

谢谢……

点此下载


[本贴由作者于 2006-7-29 17:13:10 最后编辑]



首先,文件中有乱码。。。
然后,我觉得,还是不要作成CHM比较好。
我很敬佩Dubealex,所以在对他的教学做翻译的基础上不愿意把它做为其他任何形式的文件。



KRKR + NS 学习中..........
回复 支持 反对

使用道具 举报

Lv1.梦旅人

查无此人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2006-5-8
帖子
1399
23
 楼主| 发表于 2006-8-2 17:10:23 | 显示全部楼层
撤回

回复 支持 反对

使用道具 举报

Lv1.梦旅人

查无此人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2006-5-8
帖子
1399
24
 楼主| 发表于 2006-10-18 06:52:31 | 显示全部楼层
挖坟来了.....{/gg}

补充完第16-20讲, scene和选择窗口的创建.....
是翻译原稿, word文档, 配有精美插图{/cy}

上已经全部发贴在前面了.
http://rpg.blue/upload_program/files/上.doc

中已经包括了第9讲开始到17讲
http://rpg.blue/upload_program/files/中.doc

下是18-20。比较简略, 注意理解。
http://rpg.blue/upload_program/files/下.doc


另外补上战斗系统讲学.....{/gg},这个战斗教学主要讲的是算法。。
http://rpg.blue/upload_program/files/战斗教学.doc
RGSS游戏系统术语列表(比之前那个Near的完整多了)
http://rpg.blue/upload_program/files/RGSSreference--1.doc
http://rpg.blue/upload_program/files/RGSSreference--2.doc

最后的是事件版SLG,变量的超级运用  
汉化版因为脚本地方有些失误所以没有全部完成, 这里提供英文原版. 如果执意要汉化过的工程请留言.
原工程: 操作: 战斗中按B查看行动力AP和敌人数, 按Z地图上攻击.
http://rpg.blue/upload_program/files/LnSmiTactcl.rar
脚本部分修改不完整参照(不要代替工程中的脚本, 因为没有完整地找出所有改动地方, 请新建工程查看)
http://rpg.blue/upload_program/files/Scripts中文.rar
KRKR + NS 学习中..........
回复 支持 反对

使用道具 举报

Lv1.梦旅人

查无此人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2006-5-8
帖子
1399
25
 楼主| 发表于 2007-2-24 19:41:34 | 显示全部楼层
下划线加错地方{/gg}, 那个不是中文范例, 因为是用事件做的, 脚本部分的修改在原工程中没有任何标记. 所以我对照了下把脚本中修改过的地方做了标记, 就是最后下载那个.
KRKR + NS 学习中..........
回复 支持 反对

使用道具 举报

Lv1.梦旅人

查无此人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2006-5-8
帖子
1399
26
 楼主| 发表于 2007-2-24 23:26:20 | 显示全部楼层
不用验货了, 至于"范例",我是因为整理电脑把没发过的东西都发上来罢了, 和教学没关系.
话说....那个电子书是怎么做的啊.用啥软件的不......(鸡蛋鸡蛋鸡蛋...{/gg})
KRKR + NS 学习中..........
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-4 17:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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