class Game_Event attr_reader :event end class Sprite_Name < Sprite_Base FLAG = "~" #姓名前缀,只有拥有该前缀的name才会显示,设为空,则全部都会显示 #KEY = 10 #全局开关ID,去掉改行以及17行的#即可使用 def initialize(viewport, character = nil) super(viewport) @cha = character end def update super return unless @cha.event.name =~ /^#{FLAG}/ #&& $game_switches[KEY] if @cha.event.name.split(FLAG)[1] != @name @name = @cha.event.name.split(FLAG)[1] name_pa = @name.split(/(\\n|\\N)/) name_pa.delete('\N') name_pa.delete('\n') @wid = [] name_pa.each{|s| @wid << Bitmap.new(100,100).text_size(s).width} self.bitmap = Bitmap.new(@wid.max,16 * name_pa.size) self.bitmap.font.size = 16 name_pa.each_with_index{|s,x| self.bitmap.draw_text(0,x * 18,@wid.max,18,s,1)} end if @cha.character_name == "" self.y = @cha.screen_y - 16 * (@wid.size + 2) else temp_flag = @cha.character_name =~ /^\!?\$.*/ temp_pic = Cache.character(@cha.character_name) self.y = temp_flag ? @cha.screen_y - temp_pic.height / 4 - 18 * @wid.size : @cha.screen_y - temp_pic.height / 8 - 18 * @wid.size end self.x = @cha.screen_x - @wid.max / 2 self.z = @cha.screen_z + 100 end end class Spriteset_Map alias :iisnow_create_characters :create_characters def create_characters iisnow_create_characters $game_map.events.values.each do |event| @character_sprites.push(Sprite_Name.new(@viewport1, event)) end end end
#============================================================================== # (新)显示NPC名和图标 v1.04 by 沉影不器 #------------------------------------------------------------------------------ # 功能: 在指定NPC头上显示名/图标,比如有任务的NPC头上多一个提示图标 # 使用方法: # ① 在事件页里任意位置(默认第一行)加注释,格式为: # npc=名称,名称颜色 例: npc = 无敌将军,3 # 大小写不限,名称颜色指text_color编号 # # ② 需要显示图标的事件,在注释任意位置增加\i[图标序号],大小写不限 # ③ 参数设定在脚本第15-20行 # ④ 全局控制是否显示 NPC 名,当脚本第23行指定的开关打开时显示 # 默认第10号开关 #============================================================================== # 参数设定 #============================================================================== module NPC ALL_LIST = true # 是否支持事件页任意位置读取NPC注释 NAME_FONT = "黑体" # 名称字体 NAME_SIZE = 14 # 名称字号 NAME_COLOR = 0 # 名称字色(text_color编号) NAME_SHADOW = true # 名称字体阴影 NAME_WIDTH = 120 # 名称最大宽度 PLAYER_NAME = false # 是否显示主角名 NAME_SWITCH = 27 # 全局控制是否显示NPC名的开关序号 end class String #------------------------------------------------------------------------- # ○ 读取注释 # section : 字段名 # ignore_caps : 忽略大小写(仅字段名) #------------------------------------------------------------------------- def read_note(section, ignore_caps = true) result = '' # 忽略大小写时,全部转大写 section.upcase! if ignore_caps # 转symbol方便比较 s = section.to_sym self.each_line{|line| temp = line.split(/=/) # 去掉干扰字符 temp.each {|i| i.strip!} temp[0].upcase! if ignore_caps if temp[0].to_sym == s unless temp[1] == nil result = temp[1] end # 如果希望同名字段值覆盖前面的字段,去掉下一行 break end } return result end end #============================================================================== # ■ Game_Character #============================================================================== class Game_Character #-------------------------------------------------------------------------- # ◎ 定义实例变量 #-------------------------------------------------------------------------- attr_accessor :npcname # NPC名 attr_accessor :npcicon # NPC图标 #-------------------------------------------------------------------------- # ◎ 初始化对象 #-------------------------------------------------------------------------- alias character_ini initialize def initialize character_ini @npcname = "" @npcicon = -1 end end #============================================================================== # ■ Game_Event #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ◎ 定义实例变量 #-------------------------------------------------------------------------- attr_reader :erased # 暂时消除标志 attr_reader :npcname # NPC 名 attr_reader :npcicon # NPC 图标 #-------------------------------------------------------------------------- # ◎ 刷新 #-------------------------------------------------------------------------- def refresh new_page = nil unless @erased # 无法暂时消失的情况下 for page in @event.pages.reverse # 按页面顺序 next unless conditions_met?(page) # 判断是否符合条件 new_page = page break end end if new_page != @page # 事件页是否被改变? clear_starting # 清除启动中标志 setup(new_page) # 设置事件页 check_event_trigger_auto # 判断自动事件启动 ### NPC名 get_npcinfo ### 地图刷新 $game_map.need_refresh = true end end #-------------------------------------------------------------------------- # ○ 获取 NPC 信息 #-------------------------------------------------------------------------- def get_npcinfo @npcname = "" @npcicon = -1 return if @list == nil for line in @list if line.code == 108 or line.code == 408 unless line.parameters.empty? npcinfo = line.parameters.to_s.read_note('npc') @npcname = npcinfo.gsub(/\\I\[(\d+)\]/i) {} @npcicon = $1 == nil ? -1 : $1.to_i return end end break unless NPC::ALL_LIST end end end #============================================================================== # ■ Game_Player #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ○ NPC名 #-------------------------------------------------------------------------- def npcname return NPC::PLAYER_NAME ? $game_party.members[0].name : "" end end #============================================================================== # ■ Sprite_Character #============================================================================== class Sprite_Character < Sprite_Base #-------------------------------------------------------------------------- # ◎ 初始化对象 # viewport : 视区 # character : 角色 (Game_Character) #-------------------------------------------------------------------------- def initialize(viewport, character = nil) super(viewport) [url=home.php?mod=space&uid=2631396]@character[/url] = character @balloon_duration = 0 ### NPC 名 @npcname = @character.npcname @npcicon = @character.npcicon set_name_sprite update end #-------------------------------------------------------------------------- # ◎ 释放 #-------------------------------------------------------------------------- def dispose dispose_balloon super ### return if @name_sprite == nil @name_sprite.bitmap.dispose @name_sprite.dispose end #-------------------------------------------------------------------------- # ◎ 更新画面 #-------------------------------------------------------------------------- alias npc_update update def update npc_update ### NPC 名 if @name_sprite != nil and !@name_sprite.disposed? ### 可视性 if $game_switches[NPC::NAME_SWITCH] @name_sprite.visible = true else @name_sprite.visible = false return end if @character.is_a?(Game_Event) and @character.erased || @character.character_name == "" @name_sprite.visible = false return else @name_sprite.visible = true end if @character.is_a?(Game_Player) and @character.in_vehicle? @name_sprite.visible = false return else @name_sprite.visible = true end return unless @name_sprite.visible if @npcname != @character.npcname or @npcicon != @character.npcicon @npcname = @character.npcname @npcicon = @character.npcicon refresh_name_sprite end ### 坐标跟随 @name_sprite.x = self.x - NPC::NAME_WIDTH/2 @name_sprite.y = self.y - self.height-24-NPC::NAME_SIZE-2 @name_sprite.z = self.z+1 end end #-------------------------------------------------------------------------- # ○ 设定 NPC 名称 #-------------------------------------------------------------------------- def set_name_sprite return if @character.is_a?(Game_Event) and @character.erased return if @character.character_name == "" @name_sprite = Sprite.new(self.viewport) @name_sprite.bitmap = Bitmap.new(NPC::NAME_WIDTH, 24+NPC::NAME_SIZE+2) @name_sprite.bitmap.font.name = NPC::NAME_FONT @name_sprite.bitmap.font.size = NPC::NAME_SIZE @name_sprite.bitmap.font.shadow = NPC::NAME_SHADOW refresh_name_sprite end #-------------------------------------------------------------------------- # ○ 更新 NPC 名称 #-------------------------------------------------------------------------- def refresh_name_sprite name,color_index = @npcname.split(/,/) color_index = NPC::NAME_COLOR if color_index == "" @name_sprite.bitmap.font.color = text_color(color_index.to_i) @name_sprite.bitmap.clear ## 描绘图标 if @npcicon > 0 bitmap = Cache.system("Iconset") rect = Rect.new(@npcicon % 16 * 24, @npcicon / 16 * 24, 24, 24) @name_sprite.bitmap.blt(NPC::NAME_WIDTH/2-12, 0, bitmap, rect) end # 描绘名 @name_sprite.bitmap.draw_text(0,24,NPC::NAME_WIDTH,NPC::NAME_SIZE+2,name,1) end #-------------------------------------------------------------------------- # ○ 获取文字颜色色 # n : 文字颜色编号 (0~31) #-------------------------------------------------------------------------- def text_color(n) x = 64 + (n % 8) * 8 y = 96 + (n / 8) * 8 return Cache.system("Window").get_pixel(x, y) end end
class Game_Event < Game_Character #—————————————————————————————————————— # 用来返回名称 #—————————————————————————————————————— def name return @event.name end def name=(newname) @event.name = newname end end #============================================================================== # ■ Sprite_Character #------------------------------------------------------------------------------ # 角色显示用脚本。监视 Game_Character 类的实例、 # 自动变化脚本状态。 #============================================================================== $flyname = "Vehicle" class Sprite_Character < Sprite_Base #-------------------------------------------------------------------------- # ● 定量 #-------------------------------------------------------------------------- BALLOON_WAIT = 12 # 表情最后帧的等待时间 #-------------------------------------------------------------------------- # ● 定义实例变量 #-------------------------------------------------------------------------- attr_accessor :character # 角色 #-------------------------------------------------------------------------- # ● 初始化对像 # viewport : 查看端口 # character : 角色 (Game_Character) #-------------------------------------------------------------------------- def initialize(viewport, character = nil) if character.character_name != $flyname name = character.name end super(viewport) @character = character @namesprite = Sprite.new @namesprite.bitmap = Bitmap.new(160, 48) @namesprite.bitmap.font.name = "黑体" @namesprite.bitmap.font.size = 10 @namesprite.bitmap.font.color.set( 0, 190, 0) @evname = name if character.character_name != $flyname @evname_split = name.split(/,/)[0] else @evname_split = nil end if character.character_name != $flyname if name[0, 2]=="EV" or character.character_name == $flyname @evname_split = " " end end if character.character_name != $flyname if name.split(/,/)[1] != nil case name.split(/,/)[1] when "0" @namesprite.bitmap.font.color.set(255, 255, 255) when "1" @namesprite.bitmap.font.color.set(128, 128, 255) when "2" @namesprite.bitmap.font.color.set(255, 128, 128) when "3" @namesprite.bitmap.font.color.set(128, 255, 128) when "4" @namesprite.bitmap.font.color.set(128, 255, 255) when "5" @namesprite.bitmap.font.color.set(255, 128, 255) when "6" @namesprite.bitmap.font.color.set(255, 255, 128) when "7" @namesprite.bitmap.font.color.set(192, 192, 192) else @namesprite.bitmap.font.color.set(255, 255, 255) end end end if @evname_split != "" and @evname_split != nil @namesprite.bitmap.draw_text(0, 0, 160, 36, @evname_split, 1) end @character = character @balloon_duration = 0 update end #-------------------------------------------------------------------------- # ● 释放 #-------------------------------------------------------------------------- def dispose dispose_balloon @namesprite.bitmap.dispose @namesprite.dispose super end #-------------------------------------------------------------------------- # ● 更新画面 #-------------------------------------------------------------------------- def update super update_bitmap self.visible = (not @character.transparent) update_src_rect self.x = @character.screen_x self.y = @character.screen_y self.z = @character.screen_z self.opacity = @character.opacity self.blend_type = @character.blend_type self.bush_depth = @character.bush_depth update_balloon if @character.animation_id != 0 animation = $data_animations[@character.animation_id] start_animation(animation) @character.animation_id = 0 end if @character.balloon_id != 0 @balloon_id = @character.balloon_id start_balloon @character.balloon_id = 0 end if character.character_name != $flyname if @evname != @character.name @namesprite.bitmap.clear @evname = @character.name @evname_split = @character.name.split(/,/)[0] if @character.name.split(/,/)[1] != nil case @character.name.split(/,/)[1] when "0" @namesprite.bitmap.font.color.set(255, 255, 255) when "1" @namesprite.bitmap.font.color.set(128, 128, 255) when "2" @namesprite.bitmap.font.color.set(255, 128, 128) when "3" @namesprite.bitmap.font.color.set(128, 255, 128) when "4" @namesprite.bitmap.font.color.set(128, 255, 255) when "5" @namesprite.bitmap.font.color.set(255, 128, 255) when "6" @namesprite.bitmap.font.color.set(255, 255, 128) when "7" @namesprite.bitmap.font.color.set(192, 192, 192) else @namesprite.bitmap.font.color.set(255, 255, 255) end end if @evname_split != "" and @evname_split != nil @namesprite.bitmap.draw_text(0, 0, 160, 36, @evname_split, 1) end end @namesprite.x = self.x-80 @namesprite.y = self.y-self.oy+22 #@namesprite.visible = $game_switches[39] end end #-------------------------------------------------------------------------- # ● 获取图块图像的指定图块 # tile_id : 图块 ID #-------------------------------------------------------------------------- def tileset_bitmap(tile_id) set_number = tile_id / 256 return Cache.system("TileB") if set_number == 0 return Cache.system("TileC") if set_number == 1 return Cache.system("TileD") if set_number == 2 return Cache.system("TileE") if set_number == 3 return nil end #-------------------------------------------------------------------------- # ● 刷新传送的位图数据 #-------------------------------------------------------------------------- def update_bitmap if @tile_id != @character.tile_id or @character_name != @character.character_name or @character_index != @character.character_index @tile_id = @character.tile_id @character_name = @character.character_name @character_index = @character.character_index if @tile_id > 0 sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32; sy = @tile_id % 256 / 8 % 16 * 32; self.bitmap = tileset_bitmap(@tile_id) self.src_rect.set(sx, sy, 32, 32) self.ox = 16 self.oy = 32 else self.bitmap = Cache.character(@character_name) sign = @character_name[/^[\!\$]./] if sign != nil and sign.include?('$') @cw = bitmap.width / 3 @ch = bitmap.height / 4 else @cw = bitmap.width / 12 @ch = bitmap.height / 8 end self.ox = @cw / 2 self.oy = @ch end end end #-------------------------------------------------------------------------- # ● 刷新传送的矩形数据 #-------------------------------------------------------------------------- def update_src_rect if @tile_id == 0 index = @character.character_index pattern = @character.pattern < 3 ? @character.pattern : 1 sx = (index % 4 * 3 + pattern) * @cw sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch self.src_rect.set(sx, sy, @cw, @ch) end end #-------------------------------------------------------------------------- # ● 开始显示表情图标 #-------------------------------------------------------------------------- def start_balloon dispose_balloon @balloon_duration = 8 * 8 + BALLOON_WAIT @balloon_sprite = ::Sprite.new(viewport) @balloon_sprite.bitmap = Cache.system("Balloon") @balloon_sprite.ox = 16 @balloon_sprite.oy = 32 update_balloon end #-------------------------------------------------------------------------- # ● 刷新表情图标 #-------------------------------------------------------------------------- def update_balloon if @balloon_duration > 0 @balloon_duration -= 1 if @balloon_duration == 0 dispose_balloon else @balloon_sprite.x = x @balloon_sprite.y = y - height @balloon_sprite.z = z + 200 if @balloon_duration < BALLOON_WAIT sx = 7 * 32 else sx = (7 - (@balloon_duration - BALLOON_WAIT) / 8) * 32 end sy = (@balloon_id - 1) * 32 @balloon_sprite.src_rect.set(sx, sy, 32, 32) end end end #-------------------------------------------------------------------------- # ● 释放表情图标 #-------------------------------------------------------------------------- def dispose_balloon if @balloon_sprite != nil @balloon_sprite.dispose @balloon_sprite = nil end end end class Game_Player < Game_Character def name return "" end end
戏子君つ 发表于 2017-1-6 14:57
但是显示地图名称会有一个BUG 这个几乎所有的VX地图名称脚本都会有的(反正我是没看到有人修复啦) 当你隐 ...
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |