作者共發了1篇帖子。 內容轉換:不轉換▼
 
點擊 回復
398 0
【教程】跟我从头学脚本(十三)
高級弟子 五級
1樓 發表于:2011-2-10 23:46
转载自:www.66rpg.com            

原作者:Dubealex             

        Near Fantastica(特别讲)            

主讲人(翻译):frantice            
电子书制作:小湖  


第十三讲: 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.
代码:

class Window_2 < Window_Base 
 #BLOCK 1 
 def initialize 
   super(0, 0, 200,380) 
   self.contents = Bitmap.new(width-32, height-32) 
   self.contents.font.name = "黑体"   
   self.contents.font.size = 20 
   #BLOCK 2 
   for i in 0...$game_party.actors.size 
     x = 0 
     y = i * 90 
     actor = $game_party.actors[i] 
     self.contents.font.color = text_color(6) 
     self.contents.draw_text(x, y, 200, 32, actor.name) 
     self.contents.font.color = text_color(4) 
     self.contents.draw_text(x, y+32, 200, 32, actor.class_name) 
   end 
 end 
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的高度,而且这样也很合适.

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:398 回複數:0
評論數: ?
作者:蓝晶の骑士
最後回復:蓝晶の骑士
最後回復時間:2011-2-10 23:46
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。