Project1

标题: 大家好,我想请教一个有关脚本的问题 [打印本页]

作者: dujian15    时间: 2012-12-2 19:29
标题: 大家好,我想请教一个有关脚本的问题
前期有三个脚本windows_1,windows_2,windows_3
分别描述了三个窗口。

现在想做一个sence(名称为sence_1)脚本,把这三个窗口里同时显示出来,并且按esc退出。
我想显示的方法是,设定一个事件,当游戏主角激活事件后,显示一这个sence。
事件中引用脚本 $sence=Sence_1.new

那写sence脚本的具体思路是什么?
需要跟贴说明哪些问题?

或者给sence描述的一个传送门什么的......

作者: 后知后觉    时间: 2012-12-2 20:45
$sence=Sence_1.new  这是 XP 脚本的语句
但是这是 VA 区 那你是想问在XP里该怎么做 还是在VA里?
作者: dujian15    时间: 2012-12-2 23:57
后知后觉 发表于 2012-12-2 20:45
$sence=Sence_1.new  这是 XP 脚本的语句
但是这是 VA 区 那你是想问在XP里该怎么做 还是在VA里? ...

RGSS3的教程我没有找到一个能修改脚本逻辑和脚本控制窗口外观的教程 多数还是停留在介绍类对象这方面
完成一个脚本可能需要的更是一个系统的理解过程 因此在找不到教程后我套用的XP教程非法部分结合VA默认脚本
还请给一个事件激活窗口的通用例子或教程 辛苦
作者: dujian15    时间: 2012-12-2 23:58
dujian15 发表于 2012-12-2 23:57
RGSS3的教程我没有找到一个能修改脚本逻辑和脚本控制窗口外观的教程 多数还是停留在介绍类对象这方面
完 ...

手机敲字没标点
作者: dujian15    时间: 2012-12-3 09:13
后知后觉 发表于 2012-12-2 20:45
$sence=Sence_1.new  这是 XP 脚本的语句
但是这是 VA 区 那你是想问在XP里该怎么做 还是在VA里? ...

能接触到电脑了,我重新说一下吧。

我想知道VA怎么做。
但是VA现有的教程不太适应新手学习。

所以我先看XP的教程,看到里面写脚本的思路,然后按到VA上照猫画虎。

您需要我现在写的sence脚本来看一下么?
作者: 后知后觉    时间: 2012-12-3 12:30
本帖最后由 后知后觉 于 2012-12-3 12:42 编辑

不管是脚本新手还是老手.要在陌生的脚本里增减删.读脚本是必不可少的
脚本不外乎就是由对象的创建、方法的调用以及流程控制(条件分歧、循环等)这几个基础的方面构成.
默认脚本里有一个 SceneManager 的模块.这是专门用来管理场景的模块.
里面有这样的3个方法

  1.   #--------------------------------------------------------------------------
  2.   # ● 直接切换某个场景(无过渡)
  3.   #--------------------------------------------------------------------------
  4.   def self.goto(scene_class)
  5.     @scene = scene_class.new
  6.   end
  7.   #--------------------------------------------------------------------------
  8.   # ● 切换
  9.   #--------------------------------------------------------------------------
  10.   def self.call(scene_class)
  11.     @stack.push(@scene)
  12.     @scene = scene_class.new
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 返回到上一个场景
  16.   #--------------------------------------------------------------------------
  17.   def self.return
  18.     @scene = @stack.pop
  19.   end
复制代码
你看上面有汉字注释......
这个地方的 self 指的是 SceneManager 这个模块对象.
切换场景的时候就是这样调用
SceneManager.goto(Scene_1)
或者
SceneManager.call(Scene_1)
两者的区别是使用 call 切换的之后.
可以用 SceneManager.return 返回.
比如你现在的当前场景是 Scene_1
这时你调用 SceneManager.call(Scene_2) 进入了 Scene_2
然后你要返回 Scene_1 就可以直接调用 SceneManager.return
如果你是从 Scene_Map 进入的 Scene_2.
那么在 Scene_2 里调用 SceneManager.return 返回的就是 Scene_Map

VA和XP的不同.对按键的判断.VA是在窗口的刷新里.而不是像XP那样在 Scene 脚本里.
VA的 Scene 脚本里基本都是按键以后要调用执行的内容.
可以参考下默认脚本的 Scene_End

不知道你现在的脚本基础如何.就先说这么多咯.

ps.你这样一连发了连续的几帖不大好...
作者: dujian15    时间: 2012-12-3 14:30
后知后觉 发表于 2012-12-3 12:30
不管是脚本新手还是老手.要在陌生的脚本里增减删.读脚本是必不可少的
脚本不外乎就是由对象的创建、方法的 ...

谢谢,至少知道读哪个部分了。


我有一点计算机语言的基础吧,不算太多,脚本配合注释能看懂一部分,看不懂的也能知道怎么用。
大大说的我懂了。

昨天是手机打的,快没电了,我怕白打,所以就只能连发贴了...Sorry.
作者: dujian15    时间: 2012-12-4 09:01
后知后觉 发表于 2012-12-3 12:30
不管是脚本新手还是老手.要在陌生的脚本里增减删.读脚本是必不可少的
脚本不外乎就是由对象的创建、方法的 ...

补充问题:请问让sence影响热键的部分在哪里可以找到?有没有现成的使用范例?
作者: 后知后觉    时间: 2012-12-4 13:44
本帖最后由 后知后觉 于 2012-12-4 13:46 编辑
dujian15 发表于 2012-12-4 09:01
补充问题:请问让sence影响热键的部分在哪里可以找到?有没有现成的使用范例? ...


大部分的对按键的判断都在窗口里  Window_Selectable 这个光标窗口类 以及 其子类

  1.   #--------------------------------------------------------------------------
  2.   # ● 更新画面
  3.   #--------------------------------------------------------------------------
  4.   def update
  5.     super
  6.     process_cursor_move
  7.     process_handling
  8.   end
复制代码
process_handling 就是处理按键判断的 默认只响应 :C :B :R :L 这4个键位.
每个键位都有一个 符号类对象 的标示符 :ok :cancel :pagedown :pageup
然后在创建窗口类对象以后.给该对象设置 标示符对应的 方法类对象.设置用的方法是 set_handler
比如按下:C键后.会根据:C的标示符 :ok .然后根据 :ok 找到方法.然后调用方法.
看 Scene_Status  状态场景 里创建状态窗口的部分

  1.     @status_window = Window_Status.new(@actor)
  2.     @status_window.set_handler(:cancel,   method(:return_scene))
  3.     @status_window.set_handler(:pagedown, method(:next_actor))
  4.     @status_window.set_handler(:pageup,   method(:prev_actor))
复制代码
:cancel 对应的是 return_scene 这个方法
当按下 :B 的时候 就通过标示符 :cancel 找到该方法对象并调用
这里没有设置 :ok 对应的方法类对象 所以按下:C键的时候没有任何反映.
如果想要对 :C :B :R :L 以外的键位响应
可以不按照他这个格式.自己加到相应的 update 方法里就好了.根据自己的需要.
比如在 Scene_Status 里加这样的几行

  1.   def update
  2.     super
  3.     RPG::BGM.new("Battle4").play if Input.trigger?(:X)
  4.   end
复制代码
进入状态场景后按键盘上面的 A 键 就可以改变背景音乐

作者: dujian15    时间: 2012-12-7 08:41
后知后觉 发表于 2012-12-4 13:44
大部分的对按键的判断都在窗口里  Window_Selectable 这个光标窗口类 以及 其子类process_handling 就是 ...

大神您好,我想请教一个问题。

我想返回一个人是否学会哪一种技能例如,例如1号actor学会“特技”和“魔法”,数据库里默认技能种类中,“技能”的编号是1,那么
@actors[1].stype.include?(1) 的返回值为true
有没有现成的函数,或者需要怎么写?

我有一个想法,就是遍历这个actor的所有技能,再返回每一种技能种类,如果所有的种类中,含有stype_id == 1的情况返回true 否则返回false 不知道这样可以不?

但是如何遍历一个actor的所有skills,编译老说找不到方法。


for i in 0 .. ( $game_party.members.size - 1 ) do
      
      for j in 0 .. ( $game_party.members.skills.size ) do

        if $game_party.members.skills[j].stype_id == $data_skills[@Skill_id].stype_id


后面的balabalabala~~
作者: 后知后觉    时间: 2012-12-7 13:29
dujian15 发表于 2012-12-7 08:41
大神您好,我想请教一个问题。

我想返回一个人是否学会哪一种技能例如,例如1号actor学会“特技”和“魔 ...

你想要知道某个对象都有些什么现成方法/函数.首先需要知道他是哪个类的.类名是什么.
角色分为 数据库角色 和 游戏中的角色
数据库角色的类名是 RPG::Actor 实例对象都保存在 $data_actors 这个数组里
游戏中的角色类名是 Game_Actor 实例对象都保存在 Game_Actors 这个类的实例对象 $game_actors 里
你想知道游戏中的角色是否学会某技能.可以去 Game_Actor 这个类里找 或者去他的父类里找.

  1.   #--------------------------------------------------------------------------
  2.   # ● 判定技能是否已经学会
  3.   #--------------------------------------------------------------------------
  4.   def skill_learn?(skill)
  5.     skill.is_a?(RPG::Skill) && @skills.include?(skill.id)
  6.   end
复制代码
这里需要的 skill 参数是 保存在 $data_skills 数组里的 RPG::Skill 类的实例对象...数据库技能

  1. for actor in $game_party.members
  2.   if actor.skill_learn?($data_skills[1])
  3.     msgbox "ok"
  4.   end
  5. end
复制代码
数据库相关类的定义在脚本编辑器里找不到  要去F1里找.
作者: dujian15    时间: 2012-12-14 11:18
后知后觉 发表于 2012-12-7 13:29
你想要知道某个对象都有些什么现成方法/函数.首先需要知道他是哪个类的.类名是什么.
角色分为 数据库角色 ...

大神您好。

在windows类中,需要显示一段文字。

带有控制符的文字的显示方法是draw_text_ex 但是不可以自动换行。

我读了很多脚本,看有的脚本只引用了content

但有的脚本却用到了bitmap
我现在很混乱,能否帮助区分一下?

我现在练习写一个帮助系统。

左侧是一个菜单栏,右侧是主窗口。

通过选择左侧的选项,变换右铡的内容。

如果要一个窗口一个窗口的描绘,很容易实现,但是那样这个脚本没有什么延展性。

我想的做法是model一堆变量,然后其中有一个变量的内容是text = "一堆一堆的文字"+"另一堆一堆的文字",中间还要带上控制符,如"\\n"是换行什么的。

我想需要在主窗口中写一个方法,碰到控制符应该怎么做。

这个很多日文脚本中见到过,不知道默认脚本里有没有可参考的?
作者: 后知后觉    时间: 2012-12-14 13:49
本帖最后由 后知后觉 于 2012-12-14 13:56 编辑
dujian15 发表于 2012-12-14 11:18
大神您好。

在windows类中,需要显示一段文字。


你可以把默认的 Window_Help 看成是你的主窗口
把 物品窗口 装备窗口 技能窗口 这类的看成是你的 左侧选项窗口

窗口类里的 contents 其实就是 Bitmap 类的实例对象.
Sprite 类里的 bitmap 也是 Bitmap 类的实例对象.
这些只不过是方法名而已.
方法名、变量名.只要不取保留字.别的爱怎么叫就怎么叫.便于自己阅读和记忆就好.
关键是他返回的东西是什么类的实例对象.
要查看某个东西的类名是什么. 可以用 class 方法获取.
比如你在某个窗口类的初始化的时候里的 super 下面加一行
msgbox contents.class
然后运行 就能看到 contents 是什么玩意了

自动换行
你看 def draw_text_ex 里面调用的内容 一层一层的往下找
里面调用了一个 process_character
很明显这个就是描绘文字的具体过程...所以就去找 def process_character
里面的注释说 process_normal_character 是描绘普通文字
然后去找 def process_normal_character

  1.   #--------------------------------------------------------------------------
  2.   # ● 处理普通文字
  3.   #--------------------------------------------------------------------------
  4.   def process_normal_character(c, pos)
  5.     text_width = text_size(c).width
  6.     draw_text(pos[:x], pos[:y], text_width * 2, pos[:height], c)
  7.     pos[:x] += text_width
  8.   end
复制代码
text_width 获取描绘当前的文字需要的宽度
pos[:x] 获取当前描绘的 x 坐标
有了这2个东西就可以做判断了
if text_width + pos[:x] > contents_width
  #换行
    pos[:x] = pos[:new_x]
    pos[:y] += pos[:height]
end

换行那2句是从 def process_new_line 里复制过来的
作者: dujian15    时间: 2012-12-14 14:35
后知后觉 发表于 2012-12-14 13:49
你可以把默认的 Window_Help 看成是你的主窗口
把 物品窗口 装备窗口 技能窗口 这类的看成是你的 左侧选 ...

我想给一个类制作一个新的方法。

比如,在默认脚本中,有一个

class A < B

def ini
end

def 方法1
end

def 方法2
end

end



然后我在自己的脚本里想给A追加一个新的方法,我需要重新描述所有的方法,还是直接
class A < B
def 方法3
end
end

?
作者: 后知后觉    时间: 2012-12-14 18:31
本帖最后由 后知后觉 于 2012-12-14 18:42 编辑
dujian15 发表于 2012-12-14 14:35
我想给一个类制作一个新的方法。

比如,在默认脚本中,有一个


直接定义 方法3 就可以了
如果再次定义方法1 方法2 的话 .就会有替换覆盖的作用.
很多脚本冲突就是因为 他们对某个默认脚本中的同一方法都进行了再定义.而实际情况只会以最后一次定义为准.
也就是更靠近 Main 脚本的地方

还有种情况就是在现有基础上给某方法增加点内容.而不是完全替换
可以用  alias 取别名
这是我自装备系统里的一小段

  1.   alias hzhj_equip_system_param_plus param_plus
  2.   def param_plus(param_id)
  3.     plus = hzhj_equip_system_param_plus(param_id)
  4.     val = equips.compact.inject(plus) {|r, e| r += e.gps[param_id] }
  5.     val + RPG::EquipItem.esp(equip_set, param_id)
  6.   end
复制代码
作用就是在现有 param_plus 的效果上追加一点内容

作者: dujian15    时间: 2012-12-17 22:30
后知后觉 发表于 2012-12-14 18:31
直接定义 方法3 就可以了
如果再次定义方法1 方法2 的话 .就会有替换覆盖的作用.
很多脚本冲突就是因为  ...

大神您好,又要麻烦您了。

是这样了,我看到您写过装备脚本,我下一步也打算从装备脚本和战斗系统动刀。

问题1:  初期的想法是这样的,系统中人物的八围 血 魔 物攻 物防 魔攻 魔防 敏捷 幸运

可以被看作是 血 魔 力量 体质 智力 精神 敏捷 幸运 对应三个攻击属性 三个防御属性

我是这么想的,如果想做出职业特色来,就需要让不同的属性决定某种职业的技能伤害或者技能加成。

如 战士这个职业,力量在增加伤害的同时,还增加爆击伤害 表问默许脚本里有没有关于属性换算的部分,比如多少敏捷折算成1%的爆击神马的。


问题 2 战斗系统的描述,我想仿魔力宝贝,增加战斗距离和格子攻击的概念。

具体的描述是这样的:


敌人方画出一个3 * 5矩阵 我方是 3 * 3 的矩阵

敌敌敌
敌 我我我
敌敌敌 我我我
敌 我我我
敌敌敌

当第一排有敌人时 不能攻击到后一排的敌人。

然后也可以定义技能的攻击距离 如弓术和魔法可以不受战斗距离限制。

技能的攻击除了单体和全体外,还可以增加十字攻击 或者打击一排这种。

不求您能告诉我写的方法,我想知道我应该需要先读哪一部分的脚本,如果这么写,会不会影响到重新编写AI?。

问题 3 这个相对简单一点

新的战斗资源 能量 EP值  每回合固定恢复40 最大值100 可以受到一些装备的加成 如 增加到110 同时这个人也使用法力。所以 不能用MP值山寨。

需要找到哪一部分脚本,然后在技能中如何设置?应该是修改备注吧。

问题 4 宠物系统的思路。

我的想法是
1 用不着抓宠物 完全是任务获得 然后再通过任务进化宠物。(脚本解决 无须多言 )

2 宠物和队友一样 但宠物不出现在菜单中 只在特定列表中出现,这个目前我也能做到。

3 宠物也是队友 但不出现在队友的火车中

4 六个人加上三只宠物 队伍一共九人 宠物自动战斗 不需要人来控制。
  但 队伍中的位置需要分人 人物位置 和宠物位置 宠物超过三只 人物超过六人 则不能入队。

以上四个问题比较复杂,如果大神时间 紧张 告诉我需要读哪部分的脚本,我自己找找看。

不知大神还有什么其它的联系方式?
作者: 后知后觉    时间: 2012-12-18 00:57
dujian15 发表于 2012-12-17 22:30
大神您好,又要麻烦您了。

是这样了,我看到您写过装备脚本,我下一步也打算从装备脚本和战斗系统动刀。 ...

1.
除了敏捷和幸运.别的属性好像都是相对独立的 没参与什么东西的计算
处理战斗伤害是调用的 Game_Battler 类的 item_apply
命中.躲避.波动.暴击.什么的都可以通过他找到.

2.
这个其实就是一个 技能、物品 的 【效果范围】的扩展.
Game_Action 类的 make_targets 就是生成 目标对象数组 的
把角色和战斗的2个矩阵看成是2个坐标系.最左上方的那点是 0,0 坐标
这样就可以通过 角色 和敌人的  index 计算出 矩阵中的坐标.
计算方法可以参考 光标窗口类里对光标位置的计算.
然后根据扩展的效果范围寻找作用对象.
可以以未知点的相对坐标为数据来进行设置效果范围.
比如我现在设置一个哈希表 内容是这样的
hash = {13 => [[0,0], [-1, 0], [1, 0], [0, -1], [0, 1]]}
13是新扩展的 scope.其值是一个以相对坐标为数据的数组
所谓的未知点就是玩家手动选择的攻击目标.
比如玩家选择了 index 为 4 的敌人.计算出 4 对应的坐标是 1,1
然后循环这个相对坐标数组  [[0,0], [-1, 0], [1, 0], [0, -1], [0, 1]]
就能算出 5 个坐标.然后就可以找到实际要攻击的敌人.我写的这是个十字坐标.
当然了这是我的方法 你可以自己去寻找别的更高效更方便设置的方法

3.
武器和护甲的父类是 RPG::EquipItem
在 F1 里能找到相关说明. RPG:: 这样开头的都是 数据库 的内容 要去F1里找
要给装备增加新的属性  可以在这个类里定义.
然后具体可以参考 mhp mmp 看默认脚本是怎么把装备属性算进角色能力里去的
至于每回合回复
可以去 Scene_Battle 的 turn_end 里加句子

4.修改 Game_Party 的 battle_members

作者: dujian15    时间: 2012-12-18 08:24
后知后觉 发表于 2012-12-18 00:57
1.
除了敏捷和幸运.别的属性好像都是相对独立的 没参与什么东西的计算
处理战斗伤害是调用的 Game_Battle ...

追问,F1有中文版的么?
完全不懂日文......
作者: dujian15    时间: 2012-12-20 15:19
后知后觉 发表于 2012-12-18 00:57
1.
除了敏捷和幸运.别的属性好像都是相对独立的 没参与什么东西的计算
处理战斗伤害是调用的 Game_Battle ...

大神您好,又有新问题请教了。


由于改动战斗系统,可能要重新绘制战场,所以在研究精灵操作。

早期做一些简单的例如技能商店的脚本只,只需要写好window和sence,就可以了。而且可以通过事件,直观的看到。

但是精灵应该如何使用,我现在完全摸不到头脑。

有没有适用的教程可以参考的?

我主要就是想在战斗界面中,在人物和地图之间,再显示一个精灵,就是画我上次说的格子。
作者: cjlzbb    时间: 2012-12-20 16:30
dujian15 发表于 2012-12-20 15:19
大神您好,又有新问题请教了。

我跟你一样想做那种有距离的回合制,用地球村的sideview,不过想法有些不同。  

我是想给每个角色开个变量,角色1对应变量1 等等。然后随着变量1改变而改变坐标————同时改变状态。状态限制技能的使用,也就是例如以下这个例子

攻击,除“1米内”状态之外的其他状态都会沉默“攻击”技能。然后用“前进”或“后退”技能则能改变变量和状态。

但是现在卡在了变量改变坐标,其他都搞定了。你能帮下我么
作者: dujian15    时间: 2012-12-20 16:41
cjlzbb 发表于 2012-12-20 16:30
我跟你一样想做那种有距离的回合制,用地球村的sideview,不过想法有些不同。  

我是想给每个角色开个变 ...

我才有想法,还一点都没有开动......

我的想法是,两个矩阵 E矩阵和A矩阵

EEEEAAA
EEEEAAA
EEEEAAA
EEEEAAA
EEEEAAA

整个矩阵命名为B 其中E与A坐标独立。

E与A之间的坐标换算关系为
大矩阵 B与E的换算关系为 B= E
与A为 B = A + 4

然后为这个矩阵画上7 * 5个矩形。

然后根据E和A的坐标,向sideview和$game_troop分别返回人物坐标,这样人物显示就没有问题了。

接下来所有的逻辑都封装到这个矩阵方法中了。

想到的矩阵方法:

1 换算 换算E A B三者的关系。六个方法
2 换算屏幕坐标 一个就行 用来保持与主程序的通信。
3 攻击距离计算: A - E或者 E - A      我是仿魔力宝贝的系统  同名小矩阵下战斗距离都为零。
4 攻击范围的扩展:如十字 整排


但是目前如何在战斗界面里 显示这个矩阵,我一点头脑没有。
最初是想显示个window_selectable的窗口,然后背景透明化。

但这窗口永远显示在人物之前,失败。

那就只能自己手动写精灵了。

问题1 我所知道的精灵只是一个显示动画的东西?可以像用window一样用么?
问题2 sence_battle的解析。
问题3 怎样测试精灵,以便即时观察效果
解决不掉这三个问题,我怕我也只能是停留在理论层次了,兄弟。
作者: dujian15    时间: 2012-12-20 16:52
dujian15 发表于 2012-12-20 16:41
我才有想法,还一点都没有开动......

我的想法是,两个矩阵 E矩阵和A矩阵

兄弟啊,不学脚本,做游戏永远得现别人的脚本妥协。

这种妥协的结果可能会是剧情,平衡全都飞掉……不好控制……
作者: 后知后觉    时间: 2012-12-21 20:41
从表面上看 精灵 是比窗口 在图像显示上更为基层的东西.
有些人用 精灵 重写 Window 总类.
不过实际中 默认的 Window 类貌似并不是用 精灵写的.
你可以把精灵看成是具有更多图像显示特效的无边框透明窗口.不过没有光标.
战斗场景默认的 所有精灵都集中在 Spriteset_Battle 里集中管理.
要控制好精灵和窗口的显示层级.除了调整他们的 z 值外.
还有另外一个很重要的东西  视口 Viewport
还有就是 z 是可以弄为 负数 的.
作者: dujian15    时间: 2013-1-18 17:41
后知后觉 发表于 2012-12-21 20:41
从表面上看 精灵 是比窗口 在图像显示上更为基层的东西.
有些人用 精灵 重写 Window 总类.
不过实际中 默认 ...

大神您好,打搅了。

还是回问技能范围。

原有的技能范围不太够用,我想进行扩展。

但苦于不会设置,不知能不能介绍一下设置的大概方法,或者我没有说明白的话,追问一下




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