Project1
标题: 谁能告诉我这个脚本是什么原理 [打印本页]
作者: clear仔 时间: 2013-3-16 10:27
标题: 谁能告诉我这个脚本是什么原理
本帖最后由 clear仔 于 2013-3-16 10:28 编辑
这个伤害美化脚本是我在别的游戏里找出来的
(因为它有显示SP伤害的功能么)
谁能告诉我它显示SP伤害的原理
这是一个XP脚本
module RPG
class Sprite < ::Sprite
def damage(value, critical)
dispose_damage
damage_string = value.to_s
if damage_string[0].chr == "s"
sp_recover = true
damage_string = damage_string[1,damage_string.size]
value = damage_string.to_i
elsif damage_string[0].chr == "b"
both = true
damage_string = damage_string[1,damage_string.size]
value = damage_string.to_i
damage_string = (value/2).to_s
elsif damage_string[0].chr == "g"
gray = true
damage_string = damage_string[1,damage_string.size]
value = damage_string.to_i
end
bitmap = Bitmap.new(160, 48)
if value.is_a?(Numeric)
damage_string = value.abs.to_s unless both
bitmap.font.name = "Arial Black"
bitmap.font.size = 32
else
bitmap.font.color.set(200, 200, 200)
damage_string = value.to_s
damage_string = "未命中" if damage_string == "Miss"
bitmap.font.bold = true
end
bitmap.font.color.set(0, 0, 0)
unless both
bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
end
if sp_recover
if value < 0
bitmap.font.color.set(100, 180, 255)
elsif sp_recover>0
bitmap.font.color.set(100, 100, 255)
elsif sp_recover<0
bitmap.font.color.set(207, 6, 142)
end
elsif gray
bitmap.font.color.set(200, 200, 200)
elsif both
#bitmap.font.color.set(255, 100, 255)
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-20-1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(-20+1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(-20-1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(-20+1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(20-1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(20+1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(20-1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(20+1, 12+1, 160, 36, damage_string, 1)
bitmap.font.color.set(255, 100, 100)
bitmap.draw_text(-20, 12, 160, 36, damage_string, 1)
bitmap.font.color.set(100, 100, 255)
bitmap.draw_text(20, 12, 160, 36, damage_string, 1)
elsif value.is_a?(Numeric)
if value < 0
#bitmap.font.color.set(176, 255, 144)
bitmap.font.color.set(144, 255, 176)
elsif value == 0
bitmap.font.color.set(200, 200, 200)
else
bitmap.font.color.set(255, 100, 100)
end
else
bitmap.font.color.set(255, 255, 255)
end
bitmap.draw_text(0, 12, 160, 36, damage_string, 1) unless both
if critical
bitmap.font.size = 20
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
#bitmap.font.color.set(255, 255, 255)
bitmap.font.color.set(86, 255, 42)
bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
end
@_damage_sprite = ::Sprite.new(self.viewport)
@_damage_sprite.bitmap = bitmap
@_damage_sprite.ox = 80
@_damage_sprite.oy = 20
@_damage_sprite.x = self.x
@_damage_sprite.y = self.y - self.oy / 2
@_damage_sprite.z = 3000
@_damage_duration = 40
end
end
end
module RPG
class Sprite < ::Sprite
def damage(value, critical)
dispose_damage
damage_string = value.to_s
if damage_string[0].chr == "s"
sp_recover = true
damage_string = damage_string[1,damage_string.size]
value = damage_string.to_i
elsif damage_string[0].chr == "b"
both = true
damage_string = damage_string[1,damage_string.size]
value = damage_string.to_i
damage_string = (value/2).to_s
elsif damage_string[0].chr == "g"
gray = true
damage_string = damage_string[1,damage_string.size]
value = damage_string.to_i
end
bitmap = Bitmap.new(160, 48)
if value.is_a?(Numeric)
damage_string = value.abs.to_s unless both
bitmap.font.name = "Arial Black"
bitmap.font.size = 32
else
bitmap.font.color.set(200, 200, 200)
damage_string = value.to_s
damage_string = "未命中" if damage_string == "Miss"
bitmap.font.bold = true
end
bitmap.font.color.set(0, 0, 0)
unless both
bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
end
if sp_recover
if value < 0
bitmap.font.color.set(100, 180, 255)
elsif sp_recover>0
bitmap.font.color.set(100, 100, 255)
elsif sp_recover<0
bitmap.font.color.set(207, 6, 142)
end
elsif gray
bitmap.font.color.set(200, 200, 200)
elsif both
#bitmap.font.color.set(255, 100, 255)
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-20-1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(-20+1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(-20-1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(-20+1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(20-1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(20+1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(20-1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(20+1, 12+1, 160, 36, damage_string, 1)
bitmap.font.color.set(255, 100, 100)
bitmap.draw_text(-20, 12, 160, 36, damage_string, 1)
bitmap.font.color.set(100, 100, 255)
bitmap.draw_text(20, 12, 160, 36, damage_string, 1)
elsif value.is_a?(Numeric)
if value < 0
#bitmap.font.color.set(176, 255, 144)
bitmap.font.color.set(144, 255, 176)
elsif value == 0
bitmap.font.color.set(200, 200, 200)
else
bitmap.font.color.set(255, 100, 100)
end
else
bitmap.font.color.set(255, 255, 255)
end
bitmap.draw_text(0, 12, 160, 36, damage_string, 1) unless both
if critical
bitmap.font.size = 20
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
#bitmap.font.color.set(255, 255, 255)
bitmap.font.color.set(86, 255, 42)
bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
end
@_damage_sprite = ::Sprite.new(self.viewport)
@_damage_sprite.bitmap = bitmap
@_damage_sprite.ox = 80
@_damage_sprite.oy = 20
@_damage_sprite.x = self.x
@_damage_sprite.y = self.y - self.oy / 2
@_damage_sprite.z = 3000
@_damage_duration = 40
end
end
end
还有两个问题:
1.为什么在使用恢复SP的物品时,第9行的.chr为什么会报错,chr不是内部方法吗?
2.我在将其美化时,我在64行换成了:
if sp_recover > 0
bitmap.font.color.set(100, 100, 255)
elsif sp_recover < 0
bitmap.font.color.set(241, 60, 255)
if sp_recover > 0
bitmap.font.color.set(100, 100, 255)
elsif sp_recover < 0
bitmap.font.color.set(241, 60, 255)
为什么会报错,而且是关于大于号和小于号的错误,我真是弄不明白
最后说一句:
如果原作者看到了请不要生气我拿了你的脚本,如果还能解决我的疑惑,那将是感激不尽。{:2_275:}
作者: asd1321259972 时间: 2013-3-16 10:55
如果sp_recover > 0bitmap字体颜色设置。。。(100,100,255)elsif sp_recover<0bitmap字体颜色设置。。。(241,60,255
作者: asd1321259972 时间: 2013-3-16 11:13
如果sp_恢复 > 位图图像字体颜色设置。。。(100,100,255)elsif sp_恢复<位图图像字体颜色设置。。。(241,60,255
作者: asd1321259972 时间: 2013-3-16 11:16
asd1321259972 发表于 2013-3-16 11:13 
如果sp_恢复 > 位图图像字体颜色设置。。。(100,100,255)elsif sp_恢复<位图图像字体颜色设置。。。( ...
第九行的翻译是 sp恢复=正确
作者: jhhuang 时间: 2013-3-16 12:03
1.为什么在使用恢复SP的物品时,第9行的.chr为什么会报错,chr不是内部方法吗?
# 如果伤害字符串第一个字符是"s"
if damage_string[0].chr == "s"
如果你打出的伤害不是字符或数字就可能引起出错,你战斗类应该也做了修改,要从战斗类伤害输出找问题.
2.我在将其美化时,我在64行换成了:
在使用sp_recover前我好像没看到有赋值语句,所以sp_recover应该是nil(什么都没有).
nil不是一个数字,不能nil > 0比大小
作者: clear仔 时间: 2013-3-16 15:52
jhhuang 发表于 2013-3-16 12:03 
1.为什么在使用恢复SP的物品时,第9行的.chr为什么会报错,chr不是内部方法吗?
# 如果伤害字符串第一个字 ...
那么,具体应该怎么改呢
第一个,在“GAMEBATTLER3” 里的“应用物品效果”的“HP SP回复”里
加这一句行么:
if sp_recover
self.damage = "s" + sp_recover.to_s
sp+=self.damage
elsif sp_recover and hp_recover
self.damage = "b" +(sp_recover+hp_recover).to_s
self.hp += hp_recover
self.sp += sp_recover
else
self.hp += hp+recover
end
第二个完全不知道应该怎么改
作者: jhhuang 时间: 2013-3-16 16:12
clear仔 发表于 2013-3-16 15:52 
那么,具体应该怎么改呢
第一个,在“GAMEBATTLER3” 里的“应用物品效果”的“HP SP回复”里
加这一句行 ...
居然你在其他工程找来的,你应该参照工程里和攻击,特技使用和物品使用的damage相关数据
你说的
if sp_recover
self.damage = "s" + sp_recover.to_s
sp+=self.damage
...
....
打个比方,sp_recover是1,那么
self.damage 得到的是一个"s1"字符串
下面的sp应该是一个数字数据
sp+=self.damage # 一个数字加上一个字符串,会出错.
作者: clear仔 时间: 2013-3-16 16:27
jhhuang 发表于 2013-3-16 16:12 
居然你在其他工程找来的,你应该参照工程里和攻击,特技使用和物品使用的damage相关数据
你说的
那应该怎么改才能使.chr不出错呢,还有第二个问题
(附一句:我找来的那个工程里没有物品)
作者: jhhuang 时间: 2013-3-16 16:36
clear仔 发表于 2013-3-16 16:27 
那应该怎么改才能使.chr不出错呢,还有第二个问题
(附一句:我找来的那个工程里没有物品) ...
他这个脚本应该是分别带有"s""b""g"三种显示方式的,s指sp
不过你使用物品恢复,会存在一个可以同时恢复hp和sp的问题,这种时候,你打算怎么显示?它默认只显示一次.
作者: clear仔 时间: 2013-3-16 19:12
本帖最后由 clear仔 于 2013-3-16 19:30 编辑
jhhuang 发表于 2013-3-16 16:36
他这个脚本应该是分别带有"s""b""g"三种显示方式的,s指sp
不过你使用物品恢复,会存在一个可以同时恢复hp ...
这样可以么:
if recover_hp and recover_sp=nil
self.damage = -recover_hp.to_s
elsif recover_sp and recover_hp=nil
self.damage = "s"+recover_sp.to_s
elsif recover_hp and recover_sp
self.damage = "b"+((recover_hp+recover_sp)/2).to_s
#我用的回复sp和hp的物品值都是一样的所以这里就无所谓了
else
@damage_pop=nil
end
作者: jhhuang 时间: 2013-3-16 19:40
clear仔 发表于 2013-3-16 19:12 
这样可以么:
if recover_hp not recover_sp
self.damage = -recover_hp.to_s
语法错误....
我随便写,你测试下自己改吧...
作者: clear仔 时间: 2013-3-16 22:01
jhhuang 发表于 2013-3-16 19:40 
语法错误....
好吧,谢谢
不过我还有最后一个疑惑:(我是不是有点贪得无厌啊......但是,无论怎么样,这是最后的问题了)
您应该知道“公共事件的战斗特效”吧
原帖:http://rpg.blue/article-40610.html
我用了其中的"SP吸收效果"
但是如果用我这个脚本会导致显示的伤害是"s伤害值"并且是白色的
我想让它变成蓝色(运用我这个脚本).......
好吧,上范例
Project2.zip
(230.29 KB, 下载次数: 14)
好人!感激不尽
作者: jhhuang 时间: 2013-3-16 22:43
本帖最后由 jhhuang 于 2013-3-16 22:46 编辑
clear仔 发表于 2013-3-16 22:01 
好吧,谢谢
不过我还有最后一个疑惑:(我是不是有点贪得无厌啊......但是,无论怎么样,这是最后的问题 ...
这个脚本根本就是错误繁多...你是不是自行修改过?
它前面@recover_sp = true
把@recover_sp赋成保留字.
后面居然又写
if @recover_sp
if value < 0
bitmap.font.color.set(100, 180, 255)
elsif @recover_sp>0
bitmap.font.color.set(50, 30, 255)
elsif @recover_sp<0
bitmap.font.color.set(207, 6, 142)
end
---------------------
@recover_sp>0 这样的居然拿保留字和数字做比较,会出错的.
PS:这个@recover_sp是一个用来判断是否显示为SP的变量,不是用来记录SP数量的变量.
作者: clear仔 时间: 2013-3-17 11:10
本帖最后由 clear仔 于 2013-3-17 11:30 编辑
jhhuang 发表于 2013-3-16 22:43 
那么怎么改才能显示使用物品SP的回复量呢
还有那个公共事件战斗特效的问题
作者: jhhuang 时间: 2013-3-17 11:39
clear仔 发表于 2013-3-17 11:10 
修改了公共事件和伤害脚本.
Project2.rar
(217.68 KB, 下载次数: 19)
作者: clear仔 时间: 2013-3-17 12:50
jhhuang 发表于 2013-3-17 11:39 
可是使用物品的SP回复值还是显示不出来啊
并且使用了SP吸收技能的角色,之后的HP伤害也变成蓝色的了.......
(真是不好意思,问了这么多问题)
作者: jhhuang 时间: 2013-3-17 13:33
修改了
Game_Battler 3
sprite
Project2.rar
(217.88 KB, 下载次数: 28)
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |