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

Project1

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

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

 关闭 [复制链接]

Lv1.梦旅人

查无此人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2006-5-8
帖子
1399
41
 楼主| 发表于 2006-7-28 18:16:13 | 只看该作者
以下引用link006007于2006-7-28 10:12:27的发言:

那个应该要先扯的啊...既然都到窗口了,那就顺理成章的讲sprite或scence吧.要循序渐进,不要拐啊拐的... ...
唉,你是楼主你决定,无所谓啊~~~~~无所谓啊~~~~~


我是楼主又怎么样,人家作者都不写了啊…………
{/ll}{/ll}{/ll}{/ll}{/ll}{/ll}

再说了,不是有这个:
以下引用柳柳于2006-7-25 14:47:55的发言:

正好和我签名暗合(写个从中级开始的教学,从入门开始的这里有了)


吗………………{/hx}{/hx}{/hx}

我最近又对对话框和血条比较感兴趣……对菜单没兴趣了…………
KRKR + NS 学习中..........
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

42
发表于 2006-7-28 18:24:38 | 只看该作者
以下引用frantice于2006-7-28 10:16:13的发言:
我是楼主又怎么样,人家作者都不写了啊…………

汗...sprite无望
再说了,不是有这个:

以下引用柳柳于2006-7-25 14:47:55的发言:

正好和我签名暗合(写个从中级开始的教学,从入门开始的这里有了)

这个消息放出有点年头了

在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

查无此人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2006-5-8
帖子
1399
43
 楼主| 发表于 2006-7-28 23:10:57 | 只看该作者
第十二讲: Scene和Window 专题二


我们讲到哪了?嗯嗯,我们已经建立了一个空空的窗口,现在需要再加入三个新的窗口.
窗口1
第一个窗口应该是在顶端,显示游戏时间,金钱和地图ID.(见示意图)这个窗口是最简单的.我们在脚本编辑器里把三个显示的scene都放在一页便于修改.但是作为教程,我们还是各自建立一个窗口比较好.所以呢,我们先插入新的空脚本,名字就叫Window_1
(牢记: 我们必须在超级类的下面插入自己的脚本- 这就是为什么我们一直要把脚本插在紧贴MAIN前的原因.)
脚本:
class Window_1 < Window_Base
  #BLOCK 1
  def initialize
    super(0, 0, 640,100)
    self.contents = Bitmap.new(width-32, height-32)
    self.contents.font.name = "黑体"   
    self.contents.font.size = 20
    refresh
  end
  #BLOCK 2
  def refresh
    self.contents.clear
    self.contents.font.color = text_color(6)
    self.contents.draw_text(0, 0, 100, 32, "游戏时间:")
    #显示游戏时间 (从 Window_PlayTime中Copy来)
    @total_sec = Graphics.frame_count / Graphics.frame_rate
    hour = @total_sec / 60 / 60
    min = @total_sec / 60 % 60
    sec = @total_sec % 60
    text = sprintf("%02d:%02d:%02d", hour, min, sec)
    self.contents.font.color = normal_color
    self.contents.draw_text(100, 0, 120, 32, text)
    # 结束显示游戏时间的编码
    #BLOCK 3
    self.contents.font.color = text_color(6)
    self.contents.draw_text(250, 0, 50, 32, "金钱:")
    self.contents.font.color = text_color(0)
    self.contents.draw_text(305, 0, 100, 32, $game_party.gold.to_s)
    #BLOCK 4
    self.contents.font.color = text_color(6)
    self.contents.draw_text(400, 0, 100, 32, "地图 ID:")
    self.contents.font.color = text_color(0)
    self.contents.draw_text(480, 0, 100, 32, $game_map.map_id.to_s)
  end
  #BLOCK 5
  def update
    if Graphics.frame_count / Graphics.frame_rate != @total_sec
      refresh
    end
  end
end
为了便于教学,我分开了5个 blocks, 这样一行一行讲下来:^0^
BLOCK 1:
1 def initialize
2 super(0, 0, 640,100)
3 self.contents = Bitmap.new(width-32, height-32)
4 self.contents.font.name = "黑体"
5 self.contents.font.size =20
6 refresh
7 end
很熟悉吧,对,就是我们上一讲里学过的.不过多了一个refresh, 也就是刷新. 当然了, 单单一个refresh 是不行的, 还没定义过呢~!
BLOCK 2:
1 def refresh
2 self.contents.clear
3 self.contents.font.color = text_color(6)
4 self.contents.draw_text(0, 0, 100, 32, "游戏时间:")
5 #显示游戏时间 (从 Window_PlayTime里copy而来)
6 @total_sec = Graphics.frame_count / Graphics.frame_rate
7 hour = @total_sec / 60 / 60
8 min = @total_sec / 60 % 60
9 sec = @total_sec % 60
10 text = sprintf("%02d:%02d:%02d", hour, min, sec)
11 self.contents.font.color = normal_color
12 self.contents.draw_text(100, 0, 120, 32, text)
13 #结束编写显示游戏时间
1-2行   我们上面说了refresh还没定义过, 所以这里就给它定义了. 它都干些什么呢?我们看到,第一件事情就是把窗口的内容给清空了,那为什么我们要先把它给清空呢?..那是因为我们要在后面的scene里对这个的窗口的内容进行刷新来显示游戏时间, 我们不需要这个文章显示一遍又一遍,所以把它清理干净会比较清爽^0^ .
3-4行   他们是显示”游戏时间”这4个字的,上一课也讲过. 那么self.contents.font.color = text_color(6) 是干什么的?它是描绘文章的字体颜色的..括号里的数字6显示的颜色是在Window_Base (父类) 中定义的.
6行  这里创建了一个新变量叫@total_sec, 并让它的值等于游戏的时间.怎么计算的呢?我们应该知道FPS吧, 它是frame per seconds的缩写, 意思就是每秒的桢数.游戏时间就等于总共的桢数/每秒的桢数.比如说
- 游戏已运行了12450 桢
- 游戏的 FPS (每秒的桢数) 是 30.
- 那么12450/30=415 --> 415 秒就是游戏时间.
7行  知道总秒数了,可是总不能就那么当游戏时间让人看吧=.=, 还得转换为几小时几分几秒.这行就是计算小时的.RMXP是没有小数的,所以当不满1小时的时候就为0
8行  看到这里大家会不解了, “ % “是什么东西?? 为了方便起见,我们就把它理解为余数,比如说17%3, 答案应该是2, 60/60=1, 那么60%60=0. (415 / 60) % 60 = 6.916 --> 6 分 (RMXP中不显示小数)
10 行 又是一个难懂的表达, sprintf("%02d:%02d:%02d", hour, min, sec) .首先要解释什么是sprintf, Ruby 的 sprintf 格式与 C 语言的 sprintf(3) 基本相同. 但还是有些差别, 比如它没有如 short 或 long 等针对 C 特有类型的修饰符, 它包含 2 进制数的指示符, 它不支持 sprintf 的方言式的语法. 这是引用RMXP帮助的说法, 那里解释得比较详细. 我这里就用图来说明吧~如果不懂没关系的, 我们只要知道是什么东西就知道了^0^


11行和12行就不详细说了, 好了,今天要学的就到这里了~
KRKR + NS 学习中..........
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
1 小时
注册时间
2006-7-29
帖子
25
44
发表于 2006-7-29 05:30:46 | 只看该作者
真糟糕,我来早了,已经没有了~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

匿·蹤

梦石
0
星屑
65
在线时间
99 小时
注册时间
2006-3-19
帖子
456
45
发表于 2006-7-29 23:38:19 | 只看该作者
我准备制作一个
《跟我从头学脚本(教学翻译)》的CHM……不知是否可行?……
卐忍 → 解忍 → 元忍 → 隐忍 → 卍忍 → 匿踪(最终)
完全退步到了卐忍阶段
回复 支持 反对

使用道具 举报

Lv1.梦旅人

匿·蹤

梦石
0
星屑
65
在线时间
99 小时
注册时间
2006-3-19
帖子
456
46
发表于 2006-7-30 00:38:36 | 只看该作者
跟我从头学脚本(教学翻译)的CHM文件已经做好了,请F过目,撒花……

谢谢……

点此下载(链接已过期)
卐忍 → 解忍 → 元忍 → 隐忍 → 卍忍 → 匿踪(最终)
完全退步到了卐忍阶段
回复 支持 反对

使用道具 举报

Lv1.梦旅人

查无此人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2006-5-8
帖子
1399
47
 楼主| 发表于 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
48
 楼主| 发表于 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
在线时间
82 小时
注册时间
2006-6-20
帖子
1086
49
发表于 2006-8-1 06:13:41 | 只看该作者
放在自己参与的主题中,以后好找....
要低调。。。低调。。。点我进入小天的作坊近期关注http://www.lothings.com/
回复 支持 反对

使用道具 举报

Lv1.梦旅人

匿·蹤

梦石
0
星屑
65
在线时间
99 小时
注册时间
2006-3-19
帖子
456
50
发表于 2006-8-1 18:56:12 | 只看该作者
以下引用frantice于2006-7-31 9:06:09的发言:

以下引用OCTSJimmy于2006-7-29 16:38:36的发言:

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

谢谢……

点此下载

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

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

[本贴由作者于 2006-7-31 9:06:43 最后编辑]


首先我要说下……抱歉……我没有看到乱码啊……{/fd}……Orz……

其次,为了尊重尊敬的女F我这次只是把所有的文章做成了单独的HTML,并且打了个包,这样子要找也比较方便……不是吗?……

难道你想在一篇有无数回复的帖子里找某个字节?……

嗯……还是征求女F的意见……如果不满意的我立马取掉……

点击下载


原CHM文件链接已取掉,恳请版主把文件删除,谢谢……
卐忍 → 解忍 → 元忍 → 隐忍 → 卍忍 → 匿踪(最终)
完全退步到了卐忍阶段
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-24 09:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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