Project1

标题: 将技能、物品栏的说明扩展至2行后,技能发动不显示技能名 [打印本页]

作者: 无忧谷主幻    时间: 2026-5-1 02:30
标题: 将技能、物品栏的说明扩展至2行后,技能发动不显示技能名
因为1行实在不够用,所以将技能栏和物品栏的说明文字扩展至2行

理所当然,敌人显示的信息也变成2行了

当然,重点在于,接下来无论是发动技能,还是攻击、防御、使用物品都不在显示顶部的描述窗口了

如何恢复该描述窗口,另外如果可以的话其实是希望新建一个独立的单行窗口,毕竟显示技能名的窗口也是2行确实不太美观(自己改了好几次都没成功)


工程
Project3.zip (388.88 KB, 下载次数: 8)
作者: 无忧谷主幻    时间: 2026-5-4 04:39
估计没人回答了
RUBY 代码复制
  1. #==============================================================================
  2. # 技能名漂移
  3. #------------------------------------------------------------------------------
  4. # 效果:使用技能时,技能名显示在一个自动适应长度的窗口中,
  5. #       从左飞入屏幕上方中央,短暂停留后向右飞出。
  6. #==============================================================================
  7.  
  8. # 定义用于显示技能名的窗口类
  9. class SkillName_Window < Window_Base
  10.   def initialize(skill_name)
  11.     # 先测量文字尺寸
  12.     dummy = Bitmap.new(32, 32)
  13.     dummy.font.size = 32
  14.     dummy.font.bold = true
  15.     rect = dummy.text_size(skill_name)
  16.     w = rect.width + 32 + 32   # 左右各留 16 像素内边距
  17.     h = rect.height + 32
  18.     dummy.dispose
  19.  
  20.     # 创建窗口:左边距临时设为0,稍后由动画控制位置
  21.     super(0, 0, w, h)
  22.     self.contents = Bitmap.new(w - 32, h - 32)
  23.     self.contents.font.size = 32
  24.     self.contents.font.bold = true
  25.  
  26.     # 绘制黑色描边 + 白色文字
  27.     outline = Color.new(0, 0, 0)
  28.     text_c  = Color.new(255, 255, 255)
  29.     cx = (self.contents.width - rect.width) / 2
  30.     cy = (self.contents.height - rect.height) / 2
  31.     [-1, 1].each do |dx|
  32.       [-1, 1].each do |dy|
  33.         self.contents.font.color = outline
  34.         self.contents.draw_text(cx + dx, cy + dy, rect.width, rect.height, skill_name, 1)
  35.       end
  36.     end
  37.     self.contents.font.color = text_c
  38.     self.contents.draw_text(cx, cy, rect.width, rect.height, skill_name, 1)
  39.  
  40.     # 设置窗口纵向位置(屏幕上方)
  41.     self.y = 25
  42.     self.z = 10000
  43.     # 起始位置:屏幕左侧外
  44.     self.x = -self.width
  45.     # 停留帧数
  46.     @stop_time = 90
  47.     @timer = 0
  48.     @phase = :fly_in
  49.   end
  50.  
  51.   # 更新动画,返回 true 表示动画已结束并需要释放
  52.   def update_anim
  53.     case @phase
  54.     when :fly_in
  55.       self.x += 16
  56.       if self.x >= 320 - self.width / 2
  57.         self.x = 320 - self.width / 2
  58.         @phase = :stop
  59.       end
  60.     when :stop
  61.       @timer += 1
  62.       if @timer >= @stop_time
  63.         @phase = :fly_out
  64.       end
  65.     when :fly_out
  66.       self.x += 16
  67.       if self.x > 640
  68.         return true   # 飞出屏幕,可以释放
  69.       end
  70.     end
  71.     return false
  72.   end
  73. end
  74.  
  75. class Scene_Battle
  76.   #--------------------------------------------------------------------------
  77.   # ● 初始化 / 释放
  78.   #--------------------------------------------------------------------------
  79.   alias skill_window_main main
  80.   def main
  81.     @skill_name_window = nil
  82.     skill_window_main
  83.     if @skill_name_window
  84.       @skill_name_window.dispose
  85.       @skill_name_window = nil
  86.     end
  87.   end
  88.  
  89.   #--------------------------------------------------------------------------
  90.   # ● 帧更新
  91.   #--------------------------------------------------------------------------
  92.   alias skill_window_update update
  93.   def update
  94.     skill_window_update
  95.     update_skill_window
  96.   end
  97.  
  98.   #--------------------------------------------------------------------------
  99.   # ● 显示技能名窗口
  100.   #--------------------------------------------------------------------------
  101.   def show_skill_name(name)
  102.     if @skill_name_window
  103.       @skill_name_window.dispose
  104.       @skill_name_window = nil
  105.     end
  106.     @skill_name_window = SkillName_Window.new(name)
  107.   end
  108.  
  109.   #--------------------------------------------------------------------------
  110.   # ● 更新技能名窗口动画
  111.   #--------------------------------------------------------------------------
  112.   def update_skill_window
  113.     return unless @skill_name_window
  114.     if @skill_name_window.update_anim
  115.       @skill_name_window.dispose
  116.       @skill_name_window = nil
  117.     end
  118.   end
  119.  
  120.   #--------------------------------------------------------------------------
  121.   # ● 触发时机:我方或敌方使用技能时
  122.   #--------------------------------------------------------------------------
  123.   if method_defined?(:update_phase4_step2)
  124.     alias skill_window_step2 update_phase4_step2
  125.     def update_phase4_step2
  126.       skill_window_step2
  127.       if @active_battler.current_action.kind == 1 &&
  128.          @active_battler.current_action.skill_id > 0
  129.         skill = $data_skills[@active_battler.current_action.skill_id]
  130.         show_skill_name(skill.name)
  131.       end
  132.     end
  133.   end
  134. end

作者: 灯笼菜刀王    时间: 2026-5-4 10:53
本帖最后由 灯笼菜刀王 于 2026-5-4 11:07 编辑

五一不用摸鱼, 当然没人啦, 笑

你用了两个help脚本,  其中 双行自动换行 (就是你战斗调用的help) 这个脚本里, 找到 def set_text(text, align = 0) 这句, 下面加一句 self.visible = true 就行了

想单独一行, 那就在def refresh 里, 找到 self.contents.font.size = current_font_size 这句, 下面加上

    if @text.size < 25
      self.height = 64
      self.contents.dispose ;self.contents = Bitmap.new(608,32)
      self.contents.draw_text(0,0,608,32,@text,1) ;return
    else
      self.height = 96
    end

8个汉字以内都会以一行显示

顺便, 想把敌人,角色的help也改成一行,

在 显示敌人的HP、SP百分比 这个脚本里,找到  self.contents.clear  这句, 替换成 self.height = 64 ;self.contents.dispose ;self.contents = Bitmap.new(608,32)
在 Window_Help 这个脚本里, 找到 if actor != @actor 这句, 下面的 self.contents.clear 也替换成上面那句





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1