)
这句是生成时间对象的语句,我们新建个方法来替换它,这里我们就要开始判断事件的类型了。
首先这里,我想名字开头是enemy的就初始化成Game_Enemy对象,friend就初始化成Game_Friend对象,否则就还是默认初始化成Game_Event
最好给个data_id之类的单独的id方便区分
下面用到正则表达式
symbol = /\D+/.match(@map.events[i].name).to_s#匹配开头的连续字母
symbol = /\D+/.match(@map.events[i].name).to_s#匹配开头的连续字母
[/pre]
然后再判断symbol:
case symbol
when "enemy"
@events[i] = Game_Enemy.new(@map_id, @map.events[i])
@events[i].data_id = /\d+/.match(@map.events[i].name).to_s.to_i#还可以给个数据的id,这个匹配后面的数字
when "friend"
@events[i] = Game_Friend.new(@map_id, @map.events[i])
@events[i].data_id = /\d+/.match(@map.events[i].name).to_s.to_i#还可以给个数据的id,这个匹配后面的数字
else
@events[i] = Game_Event.new(@map_id, @map.events[i])
end
case symbol
when "enemy"
@events[i] = Game_Enemy.new(@map_id, @map.events[i])
@events[i].data_id = /\d+/.match(@map.events[i].name).to_s.to_i#还可以给个数据的id,这个匹配后面的数字
when "friend"
@events[i] = Game_Friend.new(@map_id, @map.events[i])
@events[i].data_id = /\d+/.match(@map.events[i].name).to_s.to_i#还可以给个数据的id,这个匹配后面的数字
else
@events[i] = Game_Event.new(@map_id, @map.events[i])
end
这样比如事件名字是enemy8,就会初始化成Game_Enemy,data_id赋值成8
[line]2[/line]
剩下的就照葫芦画瓢了,再这两个类的初始化里面,我们要新增初始化的代码来给事件对象赋值,这里我直接判断第一页的:
这里我直接读取第一页事件开头的连续的每一行注释,每一行单独拿出来检查执行,直到读到不是注释
def initialize(map_id,event)
super
i = 0
while event.pages[0].list[i] != nil and (event.pages[0].list[i].code == 108 or event.pages[0].list[i].code == 408)
text = event.pages[0].list[i].paramters[0]
check_text(text)#检查并应用文本
i+=1
end
end
def initialize(map_id,event)
super
i = 0
while event.pages[0].list[i] != nil and (event.pages[0].list[i].code == 108 or event.pages[0].list[i].code == 408)
text = event.pages[0].list[i].paramters[0]
check_text(text)#检查并应用文本
i+=1
end
end
然后再实现检查文本:
def check_text(text)
sym = /\D+/.match(text).to_s
num = /\d+/.match(text).to_s.to_i
case sym
when "atk"
@atk = num
when "hp"
@hp = num
#bla bla bla bla
#加上你自己定下的属性
end
end
def check_text(text)
sym = /\D+/.match(text).to_s
num = /\d+/.match(text).to_s.to_i
case sym
when "atk"
@atk = num
when "hp"
@hp = num
#bla bla bla bla
#加上你自己定下的属性
end
end
这样,在注释里写上:
"
hp100
atk30
"
就可以把@hp赋值成100,@atk赋值成30,以此类推
[line]2[/line]
这样操作的时候就可以直接判断某事件e:
e.is_a?(Game_Enemy)来判断是不是敌人,是的话就直接
e.atk e.hp来进行操作就好了
当然这里只是举了个栗子,想要有不同的匹配规则在不同的地方设置都是完全可以的。
上面的代码没有经过完备的测试,纯手打,可能会有bug或者笔误,大致思路就是这样,还希望楼主勤动手哦~
作者: 719783572 时间: 2018-7-20 21:25
还有就是调用问题,比较有疑惑,比如自己建的Enemy类里的实例变量,攻击防御生命之类的,怎么调用?我的思路是ARPG战斗部分用公共事件的脚本来写,但是涉及到战斗伤害计算等数据势必要调用Enemy这个类里的数据,如果建立局部变量导入的话,不同的脚本框里的局部变量无法共用,而写脚本的话靠事件脚本里的十二行肯定不够用,有时候还要涉及到事件页的变化,全局变量也肯定不行,如果用全局变量会导致地图上多个敌人的时候存储血量的地址是共用的,会出现bug,想想最好的办法就是每个地图上的事件作为独立的对象读取class里的数据,但是没思路,不知道怎么实现......
作者: guoxiaomi 时间: 2018-7-20 23:24
在脚本编辑器里扩充 Interpreter 类:
- class Interpreter
- def method_01
- ...
- end
- ...
- end
复制代码
可以在事件脚本里直接调用函数 method_01,这些数据可以用全局变量 $enemies = [Enemy.new] 存着~
作者: 719783572 时间: 2018-7-21 01:25
谢谢大佬!不过其实我想问的是,类似于魔塔样板,或者夜想曲那样的,通过事件名字(比如怪物001对应数据库一号的怪物),或者直接事件注释里赋予属性的,这样的脚本可以通过什么思路实现
作者: 灯笼菜刀王 时间: 2018-7-21 10:25
本帖最后由 灯笼菜刀王 于 2018-7-21 10:39 编辑
可以参考game troop, 这里是读取数据库某ID的troop的资料, 然后把它里面的怪按塞到一个数组里储存, 用index来独立化同样ID的怪。
用这个思路, 可以想想, 你要的是 用事件来关联怪的数据, 那把事件ID当做key, 建个哈希表来储存就好了。
为了通用性, 用全局变量来做哈希表
$arpg_troop={}
$arpg_troop[$game_map.events[id]] = Game_Enemy.new(0,id)
这样就让事件和敌人关联起来了 $arpg_troop[@event_id] 得到的就是这个事件的"敌人属性"
当然,直接这样做会有问题的, 你要先到game_enemy里, 把troop_id = 0 的情况定义为 读取 数据库的敌人而不是队伍敌人
然后在考虑怎么分辨地图事件, 只让需要当敌人的事件塞到哈希表里, (最直接的当然是用名字或者事件备注法来判断, 预先在脚本里设置好对应的ID和敌人然后像默认队伍一样处理更是好方法~)
最后,考虑要在什么时候加载这个哈希表, 如何加载之类的(重定义 scene_map的初始化是一个方法, 直接在场所转移的时候加载下个地图的敌人更是一个好方法, 在每个地图用自动执行来加载是最简单的方法)
作者: 七重 时间: 2018-7-21 14:52
关于怎么调用,如果是做事件arpg的话,比如是最为常见的触碰敌人掉血,被敌人的子弹打中掉血两种行为。
在接触的时候,就可以记录下对玩家产生行为的对象编号,这个时候就可以更加编号读取到敌人的攻击力,从而计算玩家的伤害值。
反之亦然。
另外说那12行其实狠一点还是能写蛮多>v<、善用 代入 \ 与 ;三招。
虽然本身是可以把里面的东西定义在解释器里面的(写多长都可以。)
作者: 719783572 时间: 2018-8-7 18:39
想通啦谢谢!
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |