Project1

标题: 脚本新手试写失败 想再请教错在哪里 关於增设选单 [打印本页]

作者: 真紅樂章    时间: 2018-3-18 16:03
标题: 脚本新手试写失败 想再请教错在哪里 关於增设选单
因为版主sama建议重开新帖所以重新开

话说身为脚本盲的小紅试着写了个脚本给自己用但是其实自己也不知道自己写了甚麽的说
鉴於之前请教帖得到的提示实在太高端结果小紅压根看不懂所以小紅决定放弃思考
想说尽量用些自己理解范围内的办法尝试解决问题



於是成果如下……
  1. class Scene_scommand < Scene_MenuBase
  2.   #--------------------------------------------------------------------------
  3.   # ● 开始处理
  4.   #--------------------------------------------------------------------------
  5.   def start
  6.     super
  7.     create_scommand_window
  8.     create_status_window
  9.   end
  10.   #--------------------------------------------------------------------------
  11.   # ● 生成指令窗口
  12.   #--------------------------------------------------------------------------
  13.   def create_scommand_window
  14.     @scommand_window = Window_SuCommand.new
  15.     @scommand_window.set_handler(:aaa,     method(:command_aaa))
  16.     @scommand_window.set_handler(:bbb,     method(:command_bbb))
  17.     @scommand_window.set_handler(:ccc,     method(:command_ccc))
  18.     @scommand_window.set_handler(:ddd,     method(:command_ddd))
  19.     @scommand_window.set_handler(:eee,     method(:command_eee))
  20.     @scommand_window.set_handler(:fff,     method(:command_fff))
  21.     @scommand_window.set_handler(:cancel,  method(:return_scene))
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 生成状态窗口
  25.   #--------------------------------------------------------------------------
  26.   def create_status_window
  27.     r = 1
  28.     r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
  29.     r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT)
  30.     case r
  31.     when 1
  32.       @status_window = Window_aaa.new(@actor)
  33.     when 2
  34.       @status_window = Window_bbb.new(@actor)
  35.     when 3
  36.       @status_window = Window_ccc.new(@actor)
  37.     when 4
  38.       @status_window = Window_ddd.new(@actor)
  39.     when 5
  40.       @status_window = Window_eee.new(@actor)
  41.     when 6
  42.       @status_window = Window_fff.new(@actor)
  43.     end
  44.   end

  45.   def command_aaa
  46.     SceneManager.call(Scene_aaa_window)
  47.   end
  48.   def command_bbb
  49.     SceneManager.call(Scene_bbb_window)
  50.   end
  51.   def command_ccc
  52.     SceneManager.call(Scene_ccc_window)
  53.   end
  54.   def command_ddd
  55.     SceneManager.call(Scene_ddd_window)
  56.   end
  57.   def command_eee
  58.     SceneManager.call(Scene_eee_window)
  59.   end
  60.   def command_fff
  61.     SceneManager.call(Scene_fff_window)
  62.   end
  63. end
复制代码


虽然小紅知道这东西已经乱成一团了不过在r = 1那行手动在脚本里改成r = 其他数字有能达成小紅想要的效果喔……
  1.     r = 3
  2.     r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
  3.     r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT)
复制代码


  1.     r = 5
  2.     r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
  3.     r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT)
复制代码


  1.     r = 6
  2.     r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
  3.     r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT)
复制代码



所以小紅只想问一下为甚麽下面利用按键来进行逻辑判断的两行不起效用
  1.     r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
  2.     r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT)
复制代码




另外想问一下异常状态图示用太多已经挤满一行显示不完(十六个以上)的话要如何让它们懂得自动换行下一行继续显示
  1. class Window_Base < Window
  2.   #--------------------------------------------------------------------------
  3.   # ● 绘制强化/弱化状态的图标
  4.   #--------------------------------------------------------------------------
  5.   def draw_actor_icons(actor, x, y, width = 480)
  6.     icons = (actor.state_icons + actor.buff_icons)[0, width / 24]
  7.     icons.each_with_index {|n, i| draw_icon(n, x + 24 * i, y) }
  8.   end
  9. end

  10. class Window_BattleStatus < Window_Selectable
  11.   #--------------------------------------------------------------------------
  12.   # ● 绘制基本区域
  13.   #--------------------------------------------------------------------------
  14.   def draw_basic_area(rect, actor)
  15.     draw_actor_name(actor, rect.x + 0, rect.y, 100)
  16.     draw_actor_icons(actor, rect.x + 0, rect.y + line_height * 1, 384)
  17.   end
  18. end
复制代码


作者: QQ蚊子湯    时间: 2018-3-18 17:09
本帖最后由 QQ蚊子湯 于 2018-3-18 17:13 编辑

回答一下關於icon顯示
請看一下7行
這邊用了一個遍歷方法,逐個繪製圖標
代數i代表項目數
所以我們可以設置如果i大於16時y軸增加,這樣當他繪製第16個狀態就會換行了
作者: 文雅夕露    时间: 2018-3-18 19:11
r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT)
问号冒号表达式本来就是一种判断,不是true就是false。
再在后面加一段的判断是做什么用呢?true时判断按键还是false时判断按键?
不知道楼主的具体用意是?

  1. #each_with_index do 双重迭代用法。
  2. #例子:hash = Hash.new
  3. #%w(cat dog wombat).each_with_index {|item, index|
  4. #  hash[item] = index
  5. #}
  6. #p hash
  7. #结果为:{"cat"=>0, "dog"=>1, "wombat"=>2}
  8. #item代入的是循环的内容
  9. #index则从0开始,循环1次+1
复制代码


看楼主的例子:
那n就是循环的内容。
i就是索引。
要拆解分行的话可以写成这样。
RUBY 代码复制
  1. class Window_Base < Window
  2.   #--------------------------------------------------------------------------
  3.   # ● 绘制强化/弱化状态的图标
  4.   #--------------------------------------------------------------------------
  5.   def draw_actor_icons(actor, x, y, width = 480)
  6.     icons = (actor.state_icons + actor.buff_icons)[0, width / 24]
  7.     icons.each_with_index {|n, i| draw_icon(n, x + 24 * i, y) }
  8.     if n > 16
  9.     draw_icon(n, x + 24 * i, y)
  10.     draw_icon(n+16, x + 24 * i, y + line_height * 1)
  11.     else
  12.     draw_icon(n, x + 24 * i, y)
  13.     end
  14.   end
  15. end
  16.  
  17. class Window_BattleStatus < Window_Selectable
  18.   #--------------------------------------------------------------------------
  19.   # ● 绘制基本区域
  20.   #--------------------------------------------------------------------------
  21.   def draw_basic_area(rect, actor)
  22.     draw_actor_name(actor, rect.x + 0, rect.y, 100)
  23.     draw_actor_icons(actor, rect.x + 0, rect.y + line_height * 1, 384)
  24.   end
  25. end

作者: 真紅樂章    时间: 2018-3-18 19:42
本帖最后由 真紅樂章 于 2018-3-18 19:44 编辑
QQ蚊子湯 发表于 2018-3-18 17:09
代數i代表項目數
所以我們可以設置如果i大於16時y軸增加,這樣當他繪製第16個狀態就會換行了

谢谢指教
成功写出来了呢
RUBY 代码复制
  1. def draw_actor_icons(actor, x, y, width = 1008)
  2.     icons = (actor.state_icons + actor.buff_icons)[0, width / 24]
  3.     icons.each_with_index {|n, i| i < 14 ? draw_icon(n, x + 24 * i, y) : i < 28 ? draw_icon(n, x + 24 * (i - 14), y + line_height) : draw_icon(n, x + 24 * (i - 28), y + line_height * 2) }
  4.   end


文雅夕露 发表于 2018-3-18 19:11
问号冒号表达式本来就是一种判断,不是true就是false。
再在后面加一段的判断是做什么用呢?true时判断按键还是false时判断按键?
不知道楼主的具体用意是?
  1.     r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
  2.     r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT)
复制代码

这段的目的是想要按←的时候r的数目-1如果本来是1则变成6然後按→的时候r的数目+1如果本来是6则变成1这样的说
求大佬指点
作者: 文雅夕露    时间: 2018-3-18 19:53
真紅樂章 发表于 2018-3-18 19:42
谢谢指教
成功写出来了呢
  def draw_actor_icons(actor, x, y, width = 1008)

if Input.repeat?(:RIGHT) && r == 6
r =1
else
r += 1
end
if Input.repeat?(:LEFT) && r == 1
r = 6
else
r -= 1
end
思路是不是清晰多了?别逮着简单的表达式就一样要去用它们嘛。
先理清楚思路然后熟练了再使用它们也不迟。

作者: 真紅樂章    时间: 2018-3-18 20:09
文雅夕露 发表于 2018-3-18 19:53
思路是不是清晰多了?别逮着简单的表达式就一样要去用它们嘛。
先理清楚思路然后熟练了再使用它们也不迟。

然而改成这句之後下方视窗还是没有跟随上方光标移动变化的说
做不出图鉴般的效果来呢
作者: 真紅樂章    时间: 2018-3-18 20:19
文雅夕露 点评于 2018-3-18 20:11
嗯...这样写应该是没错的,不知道是您的脚本是哪里逻辑上出了点问题...

所以说小紅也想知道是哪里逻辑上出问题了的说
因为在脚本里改动r的数值有能得出小紅想要的效果於是就在琢磨如何在游戏选单里改变r的数值了呢

另外问一下坛里的点评如何用出来的呢
作者: 真紅樂章    时间: 2018-3-19 07:23
本帖最后由 真紅樂章 于 2018-3-19 07:25 编辑
魔法丶小肉包 点评于 2018-3-19 00:40
首先你的create_status_window方法只会执行一次,你需要update

尝试过将update放在脚本各处没有效果
请问update详细使用方法的说
作者: RaidenInfinity    时间: 2018-3-19 10:27
本帖最后由 RaidenInfinity 于 2018-3-19 19:06 编辑

1. 你之前的帖子,我之所以建议开新帖,是因为那个回复你的家伙是来捣乱的,也已经被拉进板块黑名单禁言了。看不懂是正常现象,也不必懊恼。
2. 置顶的脚本教程建议看一次,尤其是第三章第二节,关于主循环的部分。
3. Scene_Base(所有场景的父类)的 update_all_windows(更新所有窗口)和dispose_all_windows(释放所有窗口) 方法,会自动对所有在场景内的窗口执行更新和释放,所以不需要手动执行,否则就会重复了。
4. 所有键盘输入操作必须在update(更新)方法里判定。建议放在窗口类里面(参考Window_Selectable)。
5. 建议不要碰Window_Base里的方法。请参考脚本教程,了解一下继承的概念(第二章第四节)。

另外我发现非常多的问题,比如为什么一个角色要一个窗口类,不能在赋值后更新吗?
作者: 真紅樂章    时间: 2018-3-25 12:33
本帖最后由 真紅樂章 于 2018-3-25 13:05 编辑
RaidenInfinity 发表于 2018-3-19 10:27
1. 你之前的帖子,我之所以建议开新帖,是因为那个回复你的家伙是来捣乱的,也已经被拉进板块黑名单禁言了。看不懂是正常现象,也不必懊恼。

谢谢版主sama的提醒

话说其实那些不是其他角色而是同一角色(也是唯一角色因为设计中的游戏单角色的说)的各种各样的纪录
而且原本是做成按进去显示的说
上一帖原问题来说明好了

-----------------------------------

这里

Enter进入这里

再按Enter进入这里 ↓ 都没有问题

然後Ecs退出这里 ↓ 还是没问题

再从这里

Enter进入这里

然後按Ecs退出 却变成这样 ↓ (光标圈着「」而不是进入前的「」)


所以才想问如何可以记录进入前的选项作为退出时返回的目标的说

-----------------------------------

所以小紅原本是拿状态窗口的脚本改成想要的样子的呢
於是就变成有六个新增窗口了……

後来看着感觉弄成图鉴立即显示比较方便的样子
於是才在新开这帖的时候改为询问那个判断问题而把原本的问题弃疗了喔

RaidenInfinity 发表于 2018-3-19 10:27
另外我发现非常多的问题,比如为什么一个角色要一个窗口类,不能在赋值后更新吗?

话说「赋值后更新」是指像道具窗口那样的吗
但是由於那六个新增窗口绘制项目其实都各不相同的喔
对於连道具窗口脚本看不懂的小紅来说要从零写出类似脚本恐怕不是以月份计数的学习时间内可以弄出来的说

嘛……小紅其实有试着解读道具窗口脚本的……结果……

-----------------------------------

从选单进入道具窗口应该是从class Scene_Menu这里↓进行的
RUBY 代码复制
  1. def command_item
  2.     SceneManager.call(Scene_Item)
  3.   end

然後就是进入道具场景Scene_Item

然後道具场景Scene_Item的第一部份
RUBY 代码复制
  1. def start
  2.     super
  3.     create_help_window
  4.     create_category_window
  5.     create_item_window
  6.   end

def start ← 应该是说在设定一个叫做start的东西
然後方法还是类方法还是实例还是对像那些专用名词……小紅在教程里都看到蚊香眼了还是看不懂都是些甚麽……
只好先跳过……

那麽跳过名词的问题
第二行的super好像是让这个start继承他爸爸的start的说
於是Scene_Item < Scene_ItemBase的父类Scene_ItemBase里的start……
RUBY 代码复制
  1. def start
  2.     super
  3.     create_actor_window
  4.   end

再Scene_ItemBase < Scene_MenuBase的父类Scene_MenuBase里的start……
RUBY 代码复制
  1. def start
  2.     super
  3.     create_background
  4.     @actor = $game_party.menu_actor
  5.   end

再Scene_MenuBase < Scene_Base的父类Scene_Base里的start……
RUBY 代码复制
  1. def start
  2.     create_main_viewport
  3.   end

没有再super所以应该可以从这里开始解读了…
那麽第二行调用了个create_main_viewport的东西
全局查找在同为Scene_Base的第80行
RUBY 代码复制
  1. def create_main_viewport
  2.     @viewport = Viewport.new
  3.     @viewport.z = 200
  4.   end

第二行@viewport = Viewport.new
加个@的记得叫实例变量
但是实例变量是甚麽……
似乎是厉害一点的变量所以在同一个实例里都能用
但是实例又是甚麽……
教程里似乎常提及实例但是没有就实例这两个字做出专门的讲解……
也或许有但是小紅看漏了吧
总之似乎加个@的东西就是在同一个class里都能用的东西的样子……吗
只好又跳过……

那麽继续= Viewport.new
.new应该就是把.前面那串字来弄一个新的
所以就是弄一个新的Viewport了
Viewport是甚麽
在脚本里找不到……

然後在F1教程里找到了
似乎是一个影响显示的东西……吗
只好又再跳过……

第三行@viewport.z = 200
@viewport在上一行已经=了Viewport.new
所以这行的@viewport.z里的.z的意思应该要从Viewport里找
然後找到z是用来显示z座标的
数字大的可以盖住数值小的
然後记得不知道从哪个教程看到过游戏事件里用来显示图片优先的编号只有到100
所以= 200应该是一个很大的数值
就是说其实上面那一大段都只是用来设定把前面的东西都显示在游戏画面的最上层
把其他东西都盖光光的说……吗
因为太多东西被跳过了所以已经不太肯定於是只好暂时把这个当作结论然後又再跳过……(蚊香眼)

然後继续上面Scene_Base里的start
由於内容只有一行所以结论应该就是相同的东西

然後再继续上面的上面Scene_MenuBase里的start
RUBY 代码复制
  1. def start
  2.     super
  3.     create_background
  4.     @actor = $game_party.menu_actor
  5.   end

第二行super的疑似结论是显示在最上面
那麽第三行create_background
RUBY 代码复制
  1. def create_background
  2.     @background_sprite = Sprite.new
  3.     @background_sprite.bitmap = SceneManager.background_bitmap
  4.     @background_sprite.color.set(16, 16, 16, 128)
  5.   end

第二行@background_sprite = Sprite.new
一个@东西被等於了Sprite.new
Sprite ← 这个小紅知道是跟图片有关的
这样找教程就好找多了
不像刚才找个Viewport找到快要死翘翘
然後教程有看没有懂……(蚊香眼 x2)
不知道算不算跳过总之继续看第三行

@background_sprite.bitmap = SceneManager.background_bitmap
第二行的@东西的.bitmap被等於了SceneManager.background_bitmap
F1教程里的bitmap指向了内容更复杂的Bitmap……(蚊香眼 x3)

话说回来「精灵传输元位图(Bitmap)的引用。」里的「的引用」是怎麽引用来着
「引用」是甚麽呢……
小紅开始怀疑自己是不是其实不懂中文了……(蚊香眼 x4)

虽然感觉这个.bitmap是不能跳过的
不过不跳就卡住了只好又跳过……

後面是SceneManager.background_bitmap
SceneManager里面的background_bitmap有找到↓
RUBY 代码复制
  1. def self.background_bitmap
  2.     @background_bitmap
  3.   end

内容是@background_bitmap
@background_bitmap在最上面的↓
RUBY 代码复制
  1. @background_bitmap = nil

所以一开始是空值
然後再出现是在↓
RUBY 代码复制
  1. def self.snapshot_for_background
  2.     @background_bitmap.dispose if @background_bitmap
  3.     @background_bitmap = Graphics.snap_to_bitmap
  4.     @background_bitmap.blur
  5.   end

第二行有个if所以先看if後面的
@background_bitmap ← 如果是空值就.dispose
.dispose好像刚才在F1教程里的Bitmap里看到过
是释放位图来着
虽然不知道为甚麽在SceneManager里可以用Bitmap的东西
不过先当成可以用来跳过吧……(蚊香眼 x5)

那麽释放位图是甚麽呢
其实也看不懂+1……(蚊香眼 x6)

只好都跳过当成是把@background_bitmap变成空值(因为释放了?)好了
所以第二行就是不管原本的@background_bitmap是啥都变成空值了……吗
跳过跳过都跳过……(蚊香眼 x7)

於是第三行的@background_bitmap = Graphics.snap_to_bitmap
各种跳过之後似乎空值了的@background_bitmap被等於Graphics.snap_to_bitmap
F1教程里直接找到Graphics.snap_to_bitmap
就是指当前游戏画面变成图片来用
所以第三行就是说@background_bitmap被等於当前游戏画面了

第四行@background_bitmap.blur
.blur是啥来着……
在不知道为甚麽可以用的Bitmap里找到
是模糊的说
所以第四行就是把第三行的@background_bitmap给模糊了

所以第二丶三丶四行加在一起
就是让一个名叫@background_bitmap的东西被等於一张图片
而那张图片就是当前游戏画面被模糊後的样子

好吧因为各种谜之跳过所以这个结论其实不太肯定
总之当成是这样然後跳过……(蚊香眼 x8)

回到上面
SceneManager的background_bitmap有了
所以来继续看Scene_MenuBase里的start里的create_background
第三行@background_sprite.bitmap = SceneManager.background_bitmap在各种跳过之後得到一张图片了
於是第四行@background_sprite.color.set(16, 16, 16, 128)
把@background_sprite那张图片给.color.set
虽然找不到.color.set来着
不过F1教程里的Color里面有个set似乎有关系
所以(16, 16, 16, 128)就是一个16度红色+16度绿色+16度蓝色然後128不透明也就是说半透明的东西了吧

其实上面那一行因为有background这个字都知道大概是在指背景了
所以虽然不能准确找到.color.set是甚麽
不过大概就是在那张模糊了的当前游戏画面上面再加一层半透明的深灰色吧
於是create_background就是一张当前游戏画面被模糊了再加深颜色了的图片的说……吗
总之跳……(蚊香眼 x9)

於是回到上面的上面的Scene_MenuBase里的start
第四行的@actor = $game_party.menu_actor
把一个@东西给等於做一个$东西
$这个小紅知道是叫全局变量来着
$game_party是游戏里的队伍
然後$game_party = Game_Party.new
所以$game_party.menu_actor就是Game_Party里的menu_actor↓
RUBY 代码复制
  1. def menu_actor
  2.     $game_actors[@menu_actor_id] || members[0]
  3.   end

於是第二行$game_actors[@menu_actor_id] || members[0]
|| ← 是或者
如果小紅没有理解错误的话就是指有前面的用前面的
没有前面的用後面的
都没有就是false
不过这里说的是游戏角色应该不会出现都没有的情况……吗(蚊香眼 x10)

总之先看$game_actors[@menu_actor_id]
$game_actors是被等於Game_Actors的

……

看了一眼class Game_Actors
里面就几句
根据上面经验
这种几句的东西就是又要找来找出结果越找越大堆的东西……
鉴於小紅感觉自己的脑袋已经在冒烟了………
这次就先解读到这里…………
有空再续……………
(蚊香眼 x………………)


作者: 真紅樂章    时间: 2018-3-31 23:37
本帖最后由 真紅樂章 于 2018-3-31 23:38 编辑
RaidenInfinity 点评于 2018-3-25 21:20
建议来QQ群,即时聊天会比发帖回复还好很多。(按交流讨论分类可以看到帖子)

然而小紅并没有QQ

来继续蚊香眼的说

-----------------------------------

上回解读到Game_Party里的menu_actor的说
  1.   def menu_actor
  2.     $game_actors[@menu_actor_id] || members[0]
  3.   end
复制代码

然後在$game_actors[@menu_actor_id]里的$game_actors是被等於Game_Actors的
於是又要来去看Game_Actors了

  1. class Game_Actors
  2.   #--------------------------------------------------------------------------
  3.   # ● 初始化对象
  4.   #--------------------------------------------------------------------------
  5.   def initialize
  6.     @data = []
  7.   end
  8.   #--------------------------------------------------------------------------
  9.   # ● 获取角色
  10.   #--------------------------------------------------------------------------
  11.   def [](actor_id)
  12.     return nil unless $data_actors[actor_id]
  13.     @data[actor_id] ||= Game_Actor.new(actor_id)
  14.   end
  15. end
复制代码

非常简洁的一个class
就只有一个def的说……

那麽再来逐行解读了
首先是def initialize
def ← 有这个的意思应该是在定义一个名叫initialize的东西
不过全局查找能找出来的全部是名种定义这个initialize而完全没有在哪里使用过
於是找教程去然後……看不懂(蚊香眼……)
直到网上找找看才找到完来initialize是会在.new的时候自动用上的……
难怪会叫做「初始化」呢

於是继续第二行@data = []
一个@东西被等於了[]
小紅记得[]是空的数组来着

然後第三行就end了

接下来是def [](actor_id)
定义一个叫做「[]」的方法然後用actor_id作为参数……吗?
所以上面那个@data = []的时候的[]是空的数组还是方法名称……?
◢▆▅▄▃ 崩╰(〒皿〒)╯溃 ▃▄▅▆◣


……
………

看不懂只好跳过……
话说各种跳过都跳成这样了让小紅其实很怀疑这个解读还有没有意义……(蚊香眼 x2)

总之跳过def [](actor_id)之後继续下一行
return nil unless $data_actors[actor_id]
返回 空值 除非 $data_actors[actor_id]
所以$data_actors[actor_id]如果是nil或者false都会返回nil

那麽$data_actors[actor_id]又是甚麽
$data_actors在module DataManager
  1.     $data_actors        = load_data("Data/Actors.rvdata2")
复制代码

就是说读取「Data/Actors.rvdata2」这个文件
然後回去找教程……
这次有找到喔
原来$data_actors就是储存角色资料的数组
然後[actor_id]……教程里面写着[]里面是一个数字就是代表角色ID
不过这里[]里面是英文actor_id……
所以这个是啥来着?
变量吗?
但是又没看到这个class里有actor_id =的句子喔……
反倒是各种actor_id充斥整个class……
果然写给电脑看的东西就不是人脑能够理解的吗?
跳过……(蚊香眼 x3)

下一行……等等这不就最後一行了
结果小紅不就整个class都跳过了吗……

算了继续最後一行
@data[actor_id] ||= Game_Actor.new(actor_id)
很好
立即来个小紅看不懂的符号||=……
不过小紅记得有个类似的东西是+=
当成相同的东西好了
於是@data[actor_id] ||= Game_Actor.new(actor_id)其实就是@data[actor_id] = @data[actor_id] || Game_Actor.new(actor_id)
|| ← 如果前面有就前面
如果前面nil或者false就後面
前後都没有就false
所以说就是如果已经有@data[actor_id] 就继续沿用
没有就Game_Actor.new(actor_id)作为新的@data[actor_id]

然後先看@data[actor_id]
[actor_id]又是你!
上面说过看不懂所以……
跳……(蚊香眼 x4)

然後到Game_Actor.new(actor_id)
看到.new就知道要转去另一个class了
结果上面整个class Game_Actors真的被跳光光了呢……
再◢▆▅▄▃ 崩╰(〒皿〒)╯溃 ▃▄▅▆◣


……
………

於是跳到class Game_Actor了
记得刚才找initialize的时候看到教程说.new後面跟着()就是递入参数
果然class Game_Actor的initialize里有个(actor_id)来接受参数
所以actor_id到底是甚麽
这个疑似是变量但是到处都没有定义过的东西到底是从哪里来的……

-----------------------------------

竟然解读头痛……
只好先休息
有缘再续……
作者: 真紅樂章    时间: 2018-4-6 02:32
本帖最后由 真紅樂章 于 2018-4-6 02:40 编辑

没人来救只好继续自救的说

-----------------------------------

上回跳到class Game_Actor了
然後第一行
  1.   def initialize(actor_id)
复制代码

因为看不懂(actor_id)是啥所以跳过

第二行
  1.     super()
复制代码

super所以又要找父类了
Game_Actor < Game_Battler
跳到Game_Battler

第一行initialize初始化

第二丶三丶四丶五行
  1.     @battler_name = ""
  2.     @battler_hue = 0
  3.     @actions = []
  4.     @speed = 0
复制代码

分别设定了四个@变量做空白丶零丶空的数组丶零

第六行
  1.     @result = Game_ActionResult.new(self)
复制代码

设定了个@变量做……
虽然不知道(self)是甚麽不过跳去Game_ActionResult

第一行
  1.   def initialize(battler)
复制代码

(battler)是递入参数
而被递入的(self)上面已经说了看不懂所以跳……

第二行
  1.     @battler = battler
复制代码

设定@变量做battler
battler就是上面说了的被递入的不知道是甚麽的(self)
嗯……既然不知道只好跳……

第三行
  1.     clear
复制代码

然後clear的内容就在同一class的下面
  1.   def clear
  2.     clear_hit_flags
  3.     clear_damage_values
  4.     clear_status_effects
  5.   end
复制代码


又来第一行
  1.     clear_hit_flags
复制代码

内容也在同class下面
  1.   def clear_hit_flags
  2.     @used = false
  3.     @missed = false
  4.     @evaded = false
  5.     @critical = false
  6.     @success = false
  7.   end
复制代码

把五个@变量设为false了

然後clear的第二行
  1.     clear_damage_values
复制代码

内容同class下面
  1.   def clear_damage_values
  2.     @hp_damage = 0
  3.     @mp_damage = 0
  4.     @tp_damage = 0
  5.     @hp_drain = 0
  6.     @mp_drain = 0
复制代码

这次是把五个@变量设为零的说

然後clear的第三行
  1.     clear_status_effects
复制代码

内容同class
  1.   def clear_status_effects
  2.     @added_states = []
  3.     @removed_states = []
  4.     @added_buffs = []
  5.     @added_debuffs = []
  6.     @removed_buffs = []
  7.   end
复制代码

把五个@变量设为空的数组

於是clear完了也initialize完了
可以回去Game_Battler了
虽然还是不知道(self)是甚麽就是了……

然後继续Game_Battler的initialize的第七丶八行
  1.     @last_target_index = 0
  2.     @guarding = false
复制代码

又有两个@变量分别被设定为零和false

第九行
  1.     clear_sprite_effects
复制代码

内容同class
  1.   def clear_sprite_effects
  2.     @animation_id = 0
  3.     @animation_mirror = false
  4.     @sprite_effect_type = nil
  5.   end
复制代码

把三个@变量分别设零丶false丶空值

第十行
  1.     super
复制代码

又要来去找父类Game_BattlerBase的initialize了呢

  1.   def initialize
  2.     @hp = @mp = @tp = 0
  3.     @hidden = false
  4.     clear_param_plus
  5.     clear_states
  6.     clear_buffs
  7.   end
复制代码

  1.   def clear_param_plus
  2.     @param_plus = [0] * 8
  3.   end
复制代码

  1.   def clear_states
  2.     @states = []
  3.     @state_turns = {}
  4.     @state_steps = {}
  5.   end
复制代码

  1.   def clear_buffs
  2.     @buffs = Array.new(8) { 0 }
  3.     @buff_turns = {}
  4.   end
复制代码


前面还好
只是把@变量设为零丶false丶只有一个零的数组乘八(看不太懂?)丶空的数组丶空的哈希表
直到@buffs = Array.new(8) { 0 }……
於是要找Array了呢
在置顶教程里面有找到呢
是指创建一个[0,0,0,0,0,0,0,0]的数组的说

这样就顺利解读完Game_BattlerBase和Game_Battler的initialize了呢
所以回到Game_Actor的initialize去

第二行
  1.     setup(actor_id)
复制代码

又是万恶的(actor_id)……
反正setup在下面就对了

  1.   def setup(actor_id)
  2.     @actor_id = actor_id
  3.     @name = actor.name
  4.     @nickname = actor.nickname
  5.     init_graphics
  6.     @class_id = actor.class_id
  7.     @level = actor.initial_level
  8.     @exp = {}
  9.     @equips = []
  10.     init_exp
  11.     init_skills
  12.     init_equips(actor.equips)
  13.     clear_param_plus
  14.     recover_all
  15.   end
复制代码


第一行
  1.     @actor_id = actor_id
复制代码

始终不知道actor_id是啥呢……跳……

第二行
  1.     @name = actor.name
复制代码

actor内容同class
  1.   def actor
  2.     $data_actors[@actor_id]
  3.   end
复制代码

上一回有找到过$data_actors就是储存角色资料的数组嘛
只不过不知况[actor_id]是啥所以跳过了
这次则是[@actor_id]
而[@actor_id]在上行是等於[actor_id]的……
所以这个不断出现的[actor_id]到底是甚麽……
◢▆▅▄▃ 崩╰(〒皿〒)╯溃 ▃▄▅▆◣

不过看置顶教程如果小紅没有理解错误的话
.name应该就是指这个不知道从哪来的[actor_id]的角色的名字了吧

第三行
  1.     @nickname = actor.nickname
复制代码

不知道从哪来的[actor_id]的角色的称号

第四行
  1.     init_graphics
复制代码

内容同class
  1.   def init_graphics
  2.     @character_name = actor.character_name
  3.     @character_index = actor.character_index
  4.     @face_name = actor.face_name
  5.     @face_index = actor.face_index
  6.   end
复制代码

四个@变量分别设为不知道从哪来的[actor_id]的角色的那四个同名的@变量就是了

第五丶六行
  1.     @class_id = actor.class_id
  2.     @level = actor.initial_level
复制代码

继续@变量 = 不知道从哪来的[actor_id]的角色里的同名@变量

第七丶八行
  1.     @exp = {}
  2.     @equips = []
复制代码

两个@变量设为空的哈希表和空的数组

第九行
  1.     init_exp
复制代码

内容同class
  1.   def init_exp
  2.     @exp[@class_id] = current_level_exp
  3.   end
复制代码

置顶教程里的哈希表的键值配对呢
所以是@exp这个哈希表里面的@class_id这个键值被配对为current_level_exp的说

current_level_exp在同class下面
  1.   def current_level_exp
  2.     exp_for_level(@level)
  3.   end
复制代码


exp_for_level在同class的……这次是上面呢
  1.   def exp_for_level(level)
  2.     self.class.exp_for_level(level)
  3.   end
复制代码


……
………
…………

-----------------------------------

这个class跳很大
跳到蚊香眼……睡去……待续
作者: 真紅樂章    时间: 2018-4-8 05:20
本帖最后由 真紅樂章 于 2018-4-8 05:29 编辑

承上回

-----------------------------------

上回读到
  1.   def exp_for_level(level)
  2.     self.class.exp_for_level(level)
  3.   end
复制代码

self这个在置顶教程有说到
不过小紅有看没有懂就是了……

所以说这exp_for_level(level)的定义就是它自己的class的它自己吗……
总之先跳class好了
class的内容又在同class的下面呢

  1.   def class
  2.     $data_classes[@class_id]
  3.   end
复制代码

这次到$data_classes
  1.     $data_classes       = load_data("Data/Classes.rvdata2")
复制代码

读取一个文件
好吧小紅从classes看出来应该是职业的意思
然後[@class_id]在class Game_Actor最上面setup的时候被等於了actor.class_id
结果因为看不懂@actor_id是啥所以跳过了……所以再跳……

然後.exp_for_level(level)在小紅看来完全是逻辑回圈了……
总之不懂……跳……


回到def init_exp
因为剩下的[@class_id]是不懂的所以跳……

这麽一来init_exp的解读就像没读过一样被跳光光了
於是回到def setup(actor_id)

跳过init_exp来到第十行
  1.     init_skills
复制代码

内容同class
  1.   def init_skills
  2.     @skills = []
  3.     self.class.learnings.each do |learning|
  4.       learn_skill(learning.skill_id) if learning.level <= @level
  5.     end
  6.   end
复制代码


第一行
  1.     @skills = []
复制代码

一个@变量被等於一个空的数组

第二行
  1.     self.class.learnings.each do |learning|
复制代码

置顶教程有写说each do的前面会是一个数值范围来迭代後面被||包着的东西
所以先来看前面的self.class.learnings
虽然因为self.class在上面已经跳过了所以小紅知道这次一定又要跳
不过还是先试着找找看.learnings是甚麽好了

结果全局查找是只找到这个和另一个同样是self.class.learnings……
……
小紅能怎麽办
小紅也很绝望啊
……
跳……

看迭代内容
  1.       learn_skill(learning.skill_id) if learning.level <= @level
复制代码


嗯……因为if前if後都是要用上learning的
然後小紅压根解不出来learning是甚麽
所以跳……

init_skills的解读比init_exp更绝望的完全跳过了
於是又回到def setup(actor_id)

第十一行
  1.     init_equips(actor.equips)
复制代码

内容同class
  1.   def init_equips(equips)
  2.     @equips = Array.new(equip_slots.size) { Game_BaseItem.new }
  3.     equips.each_with_index do |item_id, i|
  4.       etype_id = index_to_etype_id(i)
  5.       slot_id = empty_slot(etype_id)
  6.       @equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
  7.     end
  8.     refresh
  9.   end
复制代码


第一行
  1.     @equips = Array.new(equip_slots.size) { Game_BaseItem.new }
复制代码

一个@变量被等於一个数组
数组长度是(equip_slots.size)然後内容是{ Game_BaseItem.new }

先看equip_slots.size
equip_slots内容同class
  1.   def equip_slots
  2.     return [0,0,2,3,4] if dual_wield?
  3.     return [0,1,2,3,4]
  4.   end
复制代码

dual_wield?的内容在class Game_Actor的父类的父类class Game_BattlerBase里
  1.   def dual_wield?
  2.     slot_type == 1
  3.   end
复制代码

slot_type的内容就在def dual_wield?上面
  1.   def slot_type
  2.     features_set(FEATURE_SLOT_TYPE).max || 0
  3.   end
复制代码

features_set的内容在同class的上面
  1.   def features_set(code)
  2.     features(code).inject([]) {|r, ft| r |= [ft.data_id] }
  3.   end
复制代码

.inject在置顶教程里有找到是集合迭代计算
所以前面的看不懂的features(code)应该是一个不知道从哪里来的数组
然後()里的[]是後面变量的初始值
所以初始值是一个空的数组吗
然後後面的因为是一个{}包起来的东西而不是教程里被||包起来的东西所以小紅无法解读
能怎麽办……也很绝望……跳……

於是一跳就跳回def init_equips(equips)的第一行的後半部份
{ Game_BaseItem.new }
好吧……小紅看不懂把整个class Game_BaseItem弄成数组的内容是怎麽弄的
所以很绝望……跳……
跳………
跳…………
跳不起来了……

-----------------------------------

其实小紅是觉得自己很努力想要学习
但是这个自学过程
自学教程给小紅的感觉就是绝大部份说着入门结果里面各种专业术语……
对於已经学懂了的人来说大概是显浅易明而对於未学懂的人来说……就是看不懂
至於那能看懂教程小部份小紅觉得自己是有个小成果的毕竟都写出一个不能动的新窗口出来了喔
只不过是在能动不能动之间的细节用了两个月时间还是弄不清而已

小紅是有试过想要参考其他分页脚本
结果网上压根找不到简单的分页脚本
能找到的全是各种自定义数值各种自定义功能各种各样看不懂东西全部写在一起的超级复杂大佬级多元化图鉴脚本的说

等到小紅找到这里来还以为终於找到一个可以求教的地方了呢
结果小紅在这一帖里都死皮赖脸地秀下限了喔
看不见援手……看不见援手……看不见援手……

这个从Scene_Item开始试着解读基本上连Scene_Item第一句的super还没解完小紅就已经解不下去了呢
跳过的地方已经多到小紅都不知道自己浪费半个月时间到底解出甚麽来
这样解下去大概也不会有甚麽义意了吧
其实小紅曾经以为总会有路过的大佬愿意提携一下的说
所以有大佬愿意来给小紅答案
作者: soulsaga    时间: 2018-4-8 15:53
本帖最后由 soulsaga 于 2018-4-8 16:06 编辑

脚本白痴路过..既然是LZ自己写的选单脚本..建议上传工程比较好找到要改的脚本
话说..我这回复有可能会被版主删呢..




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1