查看: 1828|回复: 2

[已经解决] 事件名称显示脚本的错误

[复制链接]
梦石
0
星屑
254
在线时间
316 小时
注册时间
2015-7-2
回帖
1629

开拓者

发表于 2015-10-4 15:54:27 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
30.png
这是错误截图,该错误发生在主界面开始游戏之后。
每个事件的设置如下图,之前没有加入update_namepop同样报错。
而且我在事件名称处只输入了汉语字符及英语字符,没有设置图标和变量。
以下是脚本代码。
3.png
[pre lang="ruby"]#==============================================================================
# ★ RGSS3_ネームポップ Ver1.11
#==============================================================================
=begin

元作者:tomoaky
webサイト:ひきも記 (http://hikimoki.sakura.ne.jp/)

イベント名かイベント実行内容の先頭に『注釈』コマンドで
<namepop 文字列>
と記述してください。
イベントキャラクターの頭上に文字列が表示されます。

イベント名で指定した場合はイベント全ページに適用されますが、
優先度は注釈コマンドの方が高くなっています。

文字を消したい場合は <namepop none> としてください。
=end

=begin
改造:111
webサイト:http://gamecome.hateblo.jp/

2015.1.18
変数を表示できるようにしてみました。
2015.1.22
アイコンも表示できるように。
@@で包む表記を複数利用できるように。
2015.1.26
フォント変更も利用できるように。

変数の値を変えた後は
スクリプトから
update_namepop
と書いて、更新しないと反映されません

=end
module TMNPOP
  def self.create_font(params = nil)
    font = Font.new()
    if(params)
      params.each{|key , value|
        font.send(key.to_s + "=", value)
      }
    end
    font
  end  
end

#==============================================================================
# □ 設定項目
#==============================================================================
module TMNPOP
  FONT_SIZE = 22          # フォント指定しない場合の、フォントサイズ
  FONT_OUT_ALPHA = 255    # フォント指定しない場合の、フォントの縁取り不透明度
  #
  # 見本のフォント(それぞれFONT(0)~FONT(4)で指定、追加も可能)
  #
  FONT = [
    self.create_font() ,
    self.create_font({:out_color => Color.new(255,0,0,128) }) ,
    self.create_font({:size => 32 , :bold => true , :shadow => true}) ,
    self.create_font({:italic => true , :outline => false ,
      :color => Color.new(120,120,255,255) }) ,
    self.create_font({:size => 18 , :out_color => Color.new(255,255,255,128) ,
      :bold => true , :shadow => true , :color => Color.new(0,0,0,255) })      
  ]
end

#==============================================================================
# ■ Game_Character
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :namepop                  # ポップアップテキスト
  attr_accessor :will_namepop_update
  #--------------------------------------------------------------------------
end

#==============================================================================
# ■ Game_Event
#==============================================================================
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● イベントページの設定をクリア
  #--------------------------------------------------------------------------
  alias tmnpop_game_event_clear_page_settings clear_page_settings
  def clear_page_settings
    tmnpop_game_event_clear_page_settings
    @namepop = nil
    @will_namepop_update = false
  end
  #--------------------------------------------------------------------------
  # ● イベントページの設定をセットアップ
  #--------------------------------------------------------------------------
  alias tmnpop_game_event_setup_page_settings setup_page_settings
  def setup_page_settings
    tmnpop_game_event_setup_page_settings
    @namepop = nil
    @namepop_sprite_strs = nil
    if @list
      @namepop = $1 if /<namepop\s*(\S+?)>/i =~ @event.name
      @list.each do |list|
        if list.code == 108 || list.code == 408
          @namepop = $1 if /<namepop\s*(\S+?)>/i =~ list.parameters[0]
        else
          break
        end
      end
    end
  end
end

#==============================================================================
# ■ Sprite_Character
#==============================================================================
class Sprite_Character < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  alias tmnpop_sprite_character_dispose dispose
  def dispose
    dispose_namepop
    tmnpop_sprite_character_dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias tmnpop_sprite_character_update update
  def update
    tmnpop_sprite_character_update
    update_namepop
    if @character.namepop != @namepop or @character.will_namepop_update
      @namepop = @character.namepop
      @character.will_namepop_update = false
      start_namepop
    end
  end
  
  #
  # @~@と普通の文字とを分割する
  #
  def _variables_split(namepop)
    tag_on = false
    str = ""
    strs = []
    namepop.each_char do |char|
      if char == "@"
        if tag_on
          str += char
          char = ""
        end
        strs << str.clone
        str = ""
        tag_on = !tag_on
      end
      str += char
    end
    strs << str # 最終の@から行末まで
    strs.delete("")
    strs
  end
   
  #
  # 変数、アイコン変換
  #
   def _namepop_change(str)
    obj = {:value => str , :font => nil , :type => "String"}
    if str =~ /@.+?@/
      str.upcase!
      str.delete!("@")
      # 変数(V[])を先に置換 *但し変数を囲む変数は置換されない
      str.gsub!(/V\[(\d+?)\]/){|text|
        $game_variables[$1.to_i]
      }
      # 個別タグがまだある場合、反映
      str.scan(/((I|V|FONT)\[(\d+?)\])/).each{|tmp|
        if tmp[1] == "I"
          obj[:value] = tmp[2].to_i
          obj[:type] = "Icon"
          return obj
        end
        if tmp[1] == "FONT"
          obj[:font] = TMNPOP::FONT[tmp[2].to_i]
          str.sub!(tmp[0] , "")
        elsif tmp[1] == "V"
          obj[:value] = $game_variables[tmp[2].to_i]
          str.sub!(tmp[0] , "")
        end
      }
      obj[:value] = str
    end
    obj
  end
   
  #--------------------------------------------------------------------------
  # ○ namepopの開始
  #--------------------------------------------------------------------------
  def start_namepop
    dispose_namepop
    return if @namepop == "none" || @namepop == nil
    @namepop_sprite = ::Sprite.new(viewport)

    namepop_draws = _variables_split(@namepop)
    # 分けた文字列(アイコン)を描画
    total_width = 0
    best_height = 0
    tmp_b = Bitmap.new(Graphics.width , Graphics.height)
    namepop_draws.each{|str|
      obj = _namepop_change(str)
      if obj[:type] == "Icon" # アイコン描画
        icon_index = obj[:value]
        icon_bitmap = Cache.system("Iconset")
        r = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
        tmp_b.blt(total_width, 0, icon_bitmap, r)
      else # 文字列描画
        str = obj[:value]
        b = Bitmap.new(1, 1)
        if obj[:font]
          b.font = obj[:font]
        else
          b.font.size = TMNPOP::FONT_SIZE
          b.font.out_color.alpha = TMNPOP::FONT_OUT_ALPHA
        end     
        tmp_b.font = b.font
        r = b.text_size(str)
        # 縦が中央揃えになるよう調節
        height_adjust = best_height == 0 ? 0 : (best_height - r.height) / 2
        tmp_b.draw_text(total_width, height_adjust, r.width , r.height , str)
      end
      total_width += r.width
      best_height = r.height if r.height > best_height
    }
    # 文字列(アイコン)を結合
    @namepop_sprite.bitmap = Bitmap.new(total_width,  best_height)
    @namepop_sprite.bitmap.blt(0, 0, tmp_b , @namepop_sprite.bitmap.rect)
   
    @namepop_sprite.ox = @namepop_sprite.width / 2
    @namepop_sprite.oy = best_height
    tmp_b.clear
    update_namepop
  end
  #--------------------------------------------------------------------------
  # ○ namepopの更新
  #--------------------------------------------------------------------------
  def update_namepop
    if @namepop_sprite
      @namepop_sprite.x = x
      @namepop_sprite.y = y - height
      @namepop_sprite.z = z + 200
    end
  end
  #--------------------------------------------------------------------------
  # ○ namepopの解放
  #--------------------------------------------------------------------------
  def dispose_namepop
    if @namepop_sprite
      @namepop_sprite.bitmap.dispose
      @namepop_sprite.dispose
      @namepop_sprite = nil
    end
  end
end

#
# ネームポップを更新させる
#
class Game_Interpreter
  def update_namepop
    $game_map.events.each_value{|event|
      event.will_namepop_update = true
    }  
  end
end[/pre]
测试你的东方project认知程度?那就来玩[url=https://store.steampowered.com/app/930840/TouHouAsked/]《东方百问》[/url]吧!
东方风自作曲认知企划绝赞咕咕咕中
梦石
0
星屑
5256
在线时间
760 小时
注册时间
2009-1-21
回帖
236
发表于 2015-10-5 01:00:17 | 显示全部楼层
本帖最后由 御之嵐 于 2015-10-5 01:02 编辑

我這邊
使用上沒有任何問題

事件是按下確認鍵後才會觸發
update_namepop
所以應該跟彈錯沒有太大的關係

依我猜測
這可能是腳本的衝突
或者  檢查一下看有沒有 自動執行、並行處理的事件正在執行其他腳本

可以開新的地圖測試這個 事件名稱顯示腳本 是否能正常使用
如果新地圖使用正常
那就是 之前那張地圖有事件跟腳本產生衝突了

点评

我覺得 百里大 的解答比較正確的說,彈錯的窗口我有看過,但是意外的解決了錯誤,所以不知道問題點,才要你檢查腳本看看  发表于 2015-10-5 11:07
检查了一下脚本列表发现有一个之前版本的了……认可答案  发表于 2015-10-5 08:53

评分

参与人数 1星屑 +200 收起 理由
taroxd + 200 我很赞同

查看全部评分

回复

使用道具 举报

老鹰

梦石
40
星屑
37812
在线时间
7091 小时
注册时间
2012-5-26
回帖
3297

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

发表于 2015-10-5 10:22:21 | 显示全部楼层
本帖最后由 百里_飞柳 于 2015-10-5 11:27 编辑

弹窗错误是因为你插入了两段相同的脚本。

然后这个脚本的用法难道不应该是
イベント名かイベント実行内容の先頭に『注釈』コマンドで  #翻译:事件名写在事件内容第一行的注释命令里
<namepop 文字列>

在事件页里的第一行放注释然后写这个吧,你怎么写到事件名字框去了……

好吧,我没有实际使用过这个脚本…不知道写到名字框去也有用_(:зゝ∠)_

点评

真·认可答案。  发表于 2015-10-5 13:51
寫在名字框也能用噢 (★ゝω・)b⌒☆  发表于 2015-10-5 11:04

评分

参与人数 1星屑 +200 收起 理由
taroxd + 200 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部