查看: 2686|回复: 16

[已经解决] 谁能告诉我这个脚本是什么原理

[复制链接]
梦石
0
星屑
995
在线时间
180 小时
注册时间
2013-2-16
回帖
146
发表于 2013-3-16 10:27:20 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 clear仔 于 2013-3-16 10:28 编辑

这个伤害美化脚本是我在别的游戏里找出来的
(因为它有显示SP伤害的功能么)
谁能告诉我它显示SP伤害的原理

这是一个XP脚本

[pre lang="ruby" line="1"]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
[/pre]
还有两个问题:
1.为什么在使用恢复SP的物品时,第9行的.chr为什么会报错,chr不是内部方法吗?
2.我在将其美化时,我在64行换成了:
[pre lang="ruby" line="1"]if sp_recover > 0
bitmap.font.color.set(100, 100, 255)
elsif sp_recover < 0
bitmap.font.color.set(241, 60, 255)
[/pre]
为什么会报错,而且是关于大于号和小于号的错误,我真是弄不明白


最后说一句:
如果原作者看到了请不要生气我拿了你的脚本,如果还能解决我的疑惑,那将是感激不尽。{:2_275:}
梦石
0
星屑
1217
在线时间
358 小时
注册时间
2013-1-2
回帖
55

开拓者

发表于 2013-3-16 10:55:53 | 显示全部楼层
如果sp_recover > 0bitmap字体颜色设置。。。(100,100,255)elsif sp_recover<0bitmap字体颜色设置。。。(241,60,255

点评

能说仔细点吗,我听不太懂诶  发表于 2013-3-16 11:08
h
回复

使用道具 举报

梦石
0
星屑
1217
在线时间
358 小时
注册时间
2013-1-2
回帖
55

开拓者

发表于 2013-3-16 11:13:52 | 显示全部楼层
如果sp_恢复 > 位图图像字体颜色设置。。。(100,100,255)elsif sp_恢复<位图图像字体颜色设置。。。(241,60,255
h
回复

使用道具 举报

梦石
0
星屑
1217
在线时间
358 小时
注册时间
2013-1-2
回帖
55

开拓者

发表于 2013-3-16 11:16:29 | 显示全部楼层
asd1321259972 发表于 2013-3-16 11:13
如果sp_恢复 > 位图图像字体颜色设置。。。(100,100,255)elsif sp_恢复<位图图像字体颜色设置。。。( ...

第九行的翻译是  sp恢复=正确

评分

参与人数 1星屑 -10 收起 理由
亿万星辰 -10 误导群众

查看全部评分

h
回复

使用道具 举报

梦石
0
星屑
253
在线时间
574 小时
注册时间
2006-8-25
回帖
772
发表于 2013-3-16 12:03:14 | 显示全部楼层
1.为什么在使用恢复SP的物品时,第9行的.chr为什么会报错,chr不是内部方法吗?
# 如果伤害字符串第一个字符是"s"
if damage_string[0].chr == "s"
如果你打出的伤害不是字符或数字就可能引起出错,你战斗类应该也做了修改,要从战斗类伤害输出找问题.
2.我在将其美化时,我在64行换成了:
在使用sp_recover前我好像没看到有赋值语句,所以sp_recover应该是nil(什么都没有).
nil不是一个数字,不能nil > 0比大小
回复

使用道具 举报

梦石
0
星屑
995
在线时间
180 小时
注册时间
2013-2-16
回帖
146
 楼主| 发表于 2013-3-16 15:52:59 | 显示全部楼层
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

第二个完全不知道应该怎么改

点评

手残,打反了,是recover_hp,sp一样  发表于 2013-3-16 16:18
回复

使用道具 举报

梦石
0
星屑
253
在线时间
574 小时
注册时间
2006-8-25
回帖
772
发表于 2013-3-16 16:12:03 | 显示全部楼层
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 # 一个数字加上一个字符串,会出错.
回复

使用道具 举报

梦石
0
星屑
995
在线时间
180 小时
注册时间
2013-2-16
回帖
146
 楼主| 发表于 2013-3-16 16:27:08 | 显示全部楼层
jhhuang 发表于 2013-3-16 16:12
居然你在其他工程找来的,你应该参照工程里和攻击,特技使用和物品使用的damage相关数据

你说的

那应该怎么改才能使.chr不出错呢,还有第二个问题
(附一句:我找来的那个工程里没有物品)
回复

使用道具 举报

梦石
0
星屑
253
在线时间
574 小时
注册时间
2006-8-25
回帖
772
发表于 2013-3-16 16:36:33 | 显示全部楼层
clear仔 发表于 2013-3-16 16:27
那应该怎么改才能使.chr不出错呢,还有第二个问题
(附一句:我找来的那个工程里没有物品) ...

他这个脚本应该是分别带有"s""b""g"三种显示方式的,s指sp
不过你使用物品恢复,会存在一个可以同时恢复hp和sp的问题,这种时候,你打算怎么显示?它默认只显示一次.
回复

使用道具 举报

梦石
0
星屑
995
在线时间
180 小时
注册时间
2013-2-16
回帖
146
 楼主| 发表于 2013-3-16 19:12:18 来自手机 | 显示全部楼层
本帖最后由 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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部