查看: 8099|回复: 12

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

[复制链接]
梦石
0
星屑
2638
在线时间
365 小时
注册时间
2015-12-8
回帖
77
发表于 2019-5-8 10:20:41 | 显示全部楼层 |阅读模式
悬赏40星屑已解决
本帖最后由 冰冷水藍 于 2019-5-8 10:22 编辑

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

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


[pre lang="ruby"]#==============================================================================
    # 顯示NPC名
    #------------------------------------------------------------------------------
    # 跟原版一樣,EV開頭的不顯示,逗號後加顏色代碼
    # 修改某事件名的方法:
    #  set_npc_name("新名", 事件ID, 地圖ID, 是否永久生效)
    #  範例   set_npc_name("123",nil,nil,true)
    #  事件ID 為空時表示當前事件
    #  地圖ID 為空時表示當前地圖
    #  是否永久生效 默認永久,否則只允許修改當前地圖
#==============================================================================
    # 參數設定
#==============================================================================
    module NPC
      NAME_FONT = "蒼藍字體"
      NAME_SIZE = 24  #NPC名大小
      NAME_SHADOW = true      
      NAME_WIDTH = 200
    end
#==============================================================================
    # 重定事件名
#==============================================================================
    def set_npc_name(name, event_id = nil, map_id = nil, forever = true)
      # 處理事件 ID
      if event_id == nil
        event_id = $game_map.interpreter.event_id
      end
      # 處理地圖 ID
      if map_id == nil
        $game_map.events[event_id].name = name
        map_id = $game_map.map_id
      else
        map_id = map_id
      end
      return unless forever
      data = load_data(sprintf("Data/Map%03d.rvdata", map_id))
      # 更改名
      data.events[event_id].name = name
      save_data(data, sprintf("Data/Map%03d.rvdata", map_id))
    end
#==============================================================================
    # ■ Game_Character
#==============================================================================
    class Game_Character
      #--------------------------------------------------------------------------
      # ◎ 定義實例變量
      #--------------------------------------------------------------------------
      attr_accessor :name                  # 名稱
      #--------------------------------------------------------------------------
      # ◎ 初始化對象
      #--------------------------------------------------------------------------
      alias character_ini initialize
      def initialize
        character_ini
        @name = ""
      end
    end
#==============================================================================
    # ■ Game_Event
#==============================================================================
    class Game_Event < Game_Character
      #--------------------------------------------------------------------------
      # ◎ 定義實例變量
      #--------------------------------------------------------------------------
      attr_reader   :erased
      #--------------------------------------------------------------------------
      # ◎ 初始化對像
      #     map_id : 地圖 ID
      #     event  : 事件 (RPG::Event)
      #--------------------------------------------------------------------------
      alias event_ini initialize
      def initialize(map_id, event)
        event_ini(map_id, event)
        @name = @event.name
      end
    end
#==============================================================================
    # ■ Game_Player
#==============================================================================
#~     class Game_Player < Game_Character
      #--------------------------------------------------------------------------
      # ◎ 顯示主角名字
      #--------------------------------------------------------------------------
#~       def name
#~         return $game_party.members[0].name
#~       end   
#~       end
#==============================================================================
    # ■ Game_Interpreter
#==============================================================================
    class Game_Interpreter
      #--------------------------------------------------------------------------
      # ◎ 定義實例變量
      #--------------------------------------------------------------------------
      attr_reader   :event_id
    end
#==============================================================================
    # ■ Sprite_Character
#==============================================================================
    class Sprite_Character < Sprite_Base
      #--------------------------------------------------------------------------
      # ◎ 初始化對象
      #     viewport  : 視區
      #     character : 角色 (Game_Character)
      #--------------------------------------------------------------------------
      def initialize(viewport, character = nil)
        super(viewport)
        @character = character
        @balloon_duration = 0
        ## 名稱
        @name = @character.name
        set_name_sprite
        update
      end
      #--------------------------------------------------------------------------
      # ◎ 釋放
      #--------------------------------------------------------------------------
      def dispose
        dispose_balloon
        super
        ##
        return if @name_sprite == nil
        @name_sprite.bitmap.dispose
        @name_sprite.dispose
      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
        ## 名稱可視和跟隨
        unless @name_sprite == nil or @name_sprite.disposed?
          if @character.is_a?(Game_Event) and @character.erased
            @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
          if @name != @character.name
            @name = @character.name
            refresh_name_sprite
          end
         
#████████████████████████████████████████████████████████████████████████         
#████████████████████████████████████████████████████████████████████████         
          @name_sprite.x = self.x - 250 #原版
          @name_sprite.y = self.y - self.height - NPC::NAME_SIZE+2

#~           @name_sprite.x = (self.x  - 250) * 2 - 80  #放大兩倍
#~           @name_sprite.y = (self.y  - self.height - NPC::NAME_SIZE+2) * 2 - 250 #放大兩倍
#████████████████████████████████████████████████████████████████████████         
#████████████████████████████████████████████████████████████████████████
#~           @name_sprite.z = self.z+1
          @name_sprite.z = self.z-60 #優先度++++++

        end
      end
      #--------------------------------------------------------------------------
      # ○ 設定 NPC 名稱
      #--------------------------------------------------------------------------
      def set_name_sprite
        return if @character.name[0, 2] == "EV"
        return if @character.name == ""
        return if @character.character_name == ""
        return if @character.is_a?(Game_Event) and @character.erased
        @color_board = Window_Base.new(0,0,33,33)
        @color_board.visible = false
        @name_sprite = Sprite.new
        @name_sprite.bitmap = Bitmap.new(NPC::NAME_WIDTH, 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 = @name.split(/,/)
        color_index = 0 if color_index == ""
        @name_sprite.bitmap.font.color = @color_board.text_color(color_index.to_i) #原有
#██████████████████████████████████████████████████████████████████████████         
#~         @name_sprite.bitmap.font.color = Color.new(0,200,150)       #NPC名稱顏色         
        @name_sprite.bitmap.clear
        @name_sprite.bitmap.draw_text(0,0,200,NPC::NAME_SIZE+2,name,1)#置中對齊
#██████████████████████████████████████████████████████████████████████████         
      end
    end    [/pre]

最佳答案

查看完整内容

将29行改成 if map_id == nil or map_id == $game_map.map_id 更改后测试 set_npc_name 更改后会直接改变,不管是不是永久生效的
梦石
0
星屑
19426
在线时间
3082 小时
注册时间
2013-1-11
回帖
1207
发表于 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 十分感謝!!

查看全部评分

回复

使用道具 举报

梦石
0
星屑
2638
在线时间
365 小时
注册时间
2015-12-8
回帖
77
 楼主| 发表于 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號開關來啟用/停用這個腳本

[pre lang="ruby"]      #--------------------------------------------------------------------------
      # ○ 更新 NPC 名稱
      #--------------------------------------------------------------------------
      def refresh_name_sprite
        name,color_index = @name.split(/,/)
        color_index = 0 if color_index == ""
        @name_sprite.bitmap.font.color = @color_board.text_color(color_index.to_i) #原有
#██████████████████████████████████████████████████████████████████████████         
#~         @name_sprite.bitmap.font.color = Color.new(0,200,150)       #NPC名稱顏色         

        if $game_switches[1] == true #指定顯示名稱開關
        @name_sprite.bitmap.clear
        @name_sprite.bitmap.draw_text(0,0+5,200,NPC::NAME_SIZE+2,name,1)#置中對齊
        end
#██████████████████████████████████████████████████████████████████████████         
      end
    end[/pre]


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

点评

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

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2019-5-17 22:20:09 | 显示全部楼层
[pre lang="ruby"]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
        ## 名稱可視和跟隨
        unless @name_sprite == nil or @name_sprite.disposed?
          if @character.is_a?(Game_Event) and @character.erased
            @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
          set_name_sprite
          if @name != @character.name
            @name = @character.name
            refresh_name_sprite
          end

#████████████████████████████████████████████████████████████████████████         
#████████████████████████████████████████████████████████████████████████         
          @name_sprite.x = self.x - 250 #原版
          @name_sprite.y = self.y - self.height - NPC::NAME_SIZE+2

#~           @name_sprite.x = (self.x  - 250) * 2 - 80  #放大兩倍
#~           @name_sprite.y = (self.y  - self.height - NPC::NAME_SIZE+2) * 2 - 250 #放大兩倍
#████████████████████████████████████████████████████████████████████████         
#████████████████████████████████████████████████████████████████████████
#~           @name_sprite.z = self.z+1
          @name_sprite.z = self.z-60 #優先度++++++
        end
      end[/pre]

评分

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

查看全部评分

回复

使用道具 举报

梦石
0
星屑
7
在线时间
3 小时
注册时间
2021-5-26
回帖
9
发表于 2021-5-30 15:54:13 | 显示全部楼层
感谢大佬
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部