设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 6288|回复: 12
打印 上一主题 下一主题

[有事请教] 顯示NPC名稱腳本,請幫忙添加開關功能

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2638
在线时间
365 小时
注册时间
2015-12-8
帖子
104
跳转到指定楼层
发表于 2019-5-8 10:20:41 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
40星屑
本帖最后由 冰冷水藍 于 2019-5-8 10:22 编辑

我有個在NPC頭上顯示名稱(即事件名)的腳本
但需要一個開關功能
以及能即時反應在地圖上

目前是自己成功做出了切換開關
但需要過地圖場景才會成功顯示
需要能即時更新顯示,不然場景淡入淡出的時候很突兀,謝謝!!


RUBY 代码复制
  1. #==============================================================================
  2.     # 顯示NPC名
  3.     #------------------------------------------------------------------------------
  4.     # 跟原版一樣,EV開頭的不顯示,逗號後加顏色代碼
  5.     # 修改某事件名的方法:
  6.     #  set_npc_name("新名", 事件ID, 地圖ID, 是否永久生效)
  7.     #  範例   set_npc_name("123",nil,nil,true)
  8.     #  事件ID 為空時表示當前事件
  9.     #  地圖ID 為空時表示當前地圖
  10.     #  是否永久生效 默認永久,否則只允許修改當前地圖
  11. #==============================================================================
  12.     # 參數設定
  13. #==============================================================================
  14.     module NPC
  15.       NAME_FONT = "蒼藍字體"
  16.       NAME_SIZE = 24  #NPC名大小
  17.       NAME_SHADOW = true      
  18.       NAME_WIDTH = 200
  19.     end
  20. #==============================================================================
  21.     # 重定事件名
  22. #==============================================================================
  23.     def set_npc_name(name, event_id = nil, map_id = nil, forever = true)
  24.       # 處理事件 ID
  25.       if event_id == nil
  26.         event_id = $game_map.interpreter.event_id
  27.       end
  28.       # 處理地圖 ID
  29.       if map_id == nil
  30.         $game_map.events[event_id].name = name
  31.         map_id = $game_map.map_id
  32.       else
  33.         map_id = map_id
  34.       end
  35.       return unless forever
  36.       data = load_data(sprintf("Data/Map%03d.rvdata", map_id))
  37.       # 更改名
  38.       data.events[event_id].name = name
  39.       save_data(data, sprintf("Data/Map%03d.rvdata", map_id))
  40.     end
  41. #==============================================================================
  42.     # ■ Game_Character
  43. #==============================================================================
  44.     class Game_Character
  45.       #--------------------------------------------------------------------------
  46.       # ◎ 定義實例變量
  47.       #--------------------------------------------------------------------------
  48.       attr_accessor :name                  # 名稱
  49.       #--------------------------------------------------------------------------
  50.       # ◎ 初始化對象
  51.       #--------------------------------------------------------------------------
  52.       alias character_ini initialize
  53.       def initialize
  54.         character_ini
  55.         @name = ""
  56.       end
  57.     end
  58. #==============================================================================
  59.     # ■ Game_Event
  60. #==============================================================================
  61.     class Game_Event < Game_Character
  62.       #--------------------------------------------------------------------------
  63.       # ◎ 定義實例變量
  64.       #--------------------------------------------------------------------------
  65.       attr_reader   :erased
  66.       #--------------------------------------------------------------------------
  67.       # ◎ 初始化對像
  68.       #     map_id : 地圖 ID
  69.       #     event  : 事件 (RPG::Event)
  70.       #--------------------------------------------------------------------------
  71.       alias event_ini initialize
  72.       def initialize(map_id, event)
  73.         event_ini(map_id, event)
  74.         @name = @event.name
  75.       end
  76.     end
  77. #==============================================================================
  78.     # ■ Game_Player
  79. #==============================================================================
  80. #~     class Game_Player < Game_Character
  81.       #--------------------------------------------------------------------------
  82.       # ◎ 顯示主角名字
  83.       #--------------------------------------------------------------------------
  84. #~       def name
  85. #~         return $game_party.members[0].name
  86. #~       end   
  87. #~       end
  88. #==============================================================================
  89.     # ■ Game_Interpreter
  90. #==============================================================================
  91.     class Game_Interpreter
  92.       #--------------------------------------------------------------------------
  93.       # ◎ 定義實例變量
  94.       #--------------------------------------------------------------------------
  95.       attr_reader   :event_id
  96.     end
  97. #==============================================================================
  98.     # ■ Sprite_Character
  99. #==============================================================================
  100.     class Sprite_Character < Sprite_Base
  101.       #--------------------------------------------------------------------------
  102.       # ◎ 初始化對象
  103.       #     viewport  : 視區
  104.       #     character : 角色 (Game_Character)
  105.       #--------------------------------------------------------------------------
  106.       def initialize(viewport, character = nil)
  107.         super(viewport)
  108.         @character = character
  109.         @balloon_duration = 0
  110.         ## 名稱
  111.         @name = @character.name
  112.         set_name_sprite
  113.         update
  114.       end
  115.       #--------------------------------------------------------------------------
  116.       # ◎ 釋放
  117.       #--------------------------------------------------------------------------
  118.       def dispose
  119.         dispose_balloon
  120.         super
  121.         ##
  122.         return if @name_sprite == nil
  123.         @name_sprite.bitmap.dispose
  124.         @name_sprite.dispose
  125.       end
  126.       #--------------------------------------------------------------------------
  127.       # ● 更新畫面
  128.       #--------------------------------------------------------------------------
  129.       def update
  130.         super
  131.         update_bitmap
  132.         self.visible = (not @character.transparent)
  133.         update_src_rect
  134.         self.x = @character.screen_x
  135.         self.y = @character.screen_y
  136.  
  137.  
  138.         self.z = @character.screen_z
  139.         self.opacity = @character.opacity
  140.         self.blend_type = @character.blend_type
  141.         self.bush_depth = @character.bush_depth
  142.         update_balloon
  143.         if @character.animation_id != 0
  144.           animation = $data_animations[@character.animation_id]
  145.           start_animation(animation)
  146.           @character.animation_id = 0
  147.         end
  148.         if @character.balloon_id != 0
  149.           @balloon_id = @character.balloon_id
  150.           start_balloon
  151.           @character.balloon_id = 0
  152.         end
  153.         ## 名稱可視和跟隨
  154.         unless @name_sprite == nil or @name_sprite.disposed?
  155.           if @character.is_a?(Game_Event) and @character.erased
  156.             @name_sprite.visible = false
  157.             return
  158.           else
  159.             @name_sprite.visible = true
  160.           end
  161.           if @character.is_a?(Game_Player) and @character.in_vehicle?
  162.             @name_sprite.visible = false
  163.             return
  164.           else
  165.             @name_sprite.visible = true
  166.           end
  167.           if @name != @character.name
  168.             @name = @character.name
  169.             refresh_name_sprite
  170.           end
  171.  
  172. #████████████████████████████████████████████████████████████████████████         
  173. #████████████████████████████████████████████████████████████████████████         
  174.           @name_sprite.x = self.x - 250 #原版
  175.           @name_sprite.y = self.y - self.height - NPC::NAME_SIZE+2
  176.  
  177. #~           @name_sprite.x = (self.x  - 250) * 2 - 80  #放大兩倍
  178. #~           @name_sprite.y = (self.y  - self.height - NPC::NAME_SIZE+2) * 2 - 250 #放大兩倍
  179. #████████████████████████████████████████████████████████████████████████         
  180. #████████████████████████████████████████████████████████████████████████
  181. #~           @name_sprite.z = self.z+1
  182.           @name_sprite.z = self.z-60 #優先度++++++
  183.  
  184.         end
  185.       end
  186.       #--------------------------------------------------------------------------
  187.       # ○ 設定 NPC 名稱
  188.       #--------------------------------------------------------------------------
  189.       def set_name_sprite
  190.         return if @character.name[0, 2] == "EV"
  191.         return if @character.name == ""
  192.         return if @character.character_name == ""
  193.         return if @character.is_a?(Game_Event) and @character.erased
  194.         @color_board = Window_Base.new(0,0,33,33)
  195.         @color_board.visible = false
  196.         @name_sprite = Sprite.new
  197.         @name_sprite.bitmap = Bitmap.new(NPC::NAME_WIDTH, NPC::NAME_SIZE+2)
  198.         @name_sprite.bitmap.font.name = NPC::NAME_FONT
  199.         @name_sprite.bitmap.font.size = NPC::NAME_SIZE
  200.         @name_sprite.bitmap.font.shadow = NPC::NAME_SHADOW
  201.         refresh_name_sprite
  202.       end
  203.       #--------------------------------------------------------------------------
  204.       # ○ 更新 NPC 名稱
  205.       #--------------------------------------------------------------------------
  206.       def refresh_name_sprite
  207.         name,color_index = @name.split(/,/)
  208.         color_index = 0 if color_index == ""
  209.         @name_sprite.bitmap.font.color = @color_board.text_color(color_index.to_i) #原有
  210. #██████████████████████████████████████████████████████████████████████████         
  211. #~         @name_sprite.bitmap.font.color = Color.new(0,200,150)       #NPC名稱顏色         
  212.         @name_sprite.bitmap.clear
  213.         @name_sprite.bitmap.draw_text(0,0,200,NPC::NAME_SIZE+2,name,1)#置中對齊
  214. #██████████████████████████████████████████████████████████████████████████         
  215.       end
  216.     end

最佳答案

查看完整内容

将29行改成 if map_id == nil or map_id == $game_map.map_id 更改后测试 set_npc_name 更改后会直接改变,不管是不是永久生效的

Lv1.梦旅人

梦石
0
星屑
7
在线时间
3 小时
注册时间
2021-5-26
帖子
9
4
发表于 2021-5-30 15:54:13 | 只看该作者
感谢大佬
回复

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36427
在线时间
10796 小时
注册时间
2009-3-15
帖子
4814
3
发表于 2019-5-17 22:20:09 | 只看该作者
RUBY 代码复制
  1. def update
  2.         super
  3.         update_bitmap
  4.         self.visible = (not @character.transparent)
  5.         update_src_rect
  6.         self.x = @character.screen_x
  7.         self.y = @character.screen_y
  8.  
  9.  
  10.         self.z = @character.screen_z
  11.         self.opacity = @character.opacity
  12.         self.blend_type = @character.blend_type
  13.         self.bush_depth = @character.bush_depth
  14.         update_balloon
  15.         if @character.animation_id != 0
  16.           animation = $data_animations[@character.animation_id]
  17.           start_animation(animation)
  18.           @character.animation_id = 0
  19.         end
  20.         if @character.balloon_id != 0
  21.           @balloon_id = @character.balloon_id
  22.           start_balloon
  23.           @character.balloon_id = 0
  24.         end
  25.         ## 名稱可視和跟隨
  26.         unless @name_sprite == nil or @name_sprite.disposed?
  27.           if @character.is_a?(Game_Event) and @character.erased
  28.             @name_sprite.visible = false
  29.             return
  30.           else
  31.             @name_sprite.visible = true
  32.           end
  33.           if @character.is_a?(Game_Player) and @character.in_vehicle?
  34.             @name_sprite.visible = false
  35.             return
  36.           else
  37.             @name_sprite.visible = true
  38.           end
  39.           set_name_sprite
  40.           if @name != @character.name
  41.             @name = @character.name
  42.             refresh_name_sprite
  43.           end
  44.  
  45. #████████████████████████████████████████████████████████████████████████         
  46. #████████████████████████████████████████████████████████████████████████         
  47.           @name_sprite.x = self.x - 250 #原版
  48.           @name_sprite.y = self.y - self.height - NPC::NAME_SIZE+2
  49.  
  50. #~           @name_sprite.x = (self.x  - 250) * 2 - 80  #放大兩倍
  51. #~           @name_sprite.y = (self.y  - self.height - NPC::NAME_SIZE+2) * 2 - 250 #放大兩倍
  52. #████████████████████████████████████████████████████████████████████████         
  53. #████████████████████████████████████████████████████████████████████████
  54. #~           @name_sprite.z = self.z+1
  55.           @name_sprite.z = self.z-60 #優先度++++++
  56.         end
  57.       end

评分

参与人数 1+1 收起 理由
冰冷水藍 + 1 十分感謝!!

查看全部评分

回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2638
在线时间
365 小时
注册时间
2015-12-8
帖子
104
2
 楼主| 发表于 2019-5-17 21:24:57 | 只看该作者
张咚咚 发表于 2019-5-16 22:57
将29行改成
if map_id == nil or map_id == $game_map.map_id
更改后测试 set_npc_name 更改后会直接改变, ...


我在最後一段加了這段
以達成用1號開關來啟用/停用這個腳本

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.       # ○ 更新 NPC 名稱
  3.       #--------------------------------------------------------------------------
  4.       def refresh_name_sprite
  5.         name,color_index = @name.split(/,/)
  6.         color_index = 0 if color_index == ""
  7.         @name_sprite.bitmap.font.color = @color_board.text_color(color_index.to_i) #原有
  8. #██████████████████████████████████████████████████████████████████████████         
  9. #~         @name_sprite.bitmap.font.color = Color.new(0,200,150)       #NPC名稱顏色         
  10.  
  11.         if $game_switches[1] == true #指定顯示名稱開關
  12.         @name_sprite.bitmap.clear
  13.         @name_sprite.bitmap.draw_text(0,0+5,200,NPC::NAME_SIZE+2,name,1)#置中對齊
  14.         end
  15. #██████████████████████████████████████████████████████████████████████████         
  16.       end
  17.     end



雖然能成功,但必須過地圖移動,或者ESC打開主選單再關閉才會刷新顯示在NPC的頭頂上

点评

謝謝,達成了我所要的效果^^  发表于 2019-5-17 22:28
原來如此@@  发表于 2019-5-17 22:25
不用改这里,你在182行下面加一句 @name_sprite.visible = $game_switches[1] 就可以了,打开开关一后就显示  发表于 2019-5-17 22:22
回复

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19468
在线时间
3106 小时
注册时间
2013-1-11
帖子
1292
1
发表于 2019-5-8 10:20:42 | 只看该作者
本帖最后由 张咚咚 于 2019-5-17 20:35 编辑

将29行改成
if map_id == nil or map_id == $game_map.map_id
更改后测试 set_npc_name 更改后会直接改变,不管是不是永久生效的

点评

我不打算在遊戲中調用set_npc_name指令,而是用像1號開關來控制此ˋ腳本的啟用與停用,以達成NPC在地圖上頭頂顯示名稱或消失的結果  发表于 2019-5-17 21:19
抱歉,字體名稱改為您所擁有的字體即可了,或者我能傳送一份給您  发表于 2019-5-17 21:11
会显示,是我字体没装的问题。。看了一下好像是第29行的问题,更新了楼内容,改下试试  发表于 2019-5-17 20:34
我开了个工程,好像脚本不会显示名字。。  发表于 2019-5-17 20:23
謝謝協助,不過加了之後還是一樣,調用開關後必須ESC開啟主選單再關閉(觸發刷新畫面)才會顯示或關閉NPC頭上的名稱  发表于 2019-5-17 15:22

评分

参与人数 1+1 收起 理由
冰冷水藍 + 1 十分感謝!!

查看全部评分

回复

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 00:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表