查看: 4167|回复: 7

[原创发布] 【重制】物品得失动态提示

[复制链接]
梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

发表于 2022-6-10 12:25:24 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 纯属小虫 于 2022-7-30 22:56 编辑

根据原作者 芯☆淡茹水 修改的物品得失显示脚本

刚看到这个脚本的时候感觉特别惊艳,RMX居然能做这种灵动的动作
于是头脑一热,希望能把效果改成自己想要的样子

改动点1:更改了原先的显示顺序;现在会先显示动态图标,当图标飞到角色身上的时候,才会显示物品的标签
改动点2:物品会从当前执行的事件,也就是获取物品的目标,如:宝箱,NPC啥的身上飞出来;如果当前事件是公共事件,则从角色自己身上飞出来


序列 03.gif 序列 02.gif 序列 01.gif

脚本小白,怕自己看不懂所以在脚本里加了一大堆的备注....以及一些没必要的语句
后续可能会继续优化




2022/06/15 发现了低级BUG
BUG1
当画面发生卷动的时候,飞出物品图标的坐标不会随着被卷动的事件等移动,而会还停留在原来事件在屏幕中的坐标
这使得捡完东西在大的地图里移动时,画面看起来会很奇怪
BUG2
当获得的物品还没有从宝箱中完全飞出的时候,如果发生了地图更换
那么未飞出的物品会在下一个地图的画面中飞出

正在努力修改BUG,敬请期待...



2022/06/15  BUG已经修复
现在更换地图会直接将还没描绘的tips删掉
画面卷动,或者事件移动,物品也会随着一起动

序列 04.gif 序列 05.gif 序列 06.gif

已经将代码和附件更新!






2022/07/30 发现了新的BUG
宝箱内物品可能会因为宝箱的事件受到开关的影响,而使得物品飞出异常(变成直接从主角头上飞出了)
BUG已经修复,更替了脚本的代码

关于新添加的物品名称备注对 tips 背景色的影响,写在了下面的代码里,但是附件里的脚本没有更新
有需求的可以看下面代码的●备注

附件下载:
https://rpg.blue/forum.php?mod=attachment&aid=Mzg5NjY4fGFiNjMzYjA3fDE3OTA4NDI4NzJ8MHw%3D

[fold=代码(比较冗长,没有优化,里面保留了制作过程备注)][pre lang="ruby"]
#==============================================================================
=begin
==============================================================================
    ★ 物品得失动态提示 ★  <XP>      原Author: 芯☆淡茹水
    整改: 纯属小虫 2022/06/07
==============================================================================
● 说明: 1,该脚本仅提供 金钱,道具,武器,防具的得失提示。并且仅在 地图场景 有效!
         2,该脚本提示类型为  实际提示 。实际得到/失去多少会相应的提示。
           比如:拥有金币 0,失去金币 100  =>  会提示失去0金币;
                 拥有金币 10,失去金币 100  =>  提示 失去 10 金币;
                 拥有铜剑 99(上限),得到铜剑 10  =>  会提示 该物品已满;
                 拥有皮衣 90,得到皮衣 20  =>  提示 得到皮衣 9;
                 任何失去物品,都不会有物品飞动的动作画面,而会直接显示tips

● 备注:(物品,武器,防具),在name上备注,会根据名字的字色给其定稀有度
                      level 1 劣质 普通 优质
                      level 2 稀有 神器 特殊
                      level 3 史诗 神话

                      如果名字中含有 Nt  那该物品的tips将不会显示
                      不同的稀有度会影响tips背景的颜色

● 未显示提示的情况:     1,脚本设置的 控制物品得失提示 的开关未打开。
                       2,当前场景不是地图场景。
                       3,需要提示的物品说明里写了不提示的标识 <Nt> 。
                       4,说明 2。
                       5,其它。
=end

# 2022/06/07 纯属小虫对其进行修改
# 2022/06/08 更改动画的顺序,让其先显示飞动的物体,再显示横幅tips;且增加了横幅渐出效果
# 2022/06/09 添加了物品从当前事件飞出的动画,如果是公共事件则从自己身上飞出
# 2022/06/10 根据物品的稀有度来改变获得物品的颜色以及声音(细节部分大改)

# 2022/06/15 修复过图时,未飞出物品会凭空飞出在屏幕中的情况
# 2022/06/15 修复画面卷动的过程,物品不会随着卷动的问题
# 2022/07/30 修复了事件因受开关操作而导致的物品飞出异常的情况(直接从主角头上飞出)

#==============================================================================
module Xiao虫_PCTipsSeting # 用于储存显示效果的参数数据
  #==============================================================================
  #● 设置:
  #----------------------------------------------------------------------------
  #控制物品得失提示的开关ID(打开:不提示;关闭:提示)。
  Cont_switch = 5
  
  #控制物品图标飞行的开关ID(打开:跳过;关闭:显示)
  Icon_move_switch = 6

  #----------------------------------------------------------------------------
  #物品下落速度倍率(1~5)可以为小数。
  Move_rate = 2
  
  #----------------------------------------------------------------------------
  #图标图片的宽度。
  Icon_width = 24
  
  #----------------------------------------------------------------------------
  #图标图片的高度。
  Icon_height = 24
  
  #----------------------------------------------------------------------------
  # 提示窗口停留的时间(帧)。注意:这个时间包含了渐隐和透明度变0后的等待时间
  # 具体各阶段的持续时长在后面update_wait改  
  Wait_count = 90

  #----------------------------------------------------------------------------
  #连续获得物品的最短间隔;最小为1,不然容易出BUG
  Add_wait = 3

  #----------------------------------------------------------------------------
  # 物品从箱子里飞出来到开始飞向角色所用的总时间;如果改了该数字,也要改update_move中
  # mode 1 的内容,不然可能导致移动的像素出现浮点数,让物件飘动不对称!  尽量不要改!!
  Move_wait = 50

  #----------------------------------------------------------------------------
  #物品落向的画面坐标点(格式[x,y])。全部写 0 默认落向角色。
  Screen_place = [0,0]
  
  #----------------------------------------------------------------------------
  #金钱图标的图标名。
  Gold_iconName = "035-Item04"
  
  #----------------------------------------------------------------------------
  #失去物品提示完成后播放的动画ID(不播放写 0)。
  Lose_anmId = 0
  
  #----------------------------------------------------------------------------
  #金钱的用语(写 '' 默认为 数据库 金钱用语)。
  Gold_word = '金币'
  
  #----------------------------------------------------------------------------
  #得到金钱播放的SE文件名。
  Se_gold = '006-System06'
  
  #----------------------------------------------------------------------------
  #得到 劣质 普通 优质 稀有度 的道具的SE : 10 11 12
  Se_item_level_1 = '015-Jump01'

  #----------------------------------------------------------------------------
  #得到 稀有 神器 特殊 稀有度的道具的SE :13 14 15
  Se_item_level_2 = '016-Jump02'

  #----------------------------------------------------------------------------
  #得到 史诗 神话 稀有度的道具的SE :16 17
  Se_item_level_3 = '017-Jump03'

  #----------------------------------------------------------------------------
  #得到道具播放的SE文件名。
  #Se_item = '016-Jump02'
  
  #----------------------------------------------------------------------------
  #得到武器播放的SE文件名。
  #Se_weapon = '097-Attack09'
  
  #----------------------------------------------------------------------------
  #得到防具播放的SE文件名。
  #Se_armor = '005-System05'
  
  #----------------------------------------------------------------------------
  #得失金钱时,窗口的背景色。
  Color_gold = Color.new(255,240,166)
  
  #----------------------------------------------------------------------------
  #得失 劣质 普通 优质 稀有度 的道具的 窗口背景色
  Color_item_level_1 = Color.new(153,153,153)

  #----------------------------------------------------------------------------
  #得失 稀有 神器 特殊 的道具的 窗口背景色
  Color_item_level_2 = Color.new(255,201,124)

  #----------------------------------------------------------------------------
  #得失 史诗 神话 的道具的 窗口背景色
  Color_item_level_3 = Color.new(255,129,80)

  #----------------------------------------------------------------------------
  #得失道具时,窗口的背景色。
  #Color_item = Color.new(120,120,120)
  
  #----------------------------------------------------------------------------
  #得失武器时,窗口的背景色。
  #Color_weapon = Color.new(255,0,200)
   
  #----------------------------------------------------------------------------
  #得失防具时,窗口的背景色。
  #Color_armor = Color.new(0,200,200)
   
  #----------------------------------------------------------------------------
  #得到物品时,描绘物品数量的描边颜色。
  Color_gain = Color.new(0,200,0)   
   
  #----------------------------------------------------------------------------
  #失去物品时,描绘物品数量的描边颜色。
  Color_lose = Color.new(200,0,0)
  #==============================================================================
  #--------------------------------------------------------------------------
  # 获取文字显示颜色————这里改成了,无论如何,字体都是白色
  def self.name_color(item)
    color = Color.new(255,255,255)
    return color if item == 0
    # name_rarity 就是获取分割后的关键字 稀有度
    return color
  end
  #--------------------------------------------------------------------------
  # 如果名字中有 Nt  那该物品的得失将不会提示!
  def self.is_notTip(item)
    return item.name.match(/<Nt>/)
  end
end
#==============================================================================
# ●●●用于提取物件的名字文字的处理;如果要搭配其他【关键字】脚本,在这里修改
module RPG
  class Item
    # 获取物件的稀有度值
    def name_rarity
      name_rarity = @name.split(/●/)[1]
      return name_rarity != nil ? name_rarity.to_i : 0
    end
  end
  class Weapon
    # 获取物件的稀有度值
    def name_rarity
      name_rarity = @name.split(/●/)[1]
      return name_rarity != nil ? name_rarity.to_i : 0
    end
  end
  class Armor
    # 获取物件的稀有度值
    def name_rarity
      name_rarity = @name.split(/●/)[1]
      return name_rarity != nil ? name_rarity.to_i : 0
    end
  end
end
#==============================================================================
# ●●●用于提取获得物品的时候的,该事件的坐标
class Interpreter
  # 获得当前执行的事件的character对象
  def get_event_now
    # 获取地图上的所有事件
    events = $game_map.events
    if events == nil
      event_now = nil
    else
      event_now = events[@event_id]
    end
    # 如果触发的事件对象发生了改变,则初始化临时变量
    # ===========================================
    if $物品_触发的事件 != event_now
      # p "触发了不同事件"
      # 将坐标的全局变量变为默认
      $物品_触发的事件 = nil
      # 事件结束后,将得失数量归零
      $物品得失_当前icons数量 = 0
    end
    # ===========================================
    # $物品_触发的事件 用于记录获得物品的事件character对象
    if event_now != nil
      $物品_触发的事件 = event_now
    else
      $物品_触发的事件 = nil
    end
  end
  # 增加金钱
  alias command_125_old command_125
  def command_125
    # 获取该事件的坐标
    get_event_now
    command_125_old
  end
  # 增减物品
  alias command_126_old command_126
  def command_126
    # 获取该事件的坐标
    get_event_now
    command_126_old
  end
  # 增减武器
  alias command_127_old command_127
  def command_127
    # 获取该事件的坐标
    get_event_now
    command_127_old
  end
  # 增减防具
  alias command_128_old command_128
  def command_128
    # 获取该事件的坐标
    get_event_now
    command_128_old
  end
end

#==============================================================================
class XdRs_PCTip < RPG::Sprite # 建立专门用于动态显示的精灵类(动态类)
  #--------------------------------------------------------------------------
  # 窗口初始化
  def initialize(viewport,item,num)
    super(viewport)
    # 获取得失物品的数据
    ini_data(item,num)
  end
  #--------------------------------------------------------------------------
  # 释放
  def dispose
    self.bitmap.dispose;super
  end
  #--------------------------------------------------------------------------
  # 获取得失物品的数据,以及导入基础参数
  def ini_data(item,num)
    @item = item;@num = num
    # 控制是否显示物品飞行的开关
    @icon_fly = $game_switches[Xiao虫_PCTipsSeting::Icon_move_switch]
    # tip持续时间,每一个update都会减少1
    @wait_count = Xiao虫_PCTipsSeting::Wait_count
    # 用于记录tips持续时间的固定值
    @total_wait = Xiao虫_PCTipsSeting::Wait_count
    # icon从箱子里飞出来 至 开始移动向角色的总持续时间
    @move_wait = Xiao虫_PCTipsSeting::Move_wait
    # 已经过去的时间(帧数)
    @time_pass = 0
    # 用于记录move 持续时间的固定值
    @total_move_wait = Xiao虫_PCTipsSeting::Move_wait
    # 物件图形的大小
    @icon_rect = [Xiao虫_PCTipsSeting::Icon_width,Xiao虫_PCTipsSeting::Icon_height]
    # 物件飞向目标的速度
    @move_rate = [[Xiao虫_PCTipsSeting::Move_rate,1].max,5].min
    # 不知道。。。
    @anm_count = 0
    # 在记录中的 icon 的数量 ; 返还一个整数,同时也让这个变量独立起来
    @icon_num = $物品得失_当前icons数量
    # ●●●如果物件飞行的开关关闭了,或者是遗失物品,则直接跳过物件飞行步骤
    # 新定义的不飞行的场合--当获得数量小于等于0的时候,但要判定是不是字符串
    if @num.is_a?(String)
      fly = true
      fly = false if @icon_fly == true
    elsif @num <= 0
      fly = false
    elsif @icon_fly == true
      fly = false
    else
      fly = true
    end
    # 执行,不飞行的情况
    if fly == false
      @show = true;@moving = false;@can_delete = false;@touched = true
      ''if count_width || set_bitmap || draw_all
      return
    end
    # 读取触发物品增减的事件character对象
    @character_from = $物品_触发的事件
    # 将tips内容,于获得物品的这个事件绑定,nil的情况则是角色自己
    @character_from = $game_player if @character_from == nil
    # ●●● 逆转开关
    @show = false;@moving = true;@can_delete = false;@touched = false
    # 初始化物件框宽高度
    @width = @icon_rect[0]
    @height = @icon_rect[1]
    # ●●●---------------------------------------------------
    # set_bitmap 设置位图框框大小
    self.bitmap = Bitmap.new(@width, @height)
    # ●●●---------------------------------------------------
    # draw_icon描绘动态的物件
    return if icon_name == ""
    bitmap = RPG::Cache.icon(icon_name)
    # 在出发点上,建立一个矩形
    rect = Rect.new(0, 0, @icon_rect[0], @icon_rect[1])
    # 把位图框框传到矩形框框并在里头添加位图
    self.bitmap.blt(0, 0, bitmap, rect)
    # 初始的坐标  等于character坐标  (一个地图格是32*32)
    self.x = @character_from.screen_x
    self.y = @character_from.screen_y
    # 初始的放大率
    self.zoom_x = 0.2
    self.zoom_y = 0.2
  end
  #--------------------------------------------------------------------------
  # 更新
  def update
    super
    # 物品飞出并移动,然后接触,描绘tips
    update_move
    # 当物品接触到角色后,触发动画
    update_anm
    # 当tips出现之后,所等待其消失
    update_wait
  end
  #--------------------------------------------------------------------------
  # ●●●更新--控制icon移动
  def update_move
    return unless @moving
    # 【间隔设置】
    # ------------------------------------------------------------
    # 分段时间点,total_move 是从箱子飞出到停顿结束的时间(不包含飞向角色)
    # 保证后面的 b 尽量能被整除
    上飞时间 = 10
    a = @total_move_wait - 上飞时间
    # 横向间隔,一定要保证能被整除!!!
    b = 30 / (@total_move_wait-a)
    # ------------------------------------------------------------
    # 每帧减少的等待变量
    @move_wait -= 1 if @move_wait > 0
    # 记录过去的时间
    @time_pass += 1 if @move_wait > 0
    # 判断阶段
    mode = 1 if @move_wait > a
    mode = 2 if @move_wait > 0 and @move_wait <= a
    mode = 3 if @move_wait <= 0
    # 根据不同的阶段,开始不同的运动-----------
    case mode
    when 1 # 阶段1--物品从目标飞出来
      # 物品散落的效果,根据当前的序号来判定位置
      位置 = @icon_num % 7 + 1
      上升 =  @icon_num / 7 * 2
      case 位置
        when 1
          speed_x = 0
          speed_y = -8 - 上升
        when 2
          speed_x = -b
          speed_y = -7 - 上升
        when 3
          speed_x = b
          speed_y = -7 - 上升
        when 4
          speed_x = -2*b
          speed_y = -6 - 上升
        when 5
          speed_x = 2*b
          speed_y = -6 - 上升
        when 6
          speed_x = -3*b
          speed_y = -5 - 上升
        when 7
          speed_x = 3*b
          speed_y = -5 - 上升
      end
      @speed = [speed_x,speed_y]
      self.zoom_x += (1-0.2)/(@total_move_wait-a)
      self.zoom_y += (1-0.2)/(@total_move_wait-a)
      # 按照character直接设置位置! 这样位置就会随着character改变而改变
      # 下面的-1 是为了平衡初始位置,以让放大看上去是以中点放大
      self.x = @character_from.screen_x + @time_pass*@speed[0] - 1 * @time_pass
      self.y = @character_from.screen_y + @time_pass*@speed[1]
    when 2 # 阶段2--物品悬停在空中
      self.zoom_x = 1
      self.zoom_y = 1
      hold_place = [上飞时间 * @speed[0] , 上飞时间 * @speed[1]]
      self.x = @character_from.screen_x + hold_place[0] - 1 * 上飞时间
      self.y = @character_from.screen_y + hold_place[1]
    when 3 # 阶段3--物品跟随角色
      @speed = [0,0]
      sx = self.x - screen_place[0]
      sy = self.y - screen_place[1]
      range = sx.abs + sy.abs
      return if range == 0
      speed = (range < 50 ? 8 : (range < 100 ? 7 : 6)) * @move_rate
      self.zoom_x = self.zoom_y = range *0.005 + 0.5 if  range <= 100
      rx = [speed * sx.abs / range,sx.abs].min
      ry = [speed * sy.abs / range,sy.abs].min
      rx = sx > 0 ? -rx : rx
      ry = sy > 0 ? -ry : ry
      @speed = [rx,ry]
      # 改变位置
      self.x += @speed[0];self.y += @speed[1]
      # 与物件接触后,清除飞行的物体,然后开启标签显示的一系列操作
      if is_touch
        # 播放se
        se_name
        play_se
        self.bitmap.clear
        # 物件图形的大小
        @icon_rect = [Xiao虫_PCTipsSeting::Icon_width,Xiao虫_PCTipsSeting::Icon_height]
        # 不知道。。。
        @anm_count = 0
        # 变成tips的开关模式
        @show = true;@moving = false;@can_delete = false;@touched = true
        ''if count_width || set_bitmap || draw_all
      end
    end
    # 如果show开关开了,那就不会有任何动作了
    return if @show
  end
  #--------------------------------------------------------------------------
  # ●●●更新--动画  暂时好像也没啥用
  def update_anm
    return if @num.is_a?(String) || @num > 0 || @anm_count == 0
    @anm_count -= 1
    # @show = true if @anm_count == 0
  end
  #--------------------------------------------------------------------------
  # ●●●更新--tips在屏幕中的显示、逐渐消失
  def update_wait
    # 如果物品在移动中,不会触发这部分等待的内容
    return if @moving
    # 如果等待时间为0了,那也不再会处理这部分内容
    return if @wait_count == 0
    @wait_count -= 1
    # 阶段1 保持原始透明度持续的时间
    a = 50
    # 阶段2 渐变持续的时间
    b = 30
    # 渐隐的处理
    if @wait_count < @total_wait - a and @wait_count > @total_wait - a -b
      self.opacity -= 255/b if self.opacity >= 0
      self.opacity = 0 if self.opacity < 0
    end
    if @wait_count < @total_wait - a - b and self.opacity >= 0
      self.opacity = 0
    end
    # ●●● 修改,这里等待结束之后,那就完全结束了;删除开关打开
    @can_delete = true if @wait_count == 0
  end
  #--------------------------------------------------------------------------
  # 屏幕位置,返还角色在屏幕中的位置
  def screen_place
    place = Xiao虫_PCTipsSeting::Screen_place
    # 如果Screen_place不是(0,0),就用指定的坐标
    return place if place[0] > 0 && place[1] > 0
    # 否则,就是返回角色的xy坐标
    return [$game_player.screen_x, $game_player.screen_y-15]
  end
  #--------------------------------------------------------------------------
  # 判定是否接触/到达目标
  def is_touch
    place = screen_place
    return false if self.x+5 < place[0] || self.x > place[0]+5
    return false if self.y+5 < place[1] || self.y > place[1]+5
    return true
  end
  #--------------------------------------------------------------------------
  # 判定是否接触了
  def touched
    return @touched
  end
  #--------------------------------------------------------------------------
  # 返还::接触后,播放的SE的名称
  def se_name
    # 判定稀有度
    if @item != 0
      a =  @item.name_rarity
      if [13,14,15].include?(a)
        return Xiao虫_PCTipsSeting::Se_item_level_2
      elsif [16,17].include?(a)
        return Xiao虫_PCTipsSeting::Se_item_level_3
      else
        return Xiao虫_PCTipsSeting::Se_item_level_1
      end
    end
    # 如果都没有,就用下面这个
    return Xiao虫_PCTipsSeting::Se_gold
  end
  #--------------------------------------------------------------------------
  # 播放动画————这个在原定义里是失去物品时候的动画
  def play_anm
    @anm_count = 1
    return if Xiao虫_PCTipsSeting::Lose_anmId == 0
    anm = $data_animations[Xiao虫_PCTipsSeting::Lose_anmId]
    @anm_count = anm.frame_max + 5
    animation(anm, true)
  end
  #--------------------------------------------------------------------------
  def play_se
    Audio.se_play('Audio/SE/'+se_name, 100, 100) if se_name != ''
  end

  # 以下的各项定义都是为了显示tips做准备的,都会在update_move,is_touch之后执行
  #--------------------------------------------------------------------------
  #--------------------------------------------------------------------------
  def is_show
    return @show
  end
  #--------------------------------------------------------------------------
  def is_moving
    return @moving
  end
  #--------------------------------------------------------------------------
  def can_delete
    return @can_delete
  end
  #--------------------------------------------------------------------------
  # 直接将该项的删除开关打开,用于更换地图
  def delete_all
    p 1
    self.opacity = 0
    @can_delete = true
  end
  #--------------------------------------------------------------------------
  # 计算显示获得物品描述的框框的尺寸,基于内容物名称
  def count_width
    # 高度定义
    @height = @icon_rect[1] + 6
    @test_bitmap = Bitmap.new(10,10)
    @test_bitmap.font.size = (@icon_rect[1] * 4 / 5).to_i
    # 给文字变成粗体
    @test_bitmap.font.bold = true
    # 基础宽度
    @cont_width = 30
    # 前段文字宽度(名称)
    @cont_width += @test_bitmap.text_size(text_front).width
    # 后段文字宽度(数字)
    @cont_width += @test_bitmap.text_size(text_back).width
    @test_bitmap.dispose
    @width = @cont_width * 2
    # 原点X坐标
    self.ox = @cont_width
    # 原点Y坐标;@icon_rect[1]是图标的y长度
    self.oy = (@icon_rect[1]+6)/2
    # 还原放大率
    self.zoom_x = self.zoom_y = 1
    # 优先级
    self.x = 320;self.z = 9999;false
  end
  #--------------------------------------------------------------------------
  # 生成整个大框的bitmap对象,用于放置 图标;名字;+-;数量
  def set_bitmap
    self.bitmap = Bitmap.new(@width, @height)
    # @icon_rect[1]是图标的y长度
    self.bitmap.font.size = (@icon_rect[1] * 4 / 5).to_i
    self.bitmap.font.bold = true; false
  end
  #--------------------------------------------------------------------------
  def icon_name
    return @item.icon_name if @item != 0
    return Xiao虫_PCTipsSeting::Gold_iconName
  end
  #--------------------------------------------------------------------------
  def text_front
    return @item.name if @item != 0
    word = Xiao虫_PCTipsSeting::Gold_word
    return word != '' ? word : $data_system.words.gold
  end
  #--------------------------------------------------------------------------
  def text_back
    # 如果是字符串,直接返回
    if @num.is_a?(String)
      return ' ' + @num
    end
    # 变数字为绝对值
    num = @num.abs.to_s
    return @num > 0 ? '  + '+num : '  - '+num
  end
  #--------------------------------------------------------------------------
  def get_back_color
    # 判定稀有度
    if @item != 0
      a =  @item.name_rarity
      if [13,14,15].include?(a)
        return Xiao虫_PCTipsSeting::Color_item_level_2
      elsif [16,17].include?(a)
        return Xiao虫_PCTipsSeting::Color_item_level_3
      else
        return Xiao虫_PCTipsSeting::Color_item_level_1
      end
    end
    return Xiao虫_PCTipsSeting::Color_gold
  end
  #--------------------------------------------------------------------------
  # 将文字加粗描绘的方式
  def draw_text(x,y,txt,c1,c2=Color.new(0,0,0,160))
    w = self.bitmap.text_size(txt).width+5
    h = self.bitmap.font.size
    self.bitmap.font.color = c2
    self.bitmap.draw_text(x+1,y,w,h,txt)
    self.bitmap.draw_text(x-1,y,w,h,txt)
    self.bitmap.draw_text(x,y,w+1,h,txt)
    self.bitmap.draw_text(x,y,w-1,h,txt)
    self.bitmap.font.color = c1
    self.bitmap.draw_text(x,y,w,h,txt)
  end
  #--------------------------------------------------------------------------
  # 描绘整个得物品框框
  def draw_all
    # ●●● 描绘物品框框的前置条件
    ""if draw_back || draw_icon || draw_message
  end
  #--------------------------------------------------------------------------
  # 描绘背景的颜色
  def draw_back
    # 中轴的X坐标
    ax = self.bitmap.width / 2
    color = get_back_color.clone;color.alpha = 0
    # 对渐变的描绘,从左到右,一竖线一竖线地描绘
    for i in 0..self.bitmap.width
      color.alpha += 1 if i < ax && color.alpha < 160 # 160是最大透明度
      color.alpha -= 1 if i > self.bitmap.width-160 && color.alpha > 0
      next if color.alpha == 0
      self.bitmap.fill_rect(i, 0, 1, @height, color)
    end
    return false
  end
  #--------------------------------------------------------------------------
  # 描绘物品的图标---在tips当中
  def draw_icon
    @ix = (@width - @cont_width) / 2
    # 如果@show为关的时候,清除bitmap,也就是显示tips时会清除一次
    unless @show
      self.bitmap.clear
      return if @num < 0
    end
    return if icon_name == ""
    bitmap = RPG::Cache.icon(icon_name)
    rect = Rect.new(0, 0, @icon_rect[0], @icon_rect[1])
    self.bitmap.blt(@ix, 3, bitmap, rect)
    return false
  end
  #--------------------------------------------------------------------------
  def draw_message
    ax = (@width - @cont_width) / 2 + @icon_rect[0] + 6
    cx = self.bitmap.text_size(text_front).width
    color = Xiao虫_PCTipsSeting.name_color(@item)
    draw_text(ax,4,text_front,color)
    bx = self.bitmap.text_size(text_back).width
    # 根据得失来改变字体的颜色
    if @num.is_a?(String) or @num > 0
      color2 = Xiao虫_PCTipsSeting::Color_gain
    else
      color2 = Xiao虫_PCTipsSeting::Color_lose
    end
    color2.alpha = 160
    draw_text(ax+cx,4,text_back,Color.new(255,255,255),color2)
  end
end
#==============================================================================
class Game_Temp
  #--------------------------------------------------------------------------
  # 重新定义,添加新的初始化类变量
  alias xrdata_pctip_initialize initialize
  def initialize
    xrdata_pctip_initialize
    @pc_tips = []
    $物品_触发的事件 = nil
  end
  #--------------------------------------------------------------------------
  # 判定是否还有tip;;tip应该就是得到物品的这一列列信息数据
  def has_tip
    return @pc_tips.size > 0
  end
  #--------------------------------------------------------------------------
  # 添加获得物品的tip 到tip列表里
  def add_pcTip(data)
    return if $game_switches[Xiao虫_PCTipsSeting::Cont_switch]
    return unless $scene.is_a?(Scene_Map)
    @pc_tips << data
  end
  #--------------------------------------------------------------------------
  # 删除数列首项并返还该项,然后将后面数列的项目往前提
  def shift_tip
    return @pc_tips.shift
  end
  #--------------------------------------------------------------------------
  # 删除全部tips数据,一般在换地图时使用
  def delete_all_tips
    @pc_tips = []
  end
end
#==============================================================================
class Game_Party
  #--------------------------------------------------------------------------
  # 重新定义得到 金币 物品 武器 装备;在其后面加上得到物品的动画的初步处理
  alias xrdata_pctip_gain_gold gain_gold
  def gain_gold(n)
    pcTip_gold(n)
    xrdata_pctip_gain_gold(n)
  end
  #--------------------------------------------------------------------------
  alias xrdata_pctip_gain_item gain_item
  def gain_item(item_id, n)
    pcTip_item($data_items[item_id], n)
    xrdata_pctip_gain_item(item_id, n)
  end
  #--------------------------------------------------------------------------
  alias xrdata_pctip_gain_weapon gain_weapon
  def gain_weapon(weapon_id, n)
    pcTip_item($data_weapons[weapon_id], n)
    xrdata_pctip_gain_weapon(weapon_id, n)
  end
  #--------------------------------------------------------------------------
  alias xrdata_pctip_gain_armor gain_armor
  def gain_armor(armor_id, n)
    pcTip_item($data_armors[armor_id], n)
    xrdata_pctip_gain_armor(armor_id, n)
  end
  #--------------------------------------------------------------------------
  # 对tip的判断,如果得到物品为0  或者失去物品时所拥有物品为0  或者得到物品时物品满了
  # 那就会输出false  否则输出true
  def tip_judge(now,amount,max)
    # 如果实际获取数量为0,不将tips输入列表
    # return false if amount == 0
    # 如果为减少物品,且当前数量为 0 时,不加入列表
    # return false if now == 0   && amount < 0
    # 如果增加了物品,且物品满了,不加入列表
    # return false if now == max && amount > 0
    return true
  end
  #--------------------------------------------------------------------------
  # 用于计算,当物品【接近0】或【接近满】的时候,得到或失去的物品的真实的量
  def amount_count(now,amount,max)
    add = amount.abs # 返还amount的绝对值
    add = [now, add].min     if amount < 0
    add = [max-now, add].min if amount > 0
    # 如果物品已经是最大值,显示为已满
    add = "已满" if max-now == 0 and amount > 0
    return amount < 0 ? -add : add
  end
  #--------------------------------------------------------------------------
  # 返还所拥有的物品的量
  # 这里的obj来源于pcTip_item
  def obj_number(obj)
    case obj
    when RPG::Item   ;return item_number(obj.id)
    when RPG::Weapon ;return weapon_number(obj.id)
    when RPG::Armor  ;return armor_number(obj.id)
    end
    return 0
  end
  #--------------------------------------------------------------------------
  # 记录gold数据至tip  n为数量
  def pcTip_gold(n)
    return unless tip_judge(@gold,n,9999999)
    n = amount_count(@gold,n,9999999)
    $game_temp.add_pcTip([0,n])
  end
  #--------------------------------------------------------------------------
  # 记录item数据至tip____●●●这里改物品上限!  n为数量
  def pcTip_item(obj, n)
    return if !obj # || n < 0 && obj_number(obj) == 0    #后半注释掉,以便能出现-0
    return if Xiao虫_PCTipsSeting.is_notTip(obj)
    return unless tip_judge(obj_number(obj),n,999)
    n = amount_count(obj_number(obj),n,999)
    $game_temp.add_pcTip([obj,n])
  end
end
#==============================================================================
class Spriteset_Map
  # 最终的动态定义!
  #--------------------------------------------------------------------------
  # 添加新的类变量,用于储存获得物品的tips
  alias xrdata_pctip_initialize initialize
  def initialize
    # 这个初始化在每次更换地图时; 从别的scene后回到地图时 都会触发
    @pc_tips = []
    $物品得失_当前icons数量 = 0
    # 更换地图时,清除正在活动的所有tips,并且中断他们的显示
    $game_temp.delete_all_tips
    # 获得每个物品的最小间隔时间
    @tips_add_wait = 0
    xrdata_pctip_initialize
  end
  #--------------------------------------------------------------------------
  # 在总的dispose里释放tips
  alias xrdata_pctip_dispose dispose
  def dispose
    xrdata_pctip_dispose
    dispose_pcTips
  end
  #--------------------------------------------------------------------------
  def dispose_pcTips
    @pc_tips.each{|a| a.dispose}
  end
  #--------------------------------------------------------------------------
  alias xrdata_pctip_update update
  def update
    xrdata_pctip_update
    update_pcTips
  end
  #--------------------------------------------------------------------------
  # 定义 更新tips
  def update_pcTips
    # 如果存在tip  则添加新的tip
    add_pcTip if $game_temp.has_tip
    refresh_tips
  end
  #--------------------------------------------------------------------------
  # 添加新的tip进入对象数据集,数据集就是@pc_tips
  def add_pcTip
    if @tips_add_wait == 0
      data = $game_temp.shift_tip
      tip = XdRs_PCTip.new(@viewport3,data[0],data[1])
      @pc_tips << tip
      #●●● 添加物品保存数
      $物品得失_当前icons数量 += 1
      # 最短等待间隙
      @tips_add_wait = Xiao虫_PCTipsSeting::Add_wait
    else
      @tips_add_wait -= 1
      @tips_add_wait = 0 if @tips_add_wait < 0
    end
  end
  #--------------------------------------------------------------------------
  # 计算tip的Y坐标
  def front_y
    iy = Xiao虫_PCTipsSeting::Icon_height + 4
    hide = 0
    # ●●●计算还没有接触的tips的数量,以让接触了物品,获得新的tips,才会让tips上移
    @pc_tips.each do |tip|
      unless tip.touched
        hide += 1
      end
    end
    return [(480 - (@pc_tips.size-hide) * iy) / 2 - 50,10].max
  end
  #--------------------------------------------------------------------------
  # 刷新tips
  def refresh_tips
    # 为计算当前tips总量的全局变量
    #$物品得失_当前icons数量 = @pc_tips.size
    # 如果@pc_tips是空的,则直接返还true
    return if @pc_tips.size == 0
    # 获得物品的y坐标
    ay = front_y
    @pc_tips.each do |tip|
      if tip.can_delete
        tip.dispose;@pc_tips.delete(tip);next
      end
      tip.update
      # 这里是用于,如果tips消失了,让还没有消失的tips向上移动
      next unless tip.is_show
      tip.y = ay
      ay += tip.bitmap.height + 7
    end
  end
end

[/pre][/fold]

评分

参与人数 4星屑 +200 赞 +4 收起 理由
y967 + 1 美妙
guoxiaomi + 200 + 1 点个赞
plain666 + 1 塞糖
89444640 + 1 塞糖

查看全部评分

梦石
0
星屑
429
在线时间
103 小时
注册时间
2022-4-28
回帖
108
发表于 2022-6-10 20:03:39 | 显示全部楼层
感谢大佬的分享 .....
回复

使用道具 举报

梦石
0
星屑
1916
在线时间
190 小时
注册时间
2017-12-28
回帖
5
发表于 2022-6-11 10:07:59 | 显示全部楼层
很好很强大
回复

使用道具 举报

梦石
0
星屑
381
在线时间
31 小时
注册时间
2022-5-29
回帖
7
发表于 2022-6-11 10:56:14 | 显示全部楼层
厉害了
回复

使用道具 举报

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
发表于 2022-6-11 15:45:39 | 显示全部楼层
本帖最后由 89444640 于 2022-6-11 15:49 编辑

我挺喜欢这个效果的,当初这个就是想模拟 东方妖妖梦 敌人被击退以后爆炸,然后掉出很多 樱点,移动到屏幕上三分之一可以回收所有掉出来的樱点。
不过兼容性和处理速度我真不确定……只需要在模拟stg战斗时候用用一下,不知道战斗从场景能不能调用?
然后能不能做成一下就呈现360度爆出所有道具,然后停顿一下,然后回收到角色身上,而不是一点点出现?
然后类似于a rpg的真实掉落也可以,就是掉宝箱周围一片,自己去走过去“吃掉”,才能回收道具。
回复 1 0

使用道具 举报

梦石
0
星屑
26087
在线时间
1595 小时
注册时间
2016-1-6
回帖
3441

超评测参与极短28参与极短27参与极短26参与极短25参与

发表于 2022-6-11 16:55:21 | 显示全部楼层
感谢楼主的分享,太实用了。
回复

使用道具 举报

梦石
8
星屑
4051
在线时间
1684 小时
注册时间
2010-10-22
回帖
1041

极短26参与极短25获奖

发表于 2022-6-11 18:37:32 | 显示全部楼层
我也在用那个脚本,楼主的改进让我深受启发

【2022.06.03】原本以为已经不可能再找回来的东西重新找回来了,原本一直念念不忘的坑终于再一次拿起铲子了。一别竟近10年,你好,我的世界我的梦。
【大坑】异元-暗黑天际
【短25·不可阻挡】异元-地劫黎明
【短26·禁止】异元-禁忌之轮
回复

使用道具 举报

梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

 楼主| 发表于 2022-6-12 14:04:12 | 显示全部楼层
本帖最后由 纯属小虫 于 2022-6-15 17:12 编辑
89444640 发表于 2022-6-11 15:45
我挺喜欢这个效果的,当初这个就是想模拟 东方妖妖梦 敌人被击退以后爆炸,然后掉出很多 樱点,移动到屏幕 ...


战斗场景中目前还没有兼容进去,理论上是可以做到的(实际因为懒)
至于360度爆出,只要在369行,定义飞行阶段1的轨迹上修改就好了,这个脚本中的模式是向上的扇形
至于一点一点出现,修改65行的Add_wait值就好,这是控制物品飞出的时间间隔;这个数字可以为0,但写的过程中隐约感觉写0会出BUG,但懒的去找冲突在哪........
真是懒癌晚期了

至于真实掉落,可能要改这个脚本的逻辑;因为这个脚本是在开宝箱那一刻,就已经获得所有物品了,后续的只是动画效果,如果离开该地图或打开菜单,物品动画就中断了

理论上可以这样改:
1.把增减物品的脚本中的 获得物品相关的那几行删除
2.把406行 when3  也就是第三飞行阶段的@speed直接全程归0 或 当range<某数(与主角的像素距离) 这样物品就不会自己动了,只有主角靠近或者与其重合的时候才会捡取
3.在这个动画脚本中的422行 is_touch(屏幕坐标重合触碰) 的判定下面,加上获得物品的脚本
4.解决打开菜单后,tips被重置的问题(这个就麻烦了....)

先挖个坑,以后学Ruby熟练了慢慢填
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部