Project1
标题: 脚本新手试写失败 想再请教错在哪里 关於增设选单 [打印本页]
作者: 真紅樂章 时间: 2018-3-18 16:03
标题: 脚本新手试写失败 想再请教错在哪里 关於增设选单 因为版主sama 建议重开新帖 所以重新开 了
话说身为脚本盲 的小紅试着写了个脚本给自己用 但是其实自己也不知道自己写了甚麽 的说
鉴於之前请教帖 得到的提示 实在太高端 结果小紅压根看不懂 所以小紅决定放弃思考 了
想说尽量用些自己理解范围内的办法 来尝试解决问题 呢
於是成果 如下……
class Scene_scommand < Scene_MenuBase
#--------------------------------------------------------------------------
# ● 开始处理
#--------------------------------------------------------------------------
def start
super
create_scommand_window
create_status_window
end
#--------------------------------------------------------------------------
# ● 生成指令窗口
#--------------------------------------------------------------------------
def create_scommand_window
@scommand_window = Window_SuCommand.new
@scommand_window.set_handler(:aaa, method(:command_aaa))
@scommand_window.set_handler(:bbb, method(:command_bbb))
@scommand_window.set_handler(:ccc, method(:command_ccc))
@scommand_window.set_handler(:ddd, method(:command_ddd))
@scommand_window.set_handler(:eee, method(:command_eee))
@scommand_window.set_handler(:fff, method(:command_fff))
@scommand_window.set_handler(:cancel, method(:return_scene))
end
#--------------------------------------------------------------------------
# ● 生成状态窗口
#--------------------------------------------------------------------------
def create_status_window
r = 1
r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT)
case r
when 1
@status_window = Window_aaa.new(@actor)
when 2
@status_window = Window_bbb.new(@actor)
when 3
@status_window = Window_ccc.new(@actor)
when 4
@status_window = Window_ddd.new(@actor)
when 5
@status_window = Window_eee.new(@actor)
when 6
@status_window = Window_fff.new(@actor)
end
end
def command_aaa
SceneManager.call(Scene_aaa_window)
end
def command_bbb
SceneManager.call(Scene_bbb_window)
end
def command_ccc
SceneManager.call(Scene_ccc_window)
end
def command_ddd
SceneManager.call(Scene_ddd_window)
end
def command_eee
SceneManager.call(Scene_eee_window)
end
def command_fff
SceneManager.call(Scene_fff_window)
end
end 复制代码
虽然小紅知道这东西已经乱成一团了 不过在r = 1 那行手动在脚本里改成r = 其他数字 有能达成小紅想要的效果 喔……
r = 3
r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT) 复制代码
r = 5
r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT) 复制代码
r = 6
r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT) 复制代码
所以小紅只想问一下为甚麽下面利用按键来进行逻辑判断 的两行不起效用 呢
r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT) 复制代码
另外想问一下异常状态图示用太多 已经挤满一行 也显示不完 (十六个以上)的话要如何让它们懂得自动换行 到下一行继续显示 呢
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 绘制强化/弱化状态的图标
#--------------------------------------------------------------------------
def draw_actor_icons(actor, x, y, width = 480)
icons = (actor.state_icons + actor.buff_icons)[0, width / 24]
icons.each_with_index {|n, i| draw_icon(n, x + 24 * i, y) }
end
end
class Window_BattleStatus < Window_Selectable
#--------------------------------------------------------------------------
# ● 绘制基本区域
#--------------------------------------------------------------------------
def draw_basic_area(rect, actor)
draw_actor_name(actor, rect.x + 0, rect.y, 100)
draw_actor_icons(actor, rect.x + 0, rect.y + line_height * 1, 384)
end
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时判断按键?
不知道楼主的具体用意是?
#each_with_index do 双重迭代用法。
#例子:hash = Hash.new
#%w(cat dog wombat).each_with_index {|item, index|
# hash[item] = index
#}
#p hash
#结果为:{"cat"=>0, "dog"=>1, "wombat"=>2}
#item代入的是循环的内容
#index则从0开始,循环1次+1 复制代码
看楼主的例子:
那n就是循环的内容。
i就是索引。
要拆解分行的话可以写成这样。
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 绘制强化/弱化状态的图标
#--------------------------------------------------------------------------
def draw_actor_icons( actor, x, y, width = 480 )
icons = ( actor.state_icons + actor.buff_icons ) [ 0 , width / 24 ]
icons.each_with_index { |n, i| draw_icon( n, x + 24 * i, y) }
if n > 16
draw_icon( n, x + 24 * i, y)
draw_icon( n+16 , x + 24 * i, y + line_height * 1 )
else
draw_icon( n, x + 24 * i, y)
end
end
end
class Window_BattleStatus < Window_Selectable
#--------------------------------------------------------------------------
# ● 绘制基本区域
#--------------------------------------------------------------------------
def draw_basic_area( rect, actor)
draw_actor_name( actor, rect.x + 0 , rect.y , 100 )
draw_actor_icons( actor, rect.x + 0 , rect.y + line_height * 1 , 384 )
end
end
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 绘制强化/弱化状态的图标
#--------------------------------------------------------------------------
def draw_actor_icons( actor, x, y, width = 480 )
icons = ( actor.state_icons + actor.buff_icons ) [ 0 , width / 24 ]
icons.each_with_index { |n, i| draw_icon( n, x + 24 * i, y) }
if n > 16
draw_icon( n, x + 24 * i, y)
draw_icon( n+16 , x + 24 * i, y + line_height * 1 )
else
draw_icon( n, x + 24 * i, y)
end
end
end
class Window_BattleStatus < Window_Selectable
#--------------------------------------------------------------------------
# ● 绘制基本区域
#--------------------------------------------------------------------------
def draw_basic_area( rect, actor)
draw_actor_name( actor, rect.x + 0 , rect.y , 100 )
draw_actor_icons( actor, rect.x + 0 , rect.y + line_height * 1 , 384 )
end
end
作者: 真紅樂章 时间: 2018-3-18 19:42
本帖最后由 真紅樂章 于 2018-3-18 19:44 编辑
谢谢指教
成功写出来了呢
def draw_actor_icons( actor, x, y, width = 1008 )
icons = ( actor.state_icons + actor.buff_icons ) [ 0 , width / 24 ]
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 ) }
end
def draw_actor_icons( actor, x, y, width = 1008 )
icons = ( actor.state_icons + actor.buff_icons ) [ 0 , width / 24 ]
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 ) }
end
r == 6 ? r = 1 : r += 1 if Input.repeat?(:RIGHT)
r == 1 ? r = 6 : r -= 1 if Input.repeat?(:LEFT) 复制代码
这段的目的 是想要按←的时候r的数目-1如果本来是1则变成6 然後按→的时候r的数目+1如果本来是6则变成1 这样的说
求大佬指点
作者: 文雅夕露 时间: 2018-3-18 19:53
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 20:19
所以说小紅也想知道是哪里逻辑上出问题了 的说
因为在脚本里 改动r的数值 有能得出小紅想要的效果 於是就在琢磨如何在游戏选单里 改变r的数值 了呢
另外问一下坛里的点评 是如何用出来 的呢
作者: 真紅樂章 时间: 2018-3-19 07:23
本帖最后由 真紅樂章 于 2018-3-19 07:25 编辑
尝试过将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 编辑
谢谢版主sama 的提醒
话说其实一 丶二 丶 三 那些不是其他角色 而是同一角色 (也是唯一角色 因为设计中的游戏 是单角色 的说)的各种各样的纪录 喔
而且原本是做成按进去显示 的说
拿上一帖 的原问题 来说明好了
-----------------------------------
从这里 ↓
按Enter 进入这里 ↓
再按Enter 进入这里 ↓ 都没有问题
然後Ecs 退出这里 ↓ 还是没问题
再从这里 ↓
按Enter 进入这里 ↓
然後按Ecs 退出 却变成这样 ↓ (光标 圈着「一 」而不是进入前的「三 」)
所以才想问如何可以记录进入前的选项 作为退出时返回的目标 的说
-----------------------------------
所以小紅原本是拿状态窗口的脚本 来改成想要的样子 的呢
於是就变成有六个新增窗口 了……
後来看着感觉弄成图鉴 般立即显示 会比较方便 的样子
於是才在新开这帖 的时候改为询问那个判断问题 而把原本的问题 给弃疗 了喔
话说「赋值后更新 」是指像道具窗口 那样的吗
但是由於那六个新增窗口 的绘制项目 其实都各不相同 的喔
对於连道具窗口脚本 都看不懂 的小紅来说要从零写出类似脚本 恐怕不是以月份计数的学习时间 内可以弄出来的说
嘛……小紅其实有试着解读道具窗口脚本 的……结果……
-----------------------------------
从选单进入道具窗口应该是从class Scene_Menu这里↓进行的
def command_item
SceneManager.call ( Scene_Item)
end
def command_item
SceneManager.call ( Scene_Item)
end
然後就是进入道具场景Scene_Item
然後道具场景Scene_Item的第一部份
def start
super
create_help_window
create_category_window
create_item_window
end
def start
super
create_help_window
create_category_window
create_item_window
end
def start ← 应该是说在设定一个叫做start的东西
然後方法还是类方法还是实例还是对像那些专用名词……小紅在教程里都看到蚊香眼了还是看不懂都是些甚麽……
只好先跳过……
那麽跳过名词的问题
第二行的super好像是让这个start继承他爸爸的start的说
於是Scene_Item < Scene_ItemBase的父类Scene_ItemBase里的start……
def start
super
create_actor_window
end
def start
super
create_actor_window
end
再Scene_ItemBase < Scene_MenuBase的父类Scene_MenuBase里的start……
def start
super
create_background
@actor = $game_party .menu_actor
end
def start
super
create_background
@actor = $game_party .menu_actor
end
再Scene_MenuBase < Scene_Base的父类Scene_Base里的start……
def start
create_main_viewport
end
def start
create_main_viewport
end
没有再super所以应该可以从这里开始解读了…
那麽第二行调用了个create_main_viewport的东西
全局查找在同为Scene_Base的第80行
def create_main_viewport
@viewport = Viewport.new
@viewport .z = 200
end
def create_main_viewport
@viewport = Viewport.new
@viewport .z = 200
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
def start
super
create_background
@actor = $game_party .menu_actor
end
def start
super
create_background
@actor = $game_party .menu_actor
end
第二行super的疑似结论是显示在最上面
那麽第三行create_background
def create_background
@background_sprite = Sprite.new
@background_sprite .bitmap = SceneManager.background_bitmap
@background_sprite .color .set ( 16 , 16 , 16 , 128 )
end
def create_background
@background_sprite = Sprite.new
@background_sprite .bitmap = SceneManager.background_bitmap
@background_sprite .color .set ( 16 , 16 , 16 , 128 )
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有找到↓
def self .background_bitmap
@background_bitmap
end
def self .background_bitmap
@background_bitmap
end
内容是@background_bitmap
@background_bitmap在最上面的↓
所以一开始是空值
然後再出现是在↓
def self .snapshot_for_background
@background_bitmap .dispose if @background_bitmap
@background_bitmap = Graphics.snap_to_bitmap
@background_bitmap .blur
end
def self .snapshot_for_background
@background_bitmap .dispose if @background_bitmap
@background_bitmap = Graphics.snap_to_bitmap
@background_bitmap .blur
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↓
def menu_actor
$game_actors [ @menu_actor_id] || members[ 0 ]
end
def menu_actor
$game_actors [ @menu_actor_id] || members[ 0 ]
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 编辑
然而小紅并没有QQ 呢
来继续蚊香眼 的说
-----------------------------------
上回解读到Game_Party里的menu_actor的说
def menu_actor
$game_actors[@menu_actor_id] || members[0]
end 复制代码
然後在$game_actors[@menu_actor_id]里的$game_actors是被等於Game_Actors的
於是又要来去看Game_Actors了
class Game_Actors
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize
@data = []
end
#--------------------------------------------------------------------------
# ● 获取角色
#--------------------------------------------------------------------------
def [](actor_id)
return nil unless $data_actors[actor_id]
@data[actor_id] ||= Game_Actor.new(actor_id)
end
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
$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了
然後第一行
因为看不懂(actor_id)是啥所以跳过
第二行
super所以又要找父类了
Game_Actor < Game_Battler
跳到Game_Battler
第一行initialize初始化
第二丶三丶四丶五行
@battler_name = ""
@battler_hue = 0
@actions = []
@speed = 0 复制代码
分别设定了四个@变量做空白丶零丶空的数组丶零
第六行
@result = Game_ActionResult.new(self) 复制代码
设定了个@变量做……
虽然不知道(self)是甚麽不过跳去Game_ActionResult
第一行
(battler)是递入参数
而被递入的(self)上面已经说了看不懂所以跳……
第二行
设定@变量做battler
battler就是上面说了的被递入的不知道是甚麽的(self)
嗯……既然不知道只好跳……
第三行
然後clear的内容就在同一class的下面
def clear
clear_hit_flags
clear_damage_values
clear_status_effects
end 复制代码
又来第一行
内容也在同class下面
def clear_hit_flags
@used = false
@missed = false
@evaded = false
@critical = false
@success = false
end 复制代码
把五个@变量设为false了
然後clear的第二行
内容同class下面
def clear_damage_values
@hp_damage = 0
@mp_damage = 0
@tp_damage = 0
@hp_drain = 0
@mp_drain = 0 复制代码
这次是把五个@变量设为零的说
然後clear的第三行
内容同class
def clear_status_effects
@added_states = []
@removed_states = []
@added_buffs = []
@added_debuffs = []
@removed_buffs = []
end 复制代码
把五个@变量设为空的数组
於是clear完了也initialize完了
可以回去Game_Battler了
虽然还是不知道(self)是甚麽就是了……
然後继续Game_Battler的initialize的第七丶八行
@last_target_index = 0
@guarding = false 复制代码
又有两个@变量分别被设定为零和false
第九行
内容同class
def clear_sprite_effects
@animation_id = 0
@animation_mirror = false
@sprite_effect_type = nil
end 复制代码
把三个@变量分别设零丶false丶空值
第十行
又要来去找父类Game_BattlerBase的initialize了呢
def initialize
@hp = @mp = @tp = 0
@hidden = false
clear_param_plus
clear_states
clear_buffs
end 复制代码
def clear_param_plus
@param_plus = [0] * 8
end 复制代码
def clear_states
@states = []
@state_turns = {}
@state_steps = {}
end 复制代码
def clear_buffs
@buffs = Array.new(8) { 0 }
@buff_turns = {}
end
复制代码
前面还好
只是把@变量设为零丶false丶只有一个零的数组乘八(看不太懂?)丶空的数组丶空的哈希表
直到@buffs = Array.new(8) { 0 }……
於是要找Array了呢
在置顶教程里面有找到呢
是指创建一个[0,0,0,0,0,0,0,0]的数组的说
这样就顺利解读完Game_BattlerBase和Game_Battler的initialize了呢
所以回到Game_Actor的initialize去
第二行
又是万恶的(actor_id)……
反正setup在下面就对了
def setup(actor_id)
@actor_id = actor_id
@name = actor.name
@nickname = actor.nickname
init_graphics
@class_id = actor.class_id
@level = actor.initial_level
@exp = {}
@equips = []
init_exp
init_skills
init_equips(actor.equips)
clear_param_plus
recover_all
end 复制代码
第一行
始终不知道actor_id是啥呢……跳……
第二行
actor内容同class
def actor
$data_actors[@actor_id]
end 复制代码
上一回有找到过$data_actors就是储存角色资料的数组嘛
只不过不知况[actor_id]是啥所以跳过了
这次则是[@actor_id]
而[@actor_id]在上行是等於[actor_id]的……
所以这个不断出现的[actor_id]到底是甚麽……
◢▆▅▄▃ 崩╰(〒皿〒)╯溃 ▃▄▅▆◣
不过看置顶教程如果小紅没有理解错误的话
.name应该就是指这个不知道从哪来的[actor_id]的角色的名字了吧
第三行
@nickname = actor.nickname 复制代码
不知道从哪来的[actor_id]的角色的称号
第四行
内容同class
def init_graphics
@character_name = actor.character_name
@character_index = actor.character_index
@face_name = actor.face_name
@face_index = actor.face_index
end 复制代码
四个@变量分别设为不知道从哪来的[actor_id]的角色的那四个同名的@变量就是了
第五丶六行
@class_id = actor.class_id
@level = actor.initial_level 复制代码
继续@变量 = 不知道从哪来的[actor_id]的角色里的同名@变量
第七丶八行
两个@变量设为空的哈希表和空的数组
第九行
内容同class
def init_exp
@exp[@class_id] = current_level_exp
end 复制代码
置顶教程里的哈希表的键值配对呢
所以是@exp这个哈希表里面的@class_id这个键值被配对为current_level_exp的说
current_level_exp在同class下面
def current_level_exp
exp_for_level(@level)
end 复制代码
exp_for_level在同class的……这次是上面呢
def exp_for_level(level)
self.class.exp_for_level(level)
end 复制代码
……
………
…………
-----------------------------------
这个class跳很大
跳到蚊香眼……睡去……待续
作者: 真紅樂章 时间: 2018-4-8 05:20
本帖最后由 真紅樂章 于 2018-4-8 05:29 编辑
承上回
-----------------------------------
上回读到
def exp_for_level(level)
self.class.exp_for_level(level)
end 复制代码
self这个在置顶教程有说到
不过小紅有看没有懂就是了……
所以说这exp_for_level(level)的定义就是它自己的class的它自己吗……
总之先跳class好了
class的内容又在同class的下面呢
def class
$data_classes[@class_id]
end 复制代码
这次到$data_classes
$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来到第十行
内容同class
def init_skills
@skills = []
self.class.learnings.each do |learning|
learn_skill(learning.skill_id) if learning.level <= @level
end
end 复制代码
第一行
一个@变量被等於一个空的数组
第二行
self.class.learnings.each do |learning| 复制代码
置顶教程有写说each do的前面会是一个数值范围来迭代後面被||包着的东西
所以先来看前面的self.class.learnings
虽然因为self.class在上面已经跳过了所以小紅知道这次一定又要跳
不过还是先试着找找看.learnings是甚麽好了
结果全局查找是只找到这个和另一个同样是self.class.learnings……
……
小紅能怎麽办
小紅也很绝望啊
……
跳……
看迭代内容
learn_skill(learning.skill_id) if learning.level <= @level 复制代码
嗯……因为if前if後都是要用上learning的
然後小紅压根解不出来learning是甚麽
所以跳……
init_skills的解读比init_exp更绝望的完全跳过了
於是又回到def setup(actor_id)
第十一行
init_equips(actor.equips) 复制代码
内容同class
def init_equips(equips)
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
refresh
end 复制代码
第一行
@equips = Array.new(equip_slots.size) { Game_BaseItem.new } 复制代码
一个@变量被等於一个数组
数组长度是(equip_slots.size)然後内容是{ Game_BaseItem.new }
先看equip_slots.size
equip_slots内容同class
def equip_slots
return [0,0,2,3,4] if dual_wield?
return [0,1,2,3,4]
end 复制代码
dual_wield?的内容在class Game_Actor的父类的父类class Game_BattlerBase里
def dual_wield?
slot_type == 1
end 复制代码
slot_type的内容就在def dual_wield?上面
def slot_type
features_set(FEATURE_SLOT_TYPE).max || 0
end 复制代码
features_set的内容在同class的上面
def features_set(code)
features(code).inject([]) {|r, ft| r |= [ft.data_id] }
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