| 赞 | 46 |
| VIP | |
| 好人卡 | |
| 积分 | 329 |
| 经验 | |
| 最后登录 | 2026-2-3 |
| 在线时间 | 248 小时 |
- 梦石
- 24
- 星屑
- 8942
- 在线时间
- 248 小时
- 注册时间
- 2020-12-4
- 回帖
- 259
  
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 纯属小虫 于 2022-7-30 22:56 编辑
根据原作者 芯☆淡茹水 修改的物品得失显示脚本
刚看到这个脚本的时候感觉特别惊艳,RMX居然能做这种灵动的动作
于是头脑一热,希望能把效果改成自己想要的样子
改动点1:更改了原先的显示顺序;现在会先显示动态图标,当图标飞到角色身上的时候,才会显示物品的标签
改动点2:物品会从当前执行的事件,也就是获取物品的目标,如:宝箱,NPC啥的身上飞出来;如果当前事件是公共事件,则从角色自己身上飞出来
脚本小白,怕自己看不懂所以在脚本里加了一大堆的备注....以及一些没必要的语句
后续可能会继续优化

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

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

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] |
评分
-
查看全部评分
|