幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 6453|回复: 66

[已解决] 这个ARPG血条脚本对游戏速度影响很大,有办法优化么?

[复制链接]

40

主题

190

帖子

1635

积分

⑥精研

●~  ●~   ●

积分
1635
发表于 2009-12-21 08:49:49 | 显示全部楼层 |阅读模式
这个脚本用来显示敌人事件头上的血条,敌人名包括了敌人的HP,比如:敌人20,2000,2000,150,260,120,80,50,43
那么20号敌人的MAXHP就是2000,初始HP也是2000,在游戏战斗中敌人血条的减少通过不断修改敌人事件的名字实现,但是对游戏速度影响很大,一般的电脑测试就是23帧左右,有办法优化么?
  1. #简单地图角色头上显示HP,SP
  2. #以下是简单的主角HP显示,其他怪物或NPC显示同此意
  3. class Game_Player < Game_Character
  4. def name
  5.   return $game_party.actors[0].name
  6. end
  7. end
  8. # 添加上面,我就是为了做一个判断,只让主角显示HPSP,如果你是ARPG等都要显示 自己省略
  9. class Sprite_Character < RPG::Sprite
  10.   attr_accessor :character                # 角色
  11.   def initialize(viewport, character = nil)
  12.     super(viewport)
  13.     @character = character
  14.     @sprite = Sprite.new
  15.     @sprite.bitmap = Bitmap.new(160, 220)
  16.     update
  17.   end
  18.   HPSP血条长度 = 30
  19.   alias :update_hp_sp :update
  20.   def update
  21.     update_hp_sp
  22.     @sprite.x = self.x - 115
  23.     @sprite.y = self.y - 150
  24.      
  25.    
  26.    if @character.name.include?("敌人1,")
  27.        name = @character.name
  28.        data = name.split(/,/)  #装载数据
  29.        name = data
  30.      if  @hp != data[1].to_i or @maxhp != data[2].to_i
  31.        @hp = data[1].to_i
  32.        @maxhp = data[2].to_i
  33.        hp = HPSP血条长度/(data[2].to_f/data[1].to_f)
  34.        if $game_switches[204] == true
  35.          hp = 0
  36.        end
  37.        @sprite.bitmap.clear
  38.        @sprite.bitmap.fill_rect(100,100, hp, 2,  Color.new(255,  0, 51))
  39.      end
  40.    end
  41.    。。。。。
  42.    。。。
  43.    。。。。。
  44.    。。。。。。。
  45.    。。。
  46.    if @character.name.include?("敌人20,")
  47.        name = @character.name
  48.        data = name.split(/,/)  #装载数据
  49.        name = data
  50.      if  @hp != data[1].to_i or @maxhp != data[2].to_i
  51.        @hp = data[1].to_i
  52.        @maxhp = data[2].to_i
  53.        hp = HPSP血条长度/(data[2].to_f/data[1].to_f)
  54.        if $game_switches[318] == true
  55.          hp = 0
  56.        end
  57.        @sprite.bitmap.clear
  58.        @sprite.bitmap.fill_rect(100,100, hp, 2,  Color.new(255,  0, 51))
  59.      end
  60.    end
  61. end
  62. end
复制代码
回复

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2009-12-21 09:53:33 | 显示全部楼层
如果是不停的刷新血条当然影响速度。。。因为要不停的对bitmap进行操作。。。。你可以改成,当加血,减血的时候才刷新血条。。。当加魔,减魔才刷新魔条。。档exp发生变化才刷新经验条。。。这样会提高速度。。。因为无谓的bitmap操作减少了
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

40

主题

190

帖子

1635

积分

⑥精研

●~  ●~   ●

积分
1635
 楼主| 发表于 2009-12-21 10:40:05 | 显示全部楼层
血条是在事件头上跟随事件走的啊,这样就一定要刷新了吧?
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2009-12-21 11:59:46 | 显示全部楼层
不要对bitmap操作。。但是可以操作sprite的啊。。。血条使用sprite来显示的。。。bitmap是位图。。sprite把bitmap显示到屏幕上的,那么跟随事件,只要操作sprite的 x,y就可以了,而不需要操作bitmap。。只有当hp mp 变化的时候才刷新bitmap 。。。不知道我说明白了没有。。。。位图的操作才是最吃帧数的。。。当然你可以少调用方法也能提高帧数
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

40

主题

190

帖子

1635

积分

⑥精研

●~  ●~   ●

积分
1635
 楼主| 发表于 2009-12-21 12:07:37 | 显示全部楼层
那应该怎么写啊?对下面两句多加个判断??
if  加血 or 减血
       @sprite.bitmap.clear
       @sprite.bitmap.fill_rect(100,100, hp, 2,  Color.new(255,  0, 51))
end
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2009-12-21 12:34:28 | 显示全部楼层
差不多是这个意思。。。另外,位图操作吃帧数,还有调用的方法过多。。
比如
eg1:

  XXXX
a = 1
  XXXXX

eg2:

def b
  c
end
def c
  a = 1
end

XXXX
c
XXXX

明显 eg2 方法调用的太多了速度也是会下降的。。。
还有,当屏幕上的Sprite太多了也是会掉帧数的,什么原理我不知道。。。反正是测试测出来的。。。我用VX,地图上32X32的图显示的20个。都是Sprite那样的显示,不是事件指令的,我没有对位图进行任何操作。。。掉了1~2帧。。
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

40

主题

190

帖子

1635

积分

⑥精研

●~  ●~   ●

积分
1635
 楼主| 发表于 2009-12-21 12:43:42 | 显示全部楼层
那么if  加血 or 减血  怎么写啊?

if  data[1].to_i/data[2].to_i  != 1.0
       @sprite.bitmap.clear
       @sprite.bitmap.fill_rect(100,100, hp, 2,  Color.new(255,  0, 51))
end
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2009-12-21 12:48:32 | 显示全部楼层
你可以做一个见血的方法什么的啊。。。

你这个ARPG我也不知道怎么写的。。。怎么说明呢。。。

这样比如 判断攻击了,而且命中了这时候可以调用一个减血的方法

def atk_hp(patk,pdef) #两个参数 攻防
  delt_hp = patk - pdef # 攻减防 为掉血量
  @hp -= delt_hp # 血减少了
   @sprite.bitmap.clear
  @sprite.bitmap.fill_rect(100,100, hp, 2,  Color.new(255,  0, 51))
end

调用atk_hp 一定要有个判断。。。
if 被攻击 && 攻击命中
   atk_hp(patk,pdef)
end
如果这样还不行的话。。我建议你好好看看自己写的脚本。。找找问题吧
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

40

主题

190

帖子

1635

积分

⑥精研

●~  ●~   ●

积分
1635
 楼主| 发表于 2009-12-21 13:01:14 | 显示全部楼层
我是在公共事件里作命中敌人的处理,Scene_Map里有一个def attack是计算属性伤害的,然后公共事件的命中处理时会调用到$scene.attack计算一下属性伤害,可不可以写成这样:

if  attack
       @sprite.bitmap.clear
       @sprite.bitmap.fill_rect(100,100, hp, 2,  Color.new(255,  0, 51))
end
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2009-12-21 13:09:26 | 显示全部楼层
思路是对的了,但是attack 是个数吧??你这个判断是什么意思?
如果attack 返回的是数字的话 if attack恒为 真
如果你是要判断 伤害大于 0 的话 应该写成
if attack > 0
XXX
end

如果你不需要判断 伤害 >0的话 那么if attack 这个是没有任何作用的。。。
以上 是在 def attack 返回的是一个数值的情况下的。。如果attack返回的是true/false的话,就当我没说话好了
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-14 21:54 , Processed in 0.025826 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表