Project1
标题:
角色仓库怎么添加装备显示?(分辨率为640x480)
[打印本页]
作者:
千古一帝
时间:
2015-8-8 15:29
标题:
角色仓库怎么添加装备显示?(分辨率为640x480)
#—————————————————————————————————————
# ●APACK ver 1.6 date.2015.3.21 by.Lyaci
# ·角色存储(仓库)
# ·PMSYS更名为LYA_RASPM PMCC更名为该脚本名APACK
# ·使用:
# -创建仓库并打开界面(默认已创建ID为APACK_MAXLABEL的仓库)
# $game_party.scene_apack(仓库ID,该仓库名称,仓库容量)
# -进一步使用请查询Game_Party定义
#—————————————————————————————————————
module LYA_RASPM
#————————————————————————————————————————
#●仓库类设置
#————————————————————————————————————————
APACK_ALL = 50 #仓库的容量(默认)
APACK_MAX = 15 #队伍最多人数(必须设置)
APACK_MIN = 1 #队伍最少人数(nil为不设)
APACK_DEF = nil #队伍固定这个数(nil为不设)
APACK_NOPM = [5,6,8] #不能存放的角色(默认)
APACK_MAXLABEL = 0 #默认窗口ID,队伍满员后传送到的仓库ID
#————————————————————————————————————————
#●窗口类设置
#————————————————————————————————————————
APACKWIN_FACE = true #是否绘制头像特写
APACKWIN_CR_NAME = Color.new(255,255,255,255) #普通名字描绘色
APACKWIN_CR_SNAME = Color.new(255,50,50,255) #禁止存/取名字描绘色
APACKWIN_CR_XN = Color.new(255,255,255,128) #默认前景色
APACKWIN_CR_BACK = Color.new(180,230,255,88) #默认背景色
APACKWIN_CR_LBACK = Color.new(255,200,28,88) #收藏背景色
end
#————————————————————————————————————————
# ●Game_Party 数据主体
#————————————————————————————————————————
class Game_Party < Game_Unit
include LYA_RASPM
attr_accessor :apack #储存体
attr_reader :apack_vol #存储体容量
attr_reader :apack_label #存储体标签
attr_reader :apack_max, :apack_min, :apack_def #限定变量
attr_reader :apack_ap_name #存储体名称
#———————————————————————————————————————
#初始化仓库
#———————————————————————————————————————
alias :apack_initialize :initialize
def initialize
apack_initialize
@apack = {}
@apack_vol = {}
@apack_max = APACK_MAX
@apack_min = APACK_MIN
@apack_def = APACK_DEF
@apack_label = APACK_MAXLABEL
@apack_ap_name = ""
open_apack @apack_label
end
#———————————————————————————————————————
#打开仓库数据及界面
#———————————————————————————————————————
def scene_apack(label, ap_name = "普通仓库", vol = APACK_ALL)
open_apack(label, ap_name, vol)
SceneManager.call(Scene_APACK)
end
#———————————————————————————————————————
#设定存储体标签(设定准备要打开的仓库ID)
#———————————————————————————————————————
def apack_label=(label)
@apack_label = label
@apack[label] ||= Array.new(APACK_ALL)
end
#———————————————————————————————————————
#打开仓库数据
#———————————————————————————————————————
def open_apack(label, ap_name = "普通仓库", vol = APACK_ALL)
@apack_ap_name = ap_name
@apack_label = label
apack_all_set(label, vol)
end
#———————————————————————————————————————
#取得目前打开仓库的容量
#———————————————————————————————————————
def apack_vol
@apack_vol[@apack_label]
end
#———————————————————————————————————————
#角色入队
#———————————————————————————————————————
def add_actor(actor_id)
unless @actors.include?(actor_id)
if @actors.size < apack_max
name = $game_actors[actor_id].name
$game_message.add("角色【#{name}】加入队伍!")
@actors.push(actor_id) ; apack_ove(actor_id)
else
index = @apack[APACK_MAXLABEL].index(nil)
name = $game_actors[actor_id].name
if index
@apack[APACK_MAXLABEL][index] = actor_id
$game_message.add("角色【#{name}】已存入仓库!")
else
$game_message.add("仓库已满!角色【#{name}】未能存放!")
end
end
end
$game_player.refresh
$game_map.need_refresh = true
end
#———————————————————————————————————————
#角色离队
#———————————————————————————————————————
alias :apack_remove_actor :remove_actor
def remove_actor(actor_id)
apack_remove_actor(actor_id)
apack_ove(actor_id)
end
#———————————————————————————————————————
#存入、拿出角色(内部用)
#pi:队伍的项目ID ci:仓库的项目ID
#———————————————————————————————————————
def apack_pcts(pi,ci)
#取得目前仓库位置角色ID
cact = @apack[@apack_label][ci]
#放置新角色ID到该仓库位置
@apack[@apack_label][ci] = @actors[pi]
#该仓库位置有角色的情况下加入到队伍位置
#没有角色的话直接从队伍删除
cact ? @actors[pi] = cact : @actors.delete_at(pi)
end
#———————————————————————————————————————
#直接存入仓库
#———————————————————————————————————————
def apack_add(label, id)
#仓库是否有空位
index = @apack[label].index(nil)
if !@apack[label].include?(id) && index
#存入仓库
@apack[label][index] = id
#在队伍的话离队
@actors.delete(id)
#刷新队伍、及地图
$game_player.refresh
$game_map.need_refresh = true
end
end
#———————————————————————————————————————
#直接从仓库取出
#———————————————————————————————————————
def apack_get(id)
@apack.each {|key,val| break(add_actor(id)) if val.include?(id)}
end
#———————————————————————————————————————
#直接从仓库删除
#———————————————————————————————————————
def apack_ove(id)
@apack.each {|key,val| break(val[val.index(id)] = nil) if val.include?(id)}
end
#———————————————————————————————————————
#不能存放的角色(队伍仓库通用)
#———————————————————————————————————————
def apack_no(id=nil)
@apack_no ||= LYA_RASPM::APACK_NOPM
@apack_no << id if id && !@apack_no.include?(id);@apack_no
end
#———————————————————————————————————————
#解除不可存放的角色(队伍仓库通用)
#———————————————————————————————————————
def apack_ok(id)
@apack_no.delete(id)
end
#———————————————————————————————————————
#仓库的角色
#———————————————————————————————————————
def apack_actor
@apack[@apack_label].collect {|id| id ? $game_actors[id] : id }
end
#———————————————————————————————————————
#收藏的角色
#———————————————————————————————————————
def apack_like(id=nil)
@apack_like ||= []
@apack_like.include?(id) ? @apack_like.delete(id) : @apack_like.push(id) if id
@apack_like
end
#———————————————————————————————————————
#队伍的最大人数
#———————————————————————————————————————
def apack_max=(num)
@apack_max ||= LYA_RASPM::APACK_MAX
@apack_max = num if num ; @apack_max
end
#———————————————————————————————————————
#队伍的最少人数
#———————————————————————————————————————
def apack_min=(num)
@apack_min ||= LYA_RASPM::APACK_MIN
@apack_min = num if num ; @apack_min
end
#———————————————————————————————————————
#队伍的指定人数
#———————————————————————————————————————
def apack_def=(num)
@apack_def ||= LYA_RASPM::APACK_DEF
@apack_def = num if num ; @apack_def
end
#———————————————————————————————————————
#仓库的容量 del:false:限制容量 true:真实容量
#———————————————————————————————————————
def apack_all_set(label,num,del=false)
@apack[label] ||= Array.new
#获得当前、新的容量
@apack_vol[label] ||= @apack[label].size
now = @apack_vol[label]
new = @apack_vol[label] = num
c = new - now
#被扩大仓库情况
if now < new ; @apack[label] += Array.new(c)
#被缩小仓库情况(del为开启时)角色全部前移容量外的删除
elsif now > new && del
apack = @apack[label].compact
c = [new - apack.size, 0].max
@apack[label] = apack[0,new] + Array.new(c) ; end
num
end
#———————————————————————————————————————
#清空仓库(V1.1)
#———————————————————————————————————————
def apack_allove
@apack[@apack_label] = Array.new(@apack_vol[@apack_label]||0)
end
end
#————————————————————————————————————————
# ●Window_APACK 窗口主体
#————————————————————————————————————————
class Window_APACK < Window_Selectable
C1 = Color.new(239, 32, 71, 255)
C2 = Color.new(214, 180, 160, 255)
#———————————————————————————————————————
#初始化对象
#———————————————————————————————————————
def initialize(x, y, w, h, l, type, viewport)
#列数及类型
@l = l ; @type = type
#使用父类
super(x, y, w, h)
#选项位置
self.index = -1
#显示端口
self.viewport = viewport
#预留空位(窗口)
self.padding_bottom = dnh
#生成动态行走图(z提高)
dviewport = Viewport.new(x+50,viewport.rect.y+hk,w,h-hk*2-2)
dviewport.z = 2000
@dych = Dynamic_Character.new(x, y, self.z, dviewport)
#记录隐蔽行走图的标准选项
@dychtfi = 0
#生成信息精灵
@info = Sprite.new(viewport)
#生成位图,宽、高继承预留空位
@info.bitmap = Bitmap.new(contents_width, h)
#信息坐标(边距同步)
@info.x = standard_padding
@info.y = standard_padding
#信息高于本窗口
@info.z = self.z
#生成成员信息精灵
@info_pc = Sprite.new(viewport)
@info_pc.bitmap = Bitmap.new(contents_width, h)
@info_pc.x = standard_padding ; @info_pc.y = standard_padding ; @info_pc.z = @info.z
#生成背景精灵
@back = Sprite.new(viewport)
#生成位图,宽、高继承本窗口绘制内容
@back.bitmap = Bitmap.new(contents_width, contents_height)
#背景坐标(边距同步)
@back.x , @back.y = x+standard_padding, y+standard_padding
#背景高于本窗口
@back.z = self.z
#更改字体大小
@back.bitmap.font.size = 18
#更改字体透明度
@back.bitmap.font.color.alpha = 86
#记录当前窗口选项
@sindex = 0
#绘制信息>内容
refresh
update_padding_bottom
end
#———————————————————————————————————————
#获取数据
#———————————————————————————————————————
def data
case @type ; when :L ; ldata ; when :R ; rdata ; end
end
#———————————————————————————————————————
#预留数据
#———————————————————————————————————————
def data2(data2=nil)
@data2 = data2 ? data2 : @data2 ; @data2
end
#———————————————————————————————————————
#基本数据
#———————————————————————————————————————
def ldata ; $game_party.members ; end
def rdata ; $game_party.apack_actor ; end
#———————————————————————————————————————
#获得、设置当前角色数据(V1.1)
#———————————————————————————————————————
def index_actor ; @index_actor ; end
def index_actor=(actor) ; @index_actor = actor ; end
#———————————————————————————————————————
#动态行走图选择项动态
#———————————————————————————————————————
def one=(tf) ; @dych.one=@dy_one=tf ; end
#———————————————————————————————————————
#动态行走图显示类型更改
#———————————————————————————————————————
def dy_type=(type) ; @dych.type=@dy_type=type ; end
#———————————————————————————————————————
#获取项目数
#———————————————————————————————————————
def item_max
case @type
when :L ; $game_party.apack_max
when :R ; $game_party.apack_vol ; end
end
#———————————————————————————————————————
#获取列数
#———————————————————————————————————————
def col_max ; @l ; end
#———————————————————————————————————————
#宽高间隔
#———————————————————————————————————————
def wk ; return 2 ; end
def hk ; return 8 ; end
#———————————————————————————————————————
#获取行高
#———————————————————————————————————————
def line_height ; return 24 ; end
#———————————————————————————————————————
#获取项目宽度、高度
#———————————————————————————————————————
def item_width ; return 196 ; end
def item_height ; return line_height ; end
#———————————————————————————————————————
#获取标准边距
#———————————————————————————————————————
def standard_padding ; return 12 ; end
#———————————————————————————————————————
#下端空白内容高度
#———————————————————————————————————————
def dnh ; return 0 ; end
#———————————————————————————————————————
#计算窗口内容的高度
#———————————————————————————————————————
def contents_height
ch = [super - super % item_height, all_row_max * (item_height + hk)].max
case @type
when :L ; return ch + (item_height + hk)
when :R ; return ch ; end
end
#--------------------------------------------------------------------------
# ● 获取一页內显示的行数
#--------------------------------------------------------------------------
def page_row_max
(height - padding - padding_bottom) / (item_height + hk) + 1
end
#--------------------------------------------------------------------------
# ● 更新下端边距
#--------------------------------------------------------------------------
def update_padding_bottom
self.padding_bottom = hk
end
#———————————————————————————————————————
# ● 获取队伍、仓库全部行数
#———————————————————————————————————————
def all_row_max
case @type
when :L ; all_item_max = $game_party.apack_max
when :R ; all_item_max = rdata.size ; end
[(all_item_max + col_max - 1) / col_max, 1].max
end
#———————————————————————————————————————
#获取顶行位置
#———————————————————————————————————————
def top_row
oy / (item_height + hk)
end
#———————————————————————————————————————
#设置顶行位置
#———————————————————————————————————————
def top_row=(row)
#窗口原点坐标更新
row = 0 if row < 0
row = row_max - 1 if row > row_max - 1
self.oy = row * (item_height + hk)
#必要精灵原点更新
sproxoy
end
#———————————————————————————————————————
#更新必要精灵原点(背景、行走图)
#———————————————————————————————————————
def sproxoy
@dych.oy = @back.oy = self.oy
end
#———————————————————————————————————————
#获取项目的绘制矩形
#———————————————————————————————————————
def item_rect(index)
rect = Rect.new
rect.width = item_width
rect.height = item_height
rect.x = index % col_max * (item_width + wk) + 320+95
rect.y = index / col_max * (item_height + hk)
rect
end
#———————————————————————————————————————
#更新光标
#———————————————————————————————————————
def update_cursor
super
#更新动态行走图光标
@dych.index = self.index if @dy_one && @dych
#更新选中对象的能力值信息
if @index != @old_index
@old_index = @index
info_pc(data[@index]) if self.active
end
end
#———————————————————————————————————————
#绘制内容
#———————————————————————————————————————
def refresh
#清除全体
contents.clear
@dych.clear
@back.bitmap.clear
#开始绘制
item_max.times {|index|
draw_item(index)}
#更新内容
data_refresh
info
info_pc(data.compact[0])
end
#———————————————————————————————————————
#更新内容
#———————————————————————————————————————
def data_refresh
#必要精灵原点更新
sproxoy
end
#———————————————————————————————————————
#更新背景
#———————————————————————————————————————
def back_refresh
#清除背景
@back.bitmap.clear
#开始绘制
item_max.times {|index|
#项目数据
actor = data[index]
#项目矩形
rect = item_rect(index)
#项目坐标
x = rect.x ; y = rect.y
#描绘背景
back(x, y, index, actor)}
end
#———————————————————————————————————————
#绘制项目(替换时更新)
#———————————————————————————————————————
def draw_item(index)
#项目数据
actor = data[index]
#项目矩形
rect = item_rect(index)
#项目坐标
x = rect.x ; y = rect.y
#描绘背景
back(x, y, index, actor)
#角色不存在则返回
return unless actor
#行走图
@dych.draw_character(x+15, y+30, actor, index)
#描绘基本色
contents.font.color = LYA_RASPM::APACKWIN_CR_NAME
#名字背景
lh = (line_height) * 0
c = LYA_RASPM::APACKWIN_CR_XN
contents.back_w(x,y+lh,item_width,line_height,0.25,c)
#是否可存取角色
apack_no = $game_party.apack_no.include?(actor.id)
contents.font.color = LYA_RASPM::APACKWIN_CR_SNAME if apack_no
#头像
draw_face(actor, rect.x + 51, rect.y + 1) if LYA_RASPM::APACKWIN_FACE
#名字
contents.draw_text(x+20, y+lh, item_width, line_height, actor.name, 1)
end
#———————————————————————————————————————
#绘制角色肖像图
#———————————————————————————————————————
def draw_face(actor, x, y)
#图像名 没有的话返回
face_name = actor.face_name
#没有图像
return unless face_name
#索引种类
face_index = actor.face_index
#传送位图
bitmap = Cache.face(face_name)
zx = face_index % 4 * 96
zy = face_index / 4 * 96
cw = ch = 94
rect = Rect.new(zx, zy+28, 96-2, line_height-1)
contents.blt(x+40, y, bitmap, rect, 164)
bitmap.dispose
end
#———————————————————————————————————————
#绘制背景
#———————————————————————————————————————
def back(x, y, index, actor)
#存在角色的情况下
if actor
actor_like = $game_party.apack_like.include?(actor.id)
#不显示头像或有收藏的情况下(选择默认、收藏背景)
if actor_like
#收藏背景颜色
c = LYA_RASPM::APACKWIN_CR_LBACK
else
#默认背景颜色
c = LYA_RASPM::APACKWIN_CR_BACK
end
else
#默认背景颜色
c = LYA_RASPM::APACKWIN_CR_BACK
end
#描绘背景
@back.bitmap.back_h(x,y,item_width-1,item_height-1,0.5,c)
#描绘编号
@back.bitmap.draw_text(x+2, y+2, 20, item_height, index+1,1)
end
#———————————————————————————————————————
#绘制收藏背景(更新用)
#———————————————————————————————————————
def back_like(index)
#项目数据
actor = data[index]
#项目矩形
rect = item_rect(index)
#项目坐标
x = rect.x + 1 ; y = rect.y + 1
#消除背景
@back.bitmap.clear_rect(rect)
#描绘背景
back(x, y, index, actor)
end
#———————————————————————————————————————
#绘制行走图
#———————————————————————————————————————
def draw_character(character_name, character_index, x, y)
return unless character_name
bitmap = Cache.character(character_name)
sign = character_name[/^[\!\$]./]
if sign && sign.include?(')
cw = bitmap.width / 3
ch = bitmap.height / 4
else
cw = bitmap.width / 12
ch = bitmap.height / 8
end
n = character_index
src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch)
@info_pc.bitmap.blt(x +10- cw / 2, y - ch, bitmap, src_rect)
end
#———————————————————————————————————————
#绘制信息标题
#———————————————————————————————————————
def info
#清除旧信息
@info.bitmap.clear
actor = data.compact[0]
@info.bitmap.font.size = 20
return info_top unless actor
type = @type.eql? :L
nc = type ? " 队伍" : " 仓库"
nu = type ? "#{data.compact.size}" : "#{data.compact.size}/#{item_max}"
txt2 = nc+"人数:"+nu
@info.bitmap.draw_text(0,0,320,line_height,txt2)
@info.bitmap.font.size = 18
@info.bitmap.back_w(0,82,320,1,0.2,Color.new(255,255,255,128))
end
def info_top
return if @type.eql? :L
txt = $game_party.apack_ap_name + " 仓库人数:#{data.compact.size}/#{item_max}"
@info.bitmap.draw_text(0,0,320,line_height,txt)
end
#———————————————————————————————————————
#绘制选中成员信息(更新用)
#———————————————————————————————————————
def info_pc(actor)
@info_pc.bitmap.clear
return unless actor
draw_parameters(actor,38, 65)
end
def draw_parameters(actor,x, y)
@info_pc.bitmap.font.size = 18
#描绘名字职业等级
# text = "#{actor.name} #{actor.class.name} Lv:#{actor.level}"
# @info_pc.bitmap.draw_text(x-20, y -36, 286, 24, text,1)
#描绘Hp Mp
c1 = Color.new(239, 32, 71, 255)
c2 = Color.new(214, 180, 160, 255)
draw_cr(x-10,y-30,c1,c2,actor.hp,actor.mhp,txt='Hp',width=100,height=5)
c1 = Color.new(58, 112, 128, 255)
c2 = Color.new(118, 244, 254, 255)
draw_cr(x-10,y,c1,c2,actor.mp,actor.mmp,txt='Mp',width=100,height=5)
#绘制能力值背景
@info_pc.bitmap.font.size = 21
@info_pc.bitmap.back_w(x-30,y+30,145,120,0.2,Color.new(255,255,-255,64))
6.times {|i|
#能力值的显示位置
y2 = i
# x2 = i/3*130 ; y2 = i%3
#描绘能力值
change_color(system_color)
@info_pc.bitmap.font.color = system_color
@info_pc.bitmap.draw_text(x-10, y + 20 * y2, 86, line_height+55, Vocab::param(i+2))
@info_pc.bitmap.font.color = normal_color
@info_pc.bitmap.draw_text(x+60, y + 20 * y2, 86, line_height+55, actor.param(i+2))}
end
#———————————————————————————————————————
#绘制HP MP
#———————————————————————————————————————
def draw_cr(x,y,c1,c2,current,max,txt='',width=100,height=5)
#背景颜色
back_color = Color.new(0,0,0,255)
#边框色颜色
bk_color = Color.new(255,255,255,255)
#倒影颜色
dy_color = Color.new(0,0,0,128)
#倒影偏移
dx = 2;dy = 4
#斜率
xl = 5
#数值是否显示
num = true
#显示数值的对齐方式 0:向左对齐 1:向中间对齐 2:向右边对齐
num_align = 1
#计算比率
bl = current.to_f / max
#计算实际宽
w = (width*bl).round
#计算锯齿
px = [1,(xl/height.to_f).round].max
#实际斜率
oxl = px*height
#描绘值槽
x2 = 0;height.times {|i|
@info_pc.bitmap.fill_rect(x+oxl-x2+dx/px, y+i+dy, width, 1, dy_color)
px.times {|n| x2 += 1}}
x2 = 0;height.times {|i|
@info_pc.bitmap.fill_rect(x+oxl-x2, y+i, width, 1, back_color)
px.times {|n| x2 += 1}}
x2 = 0;height.times {|i|
@info_pc.bitmap.gradient_fill_rect(x+oxl-x2, y+i, w, 1, c1,c2)
px.times {|n| x2 += 1}}
x2 = 0
@info_pc.bitmap.fill_rect(x+oxl, y-1, width+1, 1, bk_color)
@info_pc.bitmap.fill_rect(x, y+height, width+1, 1, bk_color)
height.times {|i|;px.times {|n|
@info_pc.bitmap.fill_rect(x+oxl-x2-1, y+i, 1, 1, bk_color)
@info_pc.bitmap.fill_rect(x+oxl-x2+width, y+i, 1, 1, bk_color);x2 += 1}}
#描绘文字
@info_pc.bitmap.font.size = 16
txt_w = @info_pc.bitmap.text_size(txt).width + 2
@info_pc.bitmap.draw_text(x-txt_w,y+height/2-12, width, 24, txt)
@info_pc.bitmap.draw_text(x+oxl/2,y+height/2-12, width, 24,
current.to_s+'/'+max.to_s,num_align) if num
end
#———————————————————————————————————————
#绘制战力
#———————————————————————————————————————
# def draw_cr2(x,y,c1,c2,current,max,txt='',width=100,height=5,bitmap)
#背景颜色
# back_color = Color.new(0,0,0,64)
#数值是否显示
# num = true
#显示数值的对齐方式 0:向左对齐 1:向中间对齐 2:向右边对齐
# num_align = 1
#计算比率
# bl = current.to_f / max
#计算实际宽
# w = [(width*bl).round, width].min
# bitmap.fill_rect(x, y, width, height, back_color)
# bitmap.gradient_fill_rect(x, y, w, height, c1,c2)
#描绘文字
# bitmap.font.size = 16
# txt_w = @info_pc.bitmap.text_size(txt).width + 2
# bitmap.draw_text(x-txt_w,y+height/2-12, width, 24, txt)
# bitmap.draw_text(x,y+height/2-12, width, 24,
# current.to_s+'/'+max.to_s,num_align) if num
# end
#———————————————————————————————————————
#重定义激活方法
#———————————————————————————————————————
def actives=(tf)
#是否关闭未激活窗口的动态行走图
@dych.type = tf ? @dy_type : nil
#记录和使用该窗口位置
if tf ; self.index = @sindex
else ; @sindex = [self.index,0].max ; end
#窗口是否激活
self.active = tf
end
#———————————————————————————————————————
#获取总能力值(基础)
#———————————————————————————————————————
# def param_base(actor)
# all_param_base = 0
# 8.times {|i| f = i > 1 ? 1 : LYA_RASPM::APACKWIN_PBHPMP
# all_param_base += actor.param_base(i) / f }
# all_param_base
# end
#———————————————————————————————————————
#位图剪切排序法
#———————————————————————————————————————
def new_bit_rect
#获得新的数据
new_d = data
#获得旧的数据
now_d = data2
#获得当前位图
bit = contents
#以旧的数据长度循环
new_d.each_index {|index|
#当前循环项对应的新数据
new_d_i = new_d[index]
#查找新的数据在旧的数据里的位置(旧项目、继承矩形用)
new_now_index = now_d.index(new_d_i)
#新旧位置相同时不重绘,进入下个循环项
next unless new_now_index && index != new_now_index
#新位置的矩形
new_rect = item_rect(index)
#旧位置的矩形
now_rect = item_rect(new_now_index)
#清除新项目上的矩形
contents.clear_rect(new_rect)
#绘制旧项目上的矩形
contents.blt(new_rect.x, new_rect.y ,bit,now_rect)
#清除旧项目上的矩形
contents.clear_rect(now_rect)}
end
#———————————————————————————————————————
#消除项目
#———————————————————————————————————————
def clear_item(index)
#要消除的项目矩形
rect = item_rect(index)
#本窗口消除
contents.clear_rect(rect)
#背景消除
@back.bitmap.clear_rect(rect)
#队伍窗口的情况查看是否要排序
if @type == :L
#项目数量没有变化时不执行排序
return if data.size == data2.size
#释放行走图精灵(队伍)
@dych.dispose_index(index)
#显示隐蔽的行走图
@dych.visible(@dychtfi-1, true)
#行走图排序开始
@dych.new_spr_xy
#位图排序开始
new_bit_rect
#背景排序开始
back_refresh
elsif @type == :R
#预留数据不存在的情况下
return unless data2[index]
#释放行走图精灵(仓库)
@dych.dispose_index(index,true)
end
end
#———————————————————————————————————————
#重绘项目
#———————————————————————————————————————
def redraw_item(index)
#消除项目
clear_item(index)
#绘制项目
draw_item(index)
end
#———————————————————————————————————————
#排序绘制
#———————————————————————————————————————
def new_refresh
true_index = @type.eql?(:L) ? [@index, data2.size].min : @index
#更新信息
info; info_pc(data[@index])
#重绘项目
redraw_item(true_index)
#更新内容
data_refresh
end
#———————————————————————————————————————
#按下确定键时的处理
#———————————————————————————————————————
def a_c
#~ refresh #常规绘制(*预留)
new_refresh #排序绘制
end
#———————————————————————————————————————
#按下CTRL键时的处理
#———————————————————————————————————————
def a_ctrl
#获取当前选项
index = self.index
#对应角色数据
actor = data[index]
#角色不存在则反回
return unless actor
#收藏、取消收藏角色
$game_party.apack_like(actor.id)
#更新收藏背景
back_like(index)
end
#———————————————————————————————————————
#全部刷新
#———————————————————————————————————————
def update
super
@dych.update
end
#———————————————————————————————————————
#全部释放
#———————————————————————————————————————
def dispose
super
@dych.dispose
@info.bitmap.dispose ; @info.dispose
@info_pc.bitmap.dispose ; @info_pc.dispose
@back.bitmap.dispose ; @back.dispose
end
end
#————————————————————————————————————————
# ●Scene_APACK By.Clov
# *仓库界面
# *Ver:1.0 Date:2013.9.14
# *使用:SceneManager.call(Scene_APACK)
# -ENTER: 确认/返回
# -ESC: 返回
# -L/R: 换页
# -CTRL: 添加收藏/取消收藏
#————————————————————————————————————————
class Scene_APACK
#———————————————————————————————————————
#数据内容
#———————————————————————————————————————
def data
w = Graphics.width
h = Graphics.height / 2
#生成端口
@viewport = Viewport.new
@viewport.z = 2001
@viewport1 = Viewport.new(0,0,w,h)
@viewport1.z = 200
@viewport2 = Viewport.new(0,h,w,h)
@viewport2.z = 200
#生成队伍窗口
@apack_window_l = Window_APACK.new(0,0,w,h,1,:L,@viewport1)
@apack_window_l.one = false
@apack_window_l.dy_type = :W
@apack_window_l.actives = !false
#生成仓库窗口
@apack_window_r = Window_APACK.new(0,0,w,h,1,:R,@viewport2)
@apack_window_r.one = true
@apack_window_r.dy_type = :W
@apack_window_r.actives = false
#生成结束窗口
@apack_window_end = Window_Base.new(22,160,500,96)
@apack_window_end.viewport = @viewport
@apack_window_end.z = @apack_window_r.z + 1
@apack_window_end.visible = false
#生成背景
create_background
#仓库确认计数(循环替换状态计数,操作流畅度提高用)
@ok2 = 0
end
#———————————————————————————————————————
#主循环
#———————————————————————————————————————
def main
#准备数据
data
#执行过渡
Graphics.transition
#进行更新
update until SceneManager.scene != self
#准备过渡
Graphics.freeze
#释放全部
dispose
end
#———————————————————————————————————————
#主更新
#———————————————————————————————————————
def update
#画面、输入更新
Graphics.update
Input.update
#按键更新
updata_c
updata_b
updata_ctrl
#窗口更新
@apack_window_l.update
@apack_window_r.update
@apack_window_end.update
end
#———————————————————————————————————————
#结束窗口的描绘
#———————————————————————————————————————
def end_txt(txt)
@apack_window_end.contents.clear
@apack_window_end.contents.draw_text(0,4,500,24,txt,1)
@apack_window_end.contents.draw_text(0,36,500,24,"[ESC] [ENTER]",1)
end
#———————————————————————————————————————
#是否可以退出仓库
#———————————————————————————————————————
def end_ok?
apack_max = $game_party.apack_max
apack_min = $game_party.apack_min
apack_def = $game_party.apack_def
return true if apack_min.to_i > apack_max || apack_def.to_i > apack_max
pas = $game_party.members.compact.size
minb = apack_min <=> pas #-1 ok 0
defb = apack_def <=> pas # 0 ok 0
tf = true
tf = false if minb == 1
tf = false if defb && defb != 0
tf = true if defb && defb == 0
unless tf
Sound.play_buzzer
if defb ; txt = "队伍人数必须等于#{apack_def}名"
else ;
apack_min = apack_min ? "最少#{apack_min}名" : ""
txt = "队伍人数必须#{apack_min}" ; end
end_txt(txt+"(目前#{pas}名)")
end ; tf
end
#———————————————————————————————————————
#是否可以替换角色
#———————————————————————————————————————
def pcts_ok?(t,i)
#获得禁止角色
apack_no = $game_party.apack_no
case t
when :L ; id = $game_party.members[i].id if $game_party.members[i]
when :R ; id = $game_party.apack_actor[i].id if $game_party.apack_actor[i] ; end
tf = !apack_no.include?(id)
#禁止的情况下演奏声效并返回禁止/不禁止状态
Sound.play_buzzer unless tf ; tf
end
#———————————————————————————————————————
#生成背景 VA
#———————————————————————————————————————
def create_background
@background_sprite = Sprite.new
@background_sprite.bitmap = SceneManager.background_bitmap
@background_sprite.color.set(16, 16, 16, 128)
end
#———————————————————————————————————————
#替换队伍、仓库成员
#———————————————————————————————————————
def pcts
#演奏声效
Sound.play_reflection
#队伍、仓库当前选择项
members = $game_party.members
pi = [@apack_window_l.index, members.size].min
ci = @apack_window_r.index
#预留数据
@apack_window_l.data2(members)
@apack_window_r.data2($game_party.apack_actor)
#更换成员执行
$game_party.apack_pcts(pi,ci)
#更新绘制
@apack_window_l.a_c
@apack_window_r.a_c
end
#———————————————————————————————————————
#进入队伍窗口
#———————————————————————————————————————
def pwin
@apack_window_r.actives = false
@apack_window_l.actives = true
@apack_window_end.visible = false
end
#———————————————————————————————————————
#进入仓库窗口
#———————————————————————————————————————
def cwin
@apack_window_r.actives = true
@apack_window_l.actives = false
@apack_window_end.visible = false
end
#———————————————————————————————————————
#进入结束窗口
#———————————————————————————————————————
def ewin
@apack_window_r.actives = false
@apack_window_l.actives = false
@apack_window_end.visible = true
end
#———————————————————————————————————————
#按下确定键
#———————————————————————————————————————
def updata_c
#按下确定键的情况下
if Input.trigger?(:C)
#结束窗口的情况下
if @apack_window_end.visible
#返回队伍窗口
pwin ; return
end
#队伍窗口的情况下
if @apack_window_l.active && pcts_ok?(:L, @apack_window_l.index)
case @ok2
#替换成员、仓库确认计数1(进入循环替换状态)
when 2 ; pcts ; @ok2 = 1 ; cwin
#进入仓库窗口
when 0 ; cwin ; end
#仓库窗口的情况下
elsif @apack_window_r.active && pcts_ok?(:R, @apack_window_r.index)
#仓库确认计数+1
@ok2 += 1
case @ok2
#替换成员(转入循环替换状态前)
when 1 ; pcts
#进入队伍窗口
when 2 ; pwin ; end
end
end
end
#———————————————————————————————————————
#按下返回键
#———————————————————————————————————————
def updata_b
#按下返回键的情况下
if Input.trigger?(:B)
#结束窗口的情况下
if @apack_window_end.visible
#返回队伍窗口
pwin ; return
end
#队伍窗口的情况下
if @apack_window_l.active
#不可以退出仓库的情况下
unless end_ok?
#进入结束窗口
ewin ; return
end
case @ok2
#循环替换状态的话返回仓库窗口
when 2 ; @ok2 = 1; cwin ; return ; end
#返回上个界面
SceneManager.return
#仓库窗口的情况下
elsif @apack_window_r.active
#仓库确认计数重置
@ok2 = 0
#返回队伍窗口
pwin
end
end
end
#———————————————————————————————————————
#按下CTRL键
#———————————————————————————————————————
def updata_ctrl
#按下返回键的情况下
if Input.trigger?(:CTRL)
#队伍窗口的情况下
if @apack_window_l.active
@apack_window_l.a_ctrl
#仓库窗口的情况下
elsif @apack_window_r.active
@apack_window_r.a_ctrl
end
end
end
#———————————————————————————————————————
#全部释放
#———————————————————————————————————————
def dispose
#端口释放
@viewport.dispose
@viewport1.dispose
@viewport2.dispose
#窗口释放
@apack_window_l.dispose
@apack_window_r.dispose
@apack_window_end.dispose
#背景释放
@background_sprite.dispose
end
end
#————————————————————————————————————————
# ●Dynamic_Character By.Clov
# *多类型动态行走图
# *Ver:1.0 Date:2013.9.7
# *使用:Dynamic_Character.new
# *必须:update dispose
# -draw_character(x, y, actor, index)主描绘
# -@type 动态类型 :W行走动态 :H转向动态 :WH行走转并行动态
# -@one 是否独立选择角色动态
# -@speed 每个动作的更新周期
# -@wa 行走动作表
# -@ha 转向动作表
# *实例方法:
# -self.one=true/false 更改选择/全部动态
# -self.type=:W/:H/:WH 更改动态类型
# -self.index=index 选择动态必须传递值
# -self.new_spr_xy 执行排序 可乱序
# -self.clear 建立新位图必要
#————————————————————————————————————————
class Dynamic_Character
#———————————————————————————————————————
#初始化数据
#———————————————————————————————————————
def initialize(x, y, z, viewport)
#基本坐标
@x = x ; @y = y ; @z = z
#显示端口
@viewport = viewport
#生成精灵
@sprs = []
#实际精灵
@sprs_true = []
#记录矩形坐标
@xa = [] ; @ya = []
#记录精灵坐标
@sx = [] ; @sy = []
#是否使用动态行走图
@type = :W
#是否选中角色才动态
@one = true
#当前选项
@index = 0
#初始显示坐标
#cx:0>右脚 1>并脚 2>左脚
#cy:0>正面 1>左面 2>右面 3>背面
@cx = 1 ; @cy = 0
#行走图坐标数据(动作数据,循环以下动作显示)
@wa = [0,1,1,2] ; @ha = [0,1,3,2]
#动作更新速度(帧)
@speed = 25
#速度计时器
@dcs = 0
#数据计时器
@dcx = 0
@dcy = 0
end
#———————————————————————————————————————
#绘制行走图
#———————————————————————————————————————
def draw_character(x, y, actor, index)
#实际坐标
x = x + @x ; y = y + @y
#图像名 没有的话返回
character_name = actor.character_name
#没有图像
return unless character_name
#生成独立精灵
@sprs[index] ||= Sprite.new(@viewport)
#取得位图
bitmap = bit("Graphics/Characters/"+character_name)
@sprs[index].bitmap = bitmap
#标准行走图宽高
sign = character_name[/^[\!\$]./]
if sign && sign.include?(')
cw = bitmap.width / 3
ch = bitmap.height / 4
else
cw = bitmap.width / 12
ch = bitmap.height / 8
end
#索引角色种类
n = actor.character_index
#角色种类x,y @wi:显示第几横 @hi:显示第几列
zx = (n%4*3)*cw
zy = (n/4*4)*ch
#更新精灵坐标
@sprs[index].x = @sx[index] = x - cw / 2
@sprs[index].y = @sy[index] = y - ch
@sprs[index].z = @z
#记录矩形坐标
@xa[index] = zx ; @ya[index] = zy
#显示坐标
zx = zx+@cx*cw ; zy = zy+@cy*ch
#位图矩形
src_rect = Rect.new(zx, zy, cw, ch)
@sprs[index].src_rect = src_rect
#实际存在的精灵
@sprs_true = @sprs.compact
end
#———————————————————————————————————————
#位图资源
#———————————————————————————————————————
def bit(f)
@bit ||= {}
unless @bit[f] && !@bit[f].disposed?
@bit[f] = Bitmap.new(f) ; end ; @bit[f]
end
#———————————————————————————————————————
#选中角色动态开关设置
#———————————————————————————————————————
def one=(tf)
@one = tf
end
#———————————————————————————————————————
#选项更新(选中角色动态必须传递选项位置)
#———————————————————————————————————————
def index=(index)
#指定的动态角色项
@index = index
#姿势矫正
mrc
end
#———————————————————————————————————————
#姿势矫正
#———————————————————————————————————————
def mrc(cx=1, cy=0)
#更改显示坐标
@cx = cx ; @cy = cy
#更新位图
update_src
end
#———————————————————————————————————————
#更改显示类型
#———————————————————————————————————————
def type=(t, cx=1, cy=0)
#更改显示类型
@type = t
#静态类型的话强制更新到设定坐标
mrc(cx, cy) unless @type
end
#———————————————————————————————————————
#精灵是否可见
#———————————————————————————————————————
def visible(index, tf)
#获取精灵
spr = @sprs[index]
#没有精灵
return unless spr
spr.visible = tf
end
#———————————————————————————————————————
#精灵继位排序法
#———————————————————————————————————————
def new_spr_xy
@sprs_true.each_index {|i|
#获取精灵
spr = @sprs_true[i]
#开始排位
spr.x = @sx[i]
spr.y = @sy[i]}
end
#———————————————————————————————————————
#精灵原点坐标(列数情况(t>开头列 h>项目高 oy>ox)
#———————————————————————————————————————
def oy=(y)
@sprs_true.each {|spr| spr.oy = y}
end
def ox=(x)
@sprs_true.each {|spr| spr.ox = x}
end
def oy2(top, h)
@sprs_true.each {|spr| spr.oy = top*h}
end
def ox2(top, w)
@sprs_true.each {|spr| spr.ox = top*w}
end
#———————————————————————————————————————
#主更新
#———————————————————————————————————————
def update
#数据更新
update_data
#精灵更新(*预留)
#@sprs_true.each {|spr| spr.update}
end
#———————————————————————————————————————
#更新位图矩形(全体)
#———————————————————————————————————————
def update_src
@sprs.each_index {|i|
#获取精灵
spr = @sprs[i]
#没有精灵
next unless spr
#获取矩形
src = spr.src_rect
#更新矩形x,y
spr.src_rect.x = @xa[i]+src.width*@cx
spr.src_rect.y = @ya[i]+src.height*@cy }
end
#———————————————————————————————————————
#更新位图矩形(指定)
#———————————————————————————————————————
def update_src2(i)
#获取精灵
spr = @sprs[i]
#没有精灵
return unless spr
#获取矩形
src = spr.src_rect
#更新矩形x,y
spr.src_rect.x = @xa[i]+src.width*@cx
spr.src_rect.y = @ya[i]+src.height*@cy
end
#———————————————————————————————————————
#计时器及显示坐标更新
#———————————————————————————————————————
def update_data
if @type
@dcs += 1
if @dcs == @speed
case @type
when :W
@dcx += 1
@dcx = @dcx < @wa.size ? @dcx : 0
@cx = @wa[@dcx]
when :H
@dcy += 1
@dcy = @dcy < @ha.size ? @dcy : 0
@cy = @ha[@dcy]
when :WH
@dcx += 1 ; @dcy += 1
@dcx = @dcx < @wa.size ? @dcx : 0
@dcy = @dcy < @ha.size ? @dcy : 0
@cx = @wa[@dcx] ; @cy = @ha[@dcy]
end
@one ? update_src2(@index) : update_src
@dcs = 0
end
end
end
#———————————————————————————————————————
#指定释放
#———————————————————————————————————————
def dispose_index(index,index_nil=false)
#获取精灵
spr = @sprs[index]
#没有精灵
return unless spr
#释放精灵
spr.dispose
#是否占位(占位处理)
if index_nil ; @sprs[index] = nil
@sprs_true = @sprs.compact ; return ; end
#删除精灵数据
@sprs.delete_at(index)
@xa.delete_at(index)
@ya.delete_at(index)
#实际存在的精灵
@sprs_true = @sprs.compact
end
#———————————————————————————————————————
#清除位图
#———————————————————————————————————————
def clear
@sprs_true.each {|spr| spr.bitmap.dispose}
end
#———————————————————————————————————————
#全部释放
#———————————————————————————————————————
def dispose
@viewport.dispose if @viewport
@sprs_true.each {|spr| spr.bitmap.dispose ; spr.dispose}
end
end
#————————————————————————————————————————
# ●位图的追加绘制方法 By.Clov
# *渐透明描绘以及RGSS1用gradient_fill_rect
#————————————————————————————————————————
class Bitmap
#———————————————————————————————————————
# ● 渐透明描绘(宽)
#———————————————————————————————————————
def back_w(x,y,w,h,bl=0.3,c=Color.new(0,200,230,128))
r = c.red ; g = c.green ; b = c.blue ; o = c.alpha
l = (w*bl).round
all = [l,w-l*2,l]
all.each_index {|i| ; w2 = all[i]
case i
when 0 ; x2 = 0 ; o1 = 0 ; o2 = o
when 1 ; x2 = all[0] ; o1 = o2 = o
when 2 ; x2 = all[0] + all[1] ; o1 = o ; o2 = 0 ; end
c1 = Color.new(r,g,b,o1) ; c2 = Color.new(r,g,b,o2)
gradient_fill_rect(x+x2, y, w2, h, c1, c2) if w2 > 0 }
end
#———————————————————————————————————————
# ● 渐透明描绘(高)
#———————————————————————————————————————
def back_h(x,y,w,h,bl=0.3,c=Color.new(0,200,230,128))
r = c.red ; g = c.green ; b = c.blue ; o = c.alpha
l = (h*bl).round
all = [l,h-l*2,l]
all.each_index {|i| ; h2 = all[i]
case i
when 0 ; y2 = 0 ; o1 = 0 ; o2 = o
when 1 ; y2 = all[0] ; o1 = o2 = o
when 2 ; y2 = all[0] + all[1] ; o1 = o ; o2 = 0 ; end
c1 = Color.new(r,g,b,o1) ; c2 = Color.new(r,g,b,o2)
gradient_fill_rect(x, y+y2, w, h2, c1, c2, true) if h2 > 0 }
end
end
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1