设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1744|回复: 8
打印 上一主题 下一主题

[已经过期] 请教脚本经常无效的问题

[复制链接]

Lv2.观梦者

梦石
0
星屑
825
在线时间
223 小时
注册时间
2014-5-23
帖子
57
跳转到指定楼层
1
发表于 2020-5-22 17:22:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
我用了这个显示状态剩余回合数的脚本,会在状态图标旁边有个小数字显示剩余回合数。但是现在经常出现的问题是剩余回合数不会更新。比如一个会持续5回合的状态,一开始会显示5,但是后面就不会递减显示4、3、2、1这种,而是一直都显示5,然后5回合到了,状态直接消失。奇怪的是,有时候又会递减显示剩余回合数。麻烦各位大佬帮我看下是哪出了问题呢。
这是我用的脚本
  1. #==============================================================================
  2. # ■状态剩余回合数显示 for RGSS3 Ver1.01-β
  3. # □作成者 kure
  4. #==============================================================================
  5. #
  6. # 状态备注:  <不显示剩余回合数>   则不会显示剩余回合数
  7. #

  8. #==============================================================================
  9. # ■ RPG::State(追加定義)
  10. #==============================================================================
  11. class RPG::State < RPG::BaseItem
  12.   #--------------------------------------------------------------------------
  13.   # ☆残りターン非表示の定義(追加定義)
  14.   #--------------------------------------------------------------------------  
  15.   def view_turns?
  16.     return true unless @note
  17.     return false if @note.include?("<不显示剩余回合数>")
  18.     return true
  19.   end
  20. end

  21. #==============================================================================
  22. # ■ Window_Base
  23. #==============================================================================
  24. class Window_Base < Window
  25.   #--------------------------------------------------------------------------
  26.   # ● ステートおよび強化/弱体のアイコンを描画(再定義)
  27.   #--------------------------------------------------------------------------
  28.   def draw_actor_icons(actor, x, y, width = 96)
  29.     icons = (actor.state_icons_adv + actor.buff_icons_adv)[0, width / 24]

  30.     last = contents.font.size
  31.     contents.font.size = 18
  32.     change_color(crisis_color)
  33.     icons.each_with_index {|n, i| draw_state_icon_turns(n, x + 24 * i, y) }
  34.     change_color(normal_color)
  35.     contents.font.size = last
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 残りのターンを加えたアイコンの描画(追加定義)
  39.   #--------------------------------------------------------------------------
  40.   def draw_state_icon_turns(data, x, y)
  41.     draw_icon(data[0], x, y)
  42.     if data[2] and $data_states[data[2]] and $data_states[data[2]].auto_removal_timing == 0
  43.       return
  44.     end
  45.     draw_text(x + 12, y + 8, 12, 18, data[1].to_i,2)
  46.   end
  47. end

  48. #==============================================================================
  49. # ■ Game_BattlerBase
  50. #==============================================================================
  51. class Game_BattlerBase
  52.   #--------------------------------------------------------------------------
  53.   # ● 現在のステートをアイコンINDEX、残りターン、ステートIDで取得(追加定義)
  54.   #--------------------------------------------------------------------------
  55.   def state_icons_adv
  56.     icons = states.collect {|state| [state.icon_index, @state_turns[state.id], state.id] }
  57.     for i in 0..icons.size - 1
  58.       if icons[i][0] == 0
  59.         icons[i] = nil
  60.       else
  61.         icons[i][1] = "" if $data_states[icons[i][2]].auto_removal_timing == 0
  62.         icons[i][1] = "" unless $data_states[icons[i][2]].view_turns?
  63.       end
  64.     end
  65.     icons.compact!
  66.     return icons
  67.   end
  68.   #--------------------------------------------------------------------------
  69.   # ● 現在の強化/弱体をアイコンINDEX、残りターンで取得(追加定義)
  70.   #--------------------------------------------------------------------------
  71.   def buff_icons_adv
  72.     icons = []
  73.     @buffs.each_with_index {|lv, i| icons.push([buff_icon_index(lv, i),@buff_turns[i]]) }
  74.     for i in 0..icons.size - 1
  75.       icons[i] = nil if icons[i][0] == 0
  76.     end
  77.     icons.compact!
  78.     return icons
  79.   end
  80. end
复制代码
头像被屏蔽

Lv4.逐梦者 (禁止发言)

梦石
0
星屑
5706
在线时间
922 小时
注册时间
2013-8-29
帖子
1468
2
发表于 2020-5-22 18:09:46 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
825
在线时间
223 小时
注册时间
2014-5-23
帖子
57
3
 楼主| 发表于 2020-5-22 18:22:21 | 只看该作者
本帖最后由 stidus 于 2020-5-22 18:25 编辑
chanszeman1018 发表于 2020-5-22 18:09
檢查一下有沒有其它脚本,把战斗中调用draw_actor_icons的地方给改了
(即Window_BattleStatus中的def draw_b ...


我用的LNX11仿XP战斗系统确实重新定义了def draw_basic_area,感觉无解了....
  1. # ● [再定義]:基本エリアの描画
  2.   #--------------------------------------------------------------------------
  3.   def draw_basic_area(rect, actor)
  4.     # フォントサイズ変更
  5.     contents.font.size = [LNX11::STATUS_NAME_SIZE, 8].max
  6.     # 名前とステートを描画
  7.     dn = LNX11::STATUS_NAME_SIZE > 0 # 名前を描画するか?
  8.     width = gauge_area_width - @min_offset
  9.     rest  = width % 24
  10.     width += 24 - rest if rest > 0
  11.     draw_actor_name_with_icons(actor, rect.x, rect.y, width, dn)
  12.     # フォントサイズを元に戻す
  13.     reset_font_settings
  14.   end
  15.   #--------------------------------------------------------------------------
复制代码

补充脚本里也有一句
RUBY 代码复制
  1. # ● [再定義]:基本エリアの描画
  2.   #--------------------------------------------------------------------------
  3.   def draw_basic_area(rect, actor)
  4.     # スプライトの更新
  5.     @sprite[actor.index].refresh
  6.   end
  7.   #--------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
825
在线时间
223 小时
注册时间
2014-5-23
帖子
57
4
 楼主| 发表于 2020-5-22 18:23:52 | 只看该作者
stidus 发表于 2020-5-22 18:22
我用的LNX11仿XP战斗系统确实重新定义了def draw_basic_area,感觉无解了....

不过这段感觉和显示剩余回合的脚本并没有冲突啊
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv4.逐梦者 (禁止发言)

梦石
0
星屑
5706
在线时间
922 小时
注册时间
2013-8-29
帖子
1468
5
发表于 2020-5-22 18:40:04 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
825
在线时间
223 小时
注册时间
2014-5-23
帖子
57
6
 楼主| 发表于 2020-5-22 18:58:01 | 只看该作者
chanszeman1018 发表于 2020-5-22 18:40
你试建个新工程,只用显示剩余回合的脚本,不用LNX11仿XP战斗系统,
看看剩余回合数更新正不正常,正常的话就 ...

嗯嗯 我单独试试看
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
11357
在线时间
611 小时
注册时间
2016-8-25
帖子
1400

R考场第七期纪念奖

7
发表于 2020-5-22 19:03:07 | 只看该作者
为什么我好像没问题???
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
825
在线时间
223 小时
注册时间
2014-5-23
帖子
57
8
 楼主| 发表于 2020-5-23 16:30:17 | 只看该作者
现在发现,如果目标有被附加新的状态,目标身上所有的状态剩余回合数就会刷新成真实的剩余回合,看上去应该就是没有每回合重新绘制造成的。脚本苦手,不知道咋改
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
825
在线时间
223 小时
注册时间
2014-5-23
帖子
57
9
 楼主| 发表于 2020-5-30 01:05:16 | 只看该作者
本帖最后由 stidus 于 2020-5-30 02:37 编辑
PLeaseS 发表于 2020-5-22 19:03
为什么我好像没问题???


应该是和这个脚本冲突了...
RUBY 代码复制
  1. #==============================================================================
  2. # ★ RGSS3-Extension
  3. # LNX11b_リフォーム・バトルステータス
  4. #  Spriteでパラメータやゲージを実装した動的なバトルステータスです。
  5. #  画像や設定を変更することでデザインをアレンジすることが可能です。
  6. #   
  7. #  * このスクリプトは LNX11a_XPスタイルバトル の機能拡張スクリプトです。
  8. #  LNX11a_XPスタイルバトル より下のセクションに導入してください。
  9. #
  10. #  また、ステータスの各要素の配置設定を行う
  11. #  LNX11bskin_リフォーム・バトルステータス#スキン設定 も必ず導入してください。
  12. #
  13. #  version   : 1.01 (12/03/13)
  14. #  author    : ももまる
  15. #  reference : [url]http://peachround.blog.fc2.com/blog-entry-12.html[/url]
  16. #
  17. #==============================================================================
  18.  
  19. #==============================================================================
  20. # ■ LNXスクリプト導入情報
  21. #==============================================================================
  22. $lnx_include = {} if $lnx_include == nil
  23. $lnx_include[:lnx11b] = 101 # version
  24. module LNX11b ; end
  25. unless $lnx_include[:lnx11a]
  26.   p "NG:LNX11b_リフォーム・バトルステータス"
  27.   text = "LNX11b: Error! LNX11a より下位のセクションに配置してください。"
  28.   p text
  29.   msgbox text
  30.   exit
  31. end
  32. p "OK:LNX11b_リフォーム・バトルステータス"
  33.  
  34. #==============================================================================
  35. # ■ Window_BattleStatus
  36. #------------------------------------------------------------------------------
  37. #  バトル画面で、パーティメンバーのステータスを表示するウィンドウです。
  38. #==============================================================================
  39.  
  40. class Window_BattleStatus < Window_Selectable
  41.   #--------------------------------------------------------------------------
  42.   # ● [エイリアス]:オブジェクト初期化
  43.   #--------------------------------------------------------------------------
  44.   alias :lnx11b_initialize :initialize
  45.   def initialize
  46.     unless $lnx_include[:lnx11bskin]
  47.       text = "LNX11b:Error! LNX11bskin が導入されていません。"
  48.       p text
  49.       msgbox text
  50.       exit
  51.     end
  52.     @sprite_viewport = Viewport.new
  53.     # 元のメソッドを呼ぶ
  54.     lnx11b_initialize
  55.     @sprite_viewport.z = self.z
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   # ● [オーバーライド]解放
  59.   #--------------------------------------------------------------------------
  60.   def dispose
  61.     @sprite_viewport.dispose
  62.     dispose_status_sprites
  63.     super
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● [オーバーライド]:表示行数の取得
  67.   #--------------------------------------------------------------------------
  68.   def visible_line_number
  69.     return 4
  70.   end
  71.   #--------------------------------------------------------------------------
  72.   # ● [オーバーライド]:行の高さを取得
  73.   #--------------------------------------------------------------------------
  74.   def line_height
  75.     return 24 # ステートアイコン描画領域を確保
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # ● [オーバーライド]:フレーム更新
  79.   #--------------------------------------------------------------------------
  80.   def update
  81.     super
  82.     update_invisible
  83.     update_status_sprites
  84.   end  
  85.   #--------------------------------------------------------------------------
  86.   # ● [再定義]:表示状態更新
  87.   #--------------------------------------------------------------------------
  88.   def update_invisible
  89.     @sprite_viewport.visible = !$game_party.status_invisible
  90.   end  
  91.   #--------------------------------------------------------------------------
  92.   # ● [再定義]:リフレッシュ
  93.   #--------------------------------------------------------------------------
  94.   def refresh
  95.     set_xy
  96.     # ステータススプライトの作成
  97.     create_status_sprites
  98.     draw_all_items
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ● [追加]:ステータススプライトの作成
  102.   #--------------------------------------------------------------------------
  103.   def create_status_sprites
  104.     return if @sprite != nil
  105.     @sprite = []
  106.     $game_party.battle_members.each_with_index do |actor, i|
  107.       @sprite[i] = Spriteset_BattleStatus.new(actor, self, @sprite_viewport)
  108.     end
  109.   end
  110.   #--------------------------------------------------------------------------
  111.   # ● [追加]:ステータススプライトの解放
  112.   #--------------------------------------------------------------------------
  113.   def dispose_status_sprites
  114.     return unless @sprite
  115.     @sprite.each do |sprite|
  116.       sprite.dispose
  117.     end
  118.     @sprite = nil
  119.   end
  120.   #--------------------------------------------------------------------------
  121.   # ● [追加]:ステータススプライトの更新
  122.   #--------------------------------------------------------------------------
  123.   def update_status_sprites
  124.     return unless @sprite
  125.     @sprite.each {|sprite| sprite.update}
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # ● [再定義]:基本エリアの描画
  129.   #--------------------------------------------------------------------------
  130.   def draw_basic_area(rect, actor)
  131.     # スプライトの更新
  132.     @sprite[actor.index].refresh
  133.   end
  134.   #--------------------------------------------------------------------------
  135.   # ● [再定義]:ゲージエリアの描画
  136.   #--------------------------------------------------------------------------
  137.   def draw_gauge_area(*args)
  138.     # 何もしない
  139.   end
  140.   #--------------------------------------------------------------------------
  141.   # ● [エイリアス]:内容の消去
  142.   #--------------------------------------------------------------------------
  143.   alias :lnx11b_all_clear :all_clear
  144.   def all_clear
  145.     # 元のメソッドを呼ぶ
  146.     lnx11b_all_clear
  147.     # ステータススプライトの解放
  148.     dispose_status_sprites
  149.   end
  150. end
  151.  
  152. #==============================================================================
  153. # ■ [追加]:Spriteset_BattleStatus
  154. #------------------------------------------------------------------------------
  155. #  スプライトによるバトルステータス。
  156. #==============================================================================
  157.  
  158. class Spriteset_BattleStatus
  159.   include LNX11
  160.   include LNX11b
  161.   #--------------------------------------------------------------------------
  162.   # ● オブジェクト初期化
  163.   #--------------------------------------------------------------------------  
  164.   def initialize(battler, status_window, viewport = nil)
  165.     @battler = battler
  166.     @viewport = viewport
  167.     @status_window = status_window
  168.     # 基準座標
  169.     @x = $game_party.members_screen_x[battler.index] + STATUS_OFFSET[:x]
  170.     @x -= STATUS_WIDTH / 2
  171.     @y = @status_window.y + STATUS_OFFSET[:y]
  172.     # メインスキン
  173.     @main_skin_sprite = create_skin(MAIN_SKIN)
  174.     # ステート
  175.     @state_skin_sprite = create_skin(STATE_SKIN)
  176.     @state_icon = create_state_icon(STATE_ICON)
  177.     # 名前
  178.     @name_sprite = create_name(NAME)
  179.     # 数字
  180.     num = @battler.hp ; max = @battler.mhp
  181.     @hp_number_sprite = create_number(num, max, HP_NUMBER_FORMAT)
  182.     num = @battler.mp ; max = @battler.mmp
  183.     @mp_number_sprite = create_number(num, max, MP_NUMBER_FORMAT)
  184.     if $data_system.opt_display_tp
  185.       num = @battler.tp ; max = @battler.max_tp
  186.       @tp_number_sprite = create_number(num, max, TP_NUMBER_FORMAT)
  187.     end
  188.     # 数字(最大値)
  189.     num = @battler.mhp
  190.     @mhp_number_sprite = create_number(num, num, MAXHP_NUMBER_FORMAT)
  191.     num = @battler.mmp
  192.     @mmp_number_sprite = create_number(num, num, MAXMP_NUMBER_FORMAT)
  193.     if $data_system.opt_display_tp
  194.       num = @battler.max_tp
  195.       @mtp_number_sprite = create_number(num, num, MAXTP_NUMBER_FORMAT)
  196.     end
  197.     # ゲージ
  198.     @hp_gauge_sprite = create_gauge(@battler.hp_rate, HP_GAUGE_FORMAT)
  199.     @mp_gauge_sprite = create_gauge(@battler.mp_rate, MP_GAUGE_FORMAT)
  200.     if $data_system.opt_display_tp
  201.       @tp_gauge_sprite = create_gauge(@battler.tp_rate, TP_GAUGE_FORMAT)
  202.     end
  203.     # ゲージと数字スプライトの同期
  204.     if HP_GAUGE_FORMAT[:number_link] && @hp_number_sprite
  205.       @hp_gauge_sprite.number = @hp_number_sprite if @hp_gauge_sprite
  206.     end
  207.     if MP_GAUGE_FORMAT[:number_link] && @mp_number_sprite
  208.       @mp_gauge_sprite.number = @mp_number_sprite if @mp_gauge_sprite
  209.     end
  210.     if TP_GAUGE_FORMAT[:number_link] && @tp_number_sprite
  211.       @tp_gauge_sprite.number = @tp_number_sprite if @tp_gauge_sprite
  212.     end
  213.     # 更新するスプライトの配列
  214.     @sprites = [@main_skin_sprite, @state_skin_sprite, @state_icon,
  215.       @name_sprite, @hp_number_sprite, @mp_number_sprite, @tp_number_sprite,
  216.       @mhp_number_sprite, @mmp_number_sprite, @mtp_number_sprite,
  217.       @hp_gauge_sprite, @mp_gauge_sprite, @tp_gauge_sprite]
  218.     @sprites.delete(nil)
  219.   end
  220.   #--------------------------------------------------------------------------
  221.   # ● 解放
  222.   #--------------------------------------------------------------------------  
  223.   def dispose
  224.     @sprites.each {|sprite| sprite.dispose }
  225.   end
  226.   #--------------------------------------------------------------------------
  227.   # ● フレーム更新
  228.   #--------------------------------------------------------------------------
  229.   def update
  230.     @sprites.each {|sprite| sprite.update }
  231.   end
  232.   #--------------------------------------------------------------------------
  233.   # ● スプライトの位置設定
  234.   #--------------------------------------------------------------------------  
  235.   def move(sprite, format)
  236.     # 表示基準 X 座標
  237.     x = format[:x_fixed] ? @x : @x - @status_window.min_offset     
  238.     sprite.move(x + format[:x], @y + format[:y], format[:z])
  239.   end
  240.   #--------------------------------------------------------------------------
  241.   # ● スキンの作成
  242.   #--------------------------------------------------------------------------  
  243.   def create_skin(format)
  244.     return nil unless format[:enabled]
  245.     sprite = Sprite_Skin.new(format, @viewport)
  246.     move(sprite, format)
  247.     return sprite
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   # ● 名前の作成
  251.   #--------------------------------------------------------------------------  
  252.   def create_name(format)
  253.     return nil unless format[:enabled]
  254.     sprite = Sprite_BattlerName.new(@battler, format, @viewport)
  255.     move(sprite, format)
  256.     return sprite
  257.   end
  258.   #--------------------------------------------------------------------------
  259.   # ● 数字の作成
  260.   #--------------------------------------------------------------------------  
  261.   def create_number(num, max, format)
  262.     return nil unless format[:enabled]
  263.     sprite = Sprite_Number.new(num, max, format, @viewport)
  264.     move(sprite, format)
  265.     return sprite
  266.   end
  267.   #--------------------------------------------------------------------------
  268.   # ● ゲージの作成
  269.   #--------------------------------------------------------------------------  
  270.   def create_gauge(rate, format)
  271.     return nil unless format[:enabled]
  272.     case format[:type]
  273.     when 0 # 横ゲージ
  274.       sprite = Sprite_HorzGauge.new(rate, format, @viewport)
  275.     when 1 # セルゲージ
  276.       sprite = Sprite_CellGauge.new(rate, format, @viewport)
  277.     end
  278.     move(sprite, format)
  279.     return sprite
  280.   end
  281.   #--------------------------------------------------------------------------
  282.   # ● ステートアイコンの作成
  283.   #--------------------------------------------------------------------------  
  284.   def create_state_icon(format)
  285.     return nil unless format[:enabled]
  286.     sprite = Sprite_StateIcon.new(@battler, @status_window, format, @viewport)
  287.     move(sprite, format)
  288.     return sprite
  289.   end
  290.   #--------------------------------------------------------------------------
  291.   # ● リフレッシュ
  292.   #--------------------------------------------------------------------------
  293.   def refresh
  294.     # ゲージ
  295.     @hp_gauge_sprite.set(@battler.hp_rate) if @hp_gauge_sprite
  296.     @mp_gauge_sprite.set(@battler.mp_rate) if @mp_gauge_sprite
  297.     @tp_gauge_sprite.set(@battler.tp_rate) if @tp_gauge_sprite
  298.     # 数字
  299.     @hp_number_sprite.set(@battler.hp, @battler.mhp) if @hp_number_sprite
  300.     @mp_number_sprite.set(@battler.mp, @battler.mmp) if @mp_number_sprite
  301.     @tp_number_sprite.set(@battler.tp, @battler.max_tp) if @tp_number_sprite
  302.     # 数字(最大値)
  303.     @mhp_number_sprite.set(@battler.mhp, @battler.mhp) if @mhp_number_sprite
  304.     @mmp_number_sprite.set(@battler.mmp, @battler.mmp) if @mmp_number_sprite
  305.     mtp = @battler.max_tp
  306.     @mtp_number_sprite.set(mtp, mtp) if @mtp_number_sprite
  307.     # ステート
  308.     @state_icon.refresh if @state_icon
  309.     @state_skin_sprite.visible = @state_icon.visible if @state_skin_sprite
  310.     # 名前
  311.     if @name_sprite
  312.       @name_sprite.refresh
  313.       if @state_icon && NAME[:auto_hide]
  314.         @name_sprite.visible = !@state_icon.visible
  315.       end
  316.     end
  317.   end
  318. end
  319.  
  320. module LNX11
  321.   # X 座標の自動調整を行う
  322.   STATUS_AUTOADJUST = true
  323. end
  324.  
  325. #==============================================================================
  326. # ■ [追加]:Sprite_BattleStatus
  327. #------------------------------------------------------------------------------
  328. #  バトルステータスのスプライト群のスーパークラス。
  329. #==============================================================================
  330.  
  331. class Sprite_BattleStatus < Sprite
  332.   #--------------------------------------------------------------------------
  333.   # ● 移動
  334.   #--------------------------------------------------------------------------
  335.   def move(x, y, z)
  336.     self.x = x
  337.     self.y = y
  338.     self.z = z
  339.   end
  340. end
  341.  
  342. #==============================================================================
  343. # ■ [追加]:Sprite_Skin
  344. #------------------------------------------------------------------------------
  345. #  バトルステータス:スキンのスプライト。
  346. #==============================================================================
  347.  
  348. class Sprite_Skin < Sprite_BattleStatus
  349.   #--------------------------------------------------------------------------
  350.   # ● オブジェクト初期化
  351.   #--------------------------------------------------------------------------  
  352.   def initialize(format, viewport = nil)
  353.     super(viewport)
  354.     self.bitmap = Cache.system(format[:bitmap])
  355.   end
  356. end
  357.  
  358. #==============================================================================
  359. # ■ [追加]:Sprite_BattlerName
  360. #------------------------------------------------------------------------------
  361. #  バトルステータス:名前を表示するスプライト。
  362. #==============================================================================
  363.  
  364. class Sprite_BattlerName < Sprite_BattleStatus
  365.   #--------------------------------------------------------------------------
  366.   # ● オブジェクト初期化
  367.   #--------------------------------------------------------------------------  
  368.   def initialize(battler, format, viewport = nil)
  369.     super(viewport)
  370.     @battler = battler
  371.     @format = format
  372.     @name = ""
  373.     refresh
  374.   end
  375.   #--------------------------------------------------------------------------
  376.   # ● ビットマップの解放
  377.   #--------------------------------------------------------------------------  
  378.   def bitmap_dispose
  379.     self.bitmap.dispose if self.bitmap && !self.bitmap.disposed?
  380.     self.bitmap = nil
  381.   end
  382.   #--------------------------------------------------------------------------
  383.   # ● リフレッシュ
  384.   #--------------------------------------------------------------------------  
  385.   def refresh
  386.     return if @name == @battler.name
  387.     @name = @battler.name
  388.     bitmap_dispose
  389.     if @format[:bitmap_name]
  390.       self.bitmap = Cache.system("name_#{@name}")
  391.     else
  392.       self.bitmap = Bitmap.new(@format[:width], @format[:height])
  393.       self.bitmap.font.name = @format[:name]
  394.       self.bitmap.font.size = @format[:size]
  395.       self.bitmap.font.bold = @format[:bold]
  396.       self.bitmap.font.italic = @format[:italic]
  397.       self.bitmap.font.color = @format[:color][0]
  398.       self.bitmap.font.out_color = @format[:color][1]  
  399.       self.bitmap.draw_text(self.bitmap.rect, @name, @format[:align])
  400.     end
  401.   end
  402. end
  403.  
  404. #==============================================================================
  405. # ■ [追加]:Sprite_HorzGauge
  406. #------------------------------------------------------------------------------
  407. #  バトルステータス:横方向のゲージ。
  408. #==============================================================================
  409.  
  410. class Sprite_HorzGauge < Sprite_BattleStatus
  411.   NUMBERS    = [0,1,2,3,4,5,6,7,8,9]
  412.   COLOR_SIZE = 4
  413.   # 0:通常 1:ピンチ 2:最大 3:サブゲージ
  414.   #--------------------------------------------------------------------------
  415.   # ● [追加]:公開インスタンス変数
  416.   #--------------------------------------------------------------------------
  417.   attr_accessor :number   # 同期する数字スプライト
  418.   #--------------------------------------------------------------------------
  419.   # ● オブジェクト初期化
  420.   #--------------------------------------------------------------------------  
  421.   def initialize(rate, format, viewport)
  422.     super(viewport)
  423.     self.bitmap = Cache.system(format[:bitmap])
  424.     @speed = format[:speed]
  425.     @s_speed = format[:s_speed]
  426.     @crisis = format[:crisis]   
  427.     @sub_gauge = Sprite.new(viewport)
  428.     @sub_gauge.bitmap = self.bitmap
  429.     @number = nil
  430.     color_set_rect(3, @sub_gauge)
  431.     set(rate, true)
  432.   end
  433.   #--------------------------------------------------------------------------
  434.   # ● 解放
  435.   #--------------------------------------------------------------------------  
  436.   def dispose
  437.     @sub_gauge.dispose
  438.     super
  439.   end
  440.   #--------------------------------------------------------------------------
  441.   # ● 移動
  442.   #--------------------------------------------------------------------------
  443.   def move(x, y, z)
  444.     super(x, y, z)
  445.     @sub_gauge.x = x
  446.     @sub_gauge.y = y
  447.     @sub_gauge.z = z - 1
  448.   end
  449.   #--------------------------------------------------------------------------
  450.   # ● ゲージ最大か?
  451.   #--------------------------------------------------------------------------
  452.   def max?
  453.     @gauge_width / max_gauge_widht >= 1.0
  454.   end
  455.   #--------------------------------------------------------------------------
  456.   # ● ゲージが少ない?
  457.   #--------------------------------------------------------------------------  
  458.   def crisis?
  459.     @gauge_width / max_gauge_widht < @crisis
  460.   end
  461.   #--------------------------------------------------------------------------
  462.   # ● 最大ゲージ幅の取得
  463.   #--------------------------------------------------------------------------
  464.   def max_gauge_widht
  465.     self.bitmap.width.to_f
  466.   end
  467.   #--------------------------------------------------------------------------
  468.   # ● ゲージ色変更(Rect)
  469.   #--------------------------------------------------------------------------
  470.   def color_set_rect(color, sprite)
  471.     sprite.src_rect.height = self.bitmap.height / COLOR_SIZE
  472.     sprite.src_rect.y = color * self.bitmap.height / COLOR_SIZE
  473.   end
  474.   #--------------------------------------------------------------------------
  475.   # ● ゲージ色変更
  476.   #--------------------------------------------------------------------------
  477.   def gauge_color_set
  478.     color_set_rect(max? ? 2 : crisis? ? 1 : 0, self)
  479.   end
  480.   #--------------------------------------------------------------------------
  481.   # ● フレーム更新
  482.   #--------------------------------------------------------------------------
  483.   def update
  484.     # メインゲージ幅の更新
  485.     if @real_gauge_width != @gauge_width
  486.       if @number
  487.         # 数字スプライトと同期
  488.         rate = @number.real_rate
  489.         width = ([max_gauge_widht * rate, rate != 0 ? 1 : 0].max).to_i
  490.         @real_gauge_width = width
  491.       else
  492.         @real_gauge_width = sma(@gauge_width, @real_gauge_width, @speed)
  493.       end
  494.       # ゲージ色変更
  495.       gauge_color_set
  496.     end
  497.     # サブゲージ幅の更新
  498.     if @sub_gauge_width > @gauge_width
  499.       @sub_gauge_width = [@sub_gauge_width - @s_speed, @gauge_width].max
  500.     elsif @sub_gauge_width != @gauge_width
  501.       @sub_gauge_width = @real_gauge_width
  502.     end
  503.     # スプライトの更新
  504.     update_sprite
  505.   end
  506.   #--------------------------------------------------------------------------
  507.   # ● スプライトの更新
  508.   #--------------------------------------------------------------------------
  509.   def update_sprite
  510.     self.src_rect.width = @real_gauge_width
  511.     @sub_gauge.x = self.x + @real_gauge_width
  512.     @sub_gauge.src_rect.x = @real_gauge_width
  513.     @sub_gauge.src_rect.width = @sub_gauge_width - @real_gauge_width
  514.   end
  515.   #--------------------------------------------------------------------------
  516.   # ● ゲージレートの設定
  517.   #--------------------------------------------------------------------------  
  518.   def set(rate, apply = false)
  519.     @gauge_rate = rate
  520.     @gauge_width = ([max_gauge_widht * rate, rate != 0 ? 1 : 0].max).to_i
  521.     # すぐに適用
  522.     if apply
  523.       @real_gauge_width = @gauge_width
  524.       @sub_gauge_width = @gauge_width
  525.       # ゲージ色変更
  526.       gauge_color_set
  527.       # スプライトの更新
  528.       update_sprite
  529.     end
  530.   end
  531.   #--------------------------------------------------------------------------
  532.   # ● 移動平均
  533.   #--------------------------------------------------------------------------
  534.   def sma(a, b, p)
  535.     # a = 目標位置 b = 現在地
  536.     return a if a == b || (a - b).abs < 0.3 || p == 1
  537.     result = ((a + b * (p.to_f - 1)) / p.to_f)
  538.     return (a - result).abs <= 1.0 ? (b < a ? b + 0.3 : b - 0.3) : result
  539.   end
  540. end
  541.  
  542. #==============================================================================
  543. # ■ [追加]:Sprite_CellGauge
  544. #------------------------------------------------------------------------------
  545. #  バトルステータス:値に応じたセルを参照して表示する擬似ゲージ。
  546. #==============================================================================
  547.  
  548. class Sprite_CellGauge < Sprite_BattleStatus
  549.   #--------------------------------------------------------------------------
  550.   # ● [追加]:公開インスタンス変数
  551.   #--------------------------------------------------------------------------
  552.   attr_accessor :number   # 同期する数字スプライト  
  553.   #--------------------------------------------------------------------------
  554.   # ● オブジェクト初期化
  555.   #--------------------------------------------------------------------------  
  556.   def initialize(rate, format, viewport)
  557.     super(viewport)
  558.     self.bitmap = Cache.system(format[:bitmap])
  559.     @speed = format[:speed]
  560.     @pattern = format[:pattern]
  561.     @pattern_direction = format[:direction]
  562.     @cell_width = format[:width]
  563.     @cell_height = format[:height]
  564.     # パターン
  565.     @horz_size = self.bitmap.width / @cell_width
  566.     @vtcl_size = self.bitmap.height / @cell_height
  567.     @number = nil
  568.     set(rate, true)
  569.   end
  570.   #--------------------------------------------------------------------------
  571.   # ● パターン数の取得
  572.   #--------------------------------------------------------------------------
  573.   def pattern
  574.     @pattern == :auto ? @horz_size * @vtcl_size - 1 : @pattern - 1
  575.   end
  576.   #--------------------------------------------------------------------------
  577.   # ● フレーム更新
  578.   #--------------------------------------------------------------------------
  579.   def update
  580.     # メインゲージ幅の更新
  581.     if @real_rate.truncate != @rate.truncate
  582.       if number
  583.         # 数字スプライトと同期
  584.         @real_rate = @number.real_rate * 100
  585.       else
  586.         @real_rate = sma(@rate, @real_rate, @speed)
  587.       end
  588.       # スプライトの更新
  589.       update_sprite
  590.     end
  591.   end
  592.   #--------------------------------------------------------------------------
  593.   # ● スプライトの更新
  594.   #--------------------------------------------------------------------------
  595.   def update_sprite
  596.     pt = (pattern * @real_rate / 100).truncate
  597.     if @pattern_direction == 0
  598.       # 横方向にパターンが並んでいる
  599.       cx = pt % @horz_size * @cell_width
  600.       cy = pt / @horz_size * @cell_height
  601.     else
  602.       # 縦方向にパターンが並んでいる
  603.       cx = pt / @vtcl_size * @cell_width
  604.       cy = pt % @vtcl_size * @cell_height
  605.     end
  606.     self.src_rect.set(cx, cy, @cell_width, @cell_height)
  607.   end
  608.   #--------------------------------------------------------------------------
  609.   # ● ゲージレートの設定
  610.   #--------------------------------------------------------------------------  
  611.   def set(rate, apply = false)
  612.     @rate = rate * 100
  613.     # すぐに適用
  614.     if apply
  615.       @real_rate = @rate
  616.       # スプライトの更新
  617.       update_sprite
  618.     end
  619.   end
  620.   #--------------------------------------------------------------------------
  621.   # ● 移動平均
  622.   #--------------------------------------------------------------------------
  623.   def sma(a, b, p)
  624.     # a = 目標位置 b = 現在地
  625.     return a if a == b || (a - b).abs < 0.3 || p == 1
  626.     result = ((a + b * (p.to_f - 1)) / p.to_f)
  627.     return (a - result).abs <= 1.0 ? (b < a ? b + 0.3 : b - 0.3) : result
  628.   end
  629. end
  630.  
  631. #==============================================================================
  632. # ■ [追加]:Sprite_Number
  633. #------------------------------------------------------------------------------
  634. #  バトルステータス:数字を表示するスプライト。
  635. #==============================================================================
  636.  
  637. class Sprite_Number < Sprite_BattleStatus
  638.   COLOR_SIZE = 3
  639.   # 0:通常
  640.   # 1:1/4(ピンチ)
  641.   # 2:死亡
  642.   #--------------------------------------------------------------------------
  643.   # ● オブジェクト初期化
  644.   #--------------------------------------------------------------------------  
  645.   def initialize(num, max, format, viewport = nil)
  646.     super(viewport)
  647.     @src_bitmap = Cache.system(format[:bitmap])
  648.     @speed = format[:speed]
  649.     @align  = format[:align]
  650.     @spacing = format[:spacing]
  651.     @crisis = format[:crisis]
  652.     @dead = format[:dead]
  653.     digit = format[:digit]
  654.     # 数字幅
  655.     @num_width = @src_bitmap.width / 10
  656.     # 数字高さ
  657.     @num_height = @src_bitmap.height / COLOR_SIZE
  658.     bw = @num_width * digit + @spacing * (digit - 1)   
  659.     self.bitmap = Bitmap.new(bw, @num_height)
  660.     # 文字揃えによる基準座標の変更
  661.     case @align
  662.     when 0 ; self.ox = 0
  663.     when 1 ; self.ox = self.width / 2
  664.     when 2 ; self.ox = self.width
  665.     end
  666.     # 初期値適用
  667.     set(num, max, true)
  668.   end
  669.   #--------------------------------------------------------------------------
  670.   # ● 解放
  671.   #--------------------------------------------------------------------------  
  672.   def dispose
  673.     self.bitmap.dispose
  674.     super
  675.   end
  676.   #--------------------------------------------------------------------------
  677.   # ● レートの取得
  678.   #--------------------------------------------------------------------------
  679.   def rate
  680.     @num / @max.to_f
  681.   end
  682.   #--------------------------------------------------------------------------
  683.   # ● 表示レートの取得
  684.   #--------------------------------------------------------------------------
  685.   def real_rate
  686.     @real_num / @max.to_f
  687.   end
  688.   #--------------------------------------------------------------------------
  689.   # ● 数値が少ない?
  690.   #--------------------------------------------------------------------------  
  691.   def crisis?
  692.     rate < @crisis
  693.   end
  694.   #--------------------------------------------------------------------------
  695.   # ● 数値が 0 か?
  696.   #--------------------------------------------------------------------------  
  697.   def dead?
  698.     rate <= @dead
  699.   end
  700.   #--------------------------------------------------------------------------
  701.   # ● 数字色取得
  702.   #--------------------------------------------------------------------------
  703.   def number_color
  704.     dead? ? 2 : crisis? ? 1 : 0
  705.   end
  706.   #--------------------------------------------------------------------------
  707.   # ● フレーム更新
  708.   #--------------------------------------------------------------------------
  709.   def update
  710.     # 数値の更新
  711.     if @real_num != @num
  712.       ac = [1, ((@real_num - @num).abs / @speed).truncate].max
  713.       if @real_num > @num
  714.         @real_num = [@real_num - ac, @num].max
  715.       else
  716.         @real_num = [@real_num + ac, @num].min
  717.       end
  718.       # ビットマップの更新
  719.       update_bitmap
  720.     end
  721.   end
  722.   #--------------------------------------------------------------------------
  723.   # ● 数値の設定
  724.   #--------------------------------------------------------------------------  
  725.   def set(num, max, apply = false)
  726.     @num = num
  727.     @max = max
  728.     # すぐに適用
  729.     if apply
  730.       @real_num = @num
  731.       # ビットマップの更新
  732.       update_bitmap
  733.     end
  734.   end
  735.   #--------------------------------------------------------------------------
  736.   # ● ビットマップの更新
  737.   #--------------------------------------------------------------------------
  738.   def update_bitmap
  739.     self.bitmap.clear
  740.     # 数値を文字列の配列にする
  741.     numbers = (@real_num.to_i.abs.to_s).split(//)
  742.     # 数字の色
  743.     sy = @num_height * number_color
  744.     # ダメージ値の幅
  745.     nw = @num_width * numbers.size + @spacing * (numbers.size - 1)
  746.     # 描画 X 座標
  747.     case @align
  748.     when 0 ; bx = 0                            # 左揃え
  749.     when 1 ; bx = (self.bitmap.width - nw) / 2 # 中央揃え
  750.     when 2 ; bx = self.bitmap.width - nw       # 右揃え
  751.     end
  752.     # 数字を描画
  753.     rect = Rect.new(0, sy, @num_width, @num_height)
  754.     numbers.size.times do |n|
  755.       rect.x = numbers[n].to_i * @num_width
  756.       self.bitmap.blt(bx + @num_width * n + @spacing * n, 0, @src_bitmap, rect)
  757.     end
  758.   end
  759. end
  760.  
  761. #==============================================================================
  762. # ■ [追加]:Sprite_StateIcon
  763. #------------------------------------------------------------------------------
  764. #  バトルステータス:ステートアイコンをスクロール表示するスプライト。
  765. #==============================================================================
  766.  
  767. class Sprite_StateIcon < Sprite_BattleStatus
  768.   #--------------------------------------------------------------------------
  769.   # ● [追加]:公開インスタンス変数
  770.   #--------------------------------------------------------------------------
  771.   attr_reader :min_offset   # ステータス描画 X 座標の位置修正
  772.   #--------------------------------------------------------------------------
  773.   # ● オブジェクト初期化
  774.   #--------------------------------------------------------------------------  
  775.   def initialize(battler, bufwindow, format, viewport = nil)
  776.     super(viewport)
  777.     @battler = battler
  778.     @bufwindow = bufwindow
  779.     @size = format[:size]
  780.     @background_color = format[:background_color]
  781.     @scroll_interval = format[:scroll_interval]
  782.     @icons = [-128]
  783.     self.visible = false
  784.     # リフレッシュ
  785.     refresh
  786.   end
  787.   #--------------------------------------------------------------------------
  788.   # ● 解放
  789.   #--------------------------------------------------------------------------  
  790.   def dispose
  791.     bitmap_dispose
  792.     super
  793.   end
  794.   #--------------------------------------------------------------------------
  795.   # ● ビットマップの解放
  796.   #--------------------------------------------------------------------------  
  797.   def bitmap_dispose
  798.     self.visible = false
  799.     self.bitmap.dispose if self.bitmap && !self.bitmap.disposed?
  800.     self.bitmap = nil
  801.   end
  802.   #--------------------------------------------------------------------------
  803.   # ● ステートアイコン配列の取得
  804.   #--------------------------------------------------------------------------
  805.   def icons
  806.     @battler.state_icons + @battler.buff_icons
  807.   end
  808.   #--------------------------------------------------------------------------
  809.   # ● ステートアイコン数の取得
  810.   #--------------------------------------------------------------------------
  811.   def icons_size
  812.     @bufwindow.states(@battler, @bufwindow.contents_width)
  813.   end
  814.   #--------------------------------------------------------------------------
  815.   # ● スクロールのリセット
  816.   #--------------------------------------------------------------------------
  817.   def reset_scroll
  818.     self.src_rect.x = 0
  819.   end
  820.   #--------------------------------------------------------------------------
  821.   # ● スクロールを進める
  822.   #--------------------------------------------------------------------------
  823.   def update_scroll
  824.     self.src_rect.x += self.src_rect.width
  825.     reset_scroll if self.src_rect.x >= self.bitmap.width
  826.   end
  827.   #--------------------------------------------------------------------------
  828.   # ● フレーム更新
  829.   #--------------------------------------------------------------------------
  830.   def update
  831.     update_scroll if self.bitmap && Graphics.frame_count % @scroll_interval == 0
  832.   end
  833.   #--------------------------------------------------------------------------
  834.   # ● リフレッシュ
  835.   #--------------------------------------------------------------------------  
  836.   def refresh
  837.     i = icons
  838.     return if @icons == i
  839.     @icons = i
  840.     i_size = icons_size
  841.     # ビットマップの作成
  842.     bitmap_dispose if self.bitmap && !self.bitmap.disposed?
  843.     return if i_size == 0
  844.     self.visible = true
  845.     self.bitmap = Bitmap.new(i_size * 24, 24)
  846.     self.src_rect.set(0, 0, @size * 24, 24)
  847.     # バッファウィンドウにアイコンの描画
  848.     @bufwindow.contents.clear
  849.     @bufwindow.draw_actor_icons(@battler, 0, 0, @bufwindow.contents_width)
  850.     # 描画したアイコンをビットマップに転送
  851.     self.bitmap.fill_rect(self.bitmap.rect, @background_color)
  852.     self.bitmap.blt(0, 0, @bufwindow.contents, self.bitmap.rect)
  853.     @bufwindow.contents.clear
  854.     reset_scroll
  855.   end
  856. end
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 21:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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