查看: 3587|回复: 4

[已经解决] 怎样隐藏掉对话窗口底部的箭头

[复制链接]
梦石
0
星屑
29901
在线时间
5734 小时
注册时间
2016-3-8
回帖
1653
发表于 2020-8-13 17:01:55 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 alexncf125 于 2024-1-25 01:48 编辑

No▽Window.png
已经把箭头PS掉了,但我想在$game_switches[M5MC20140305::SWI]为true时用Window.png而,为false时用No▽Window.png
然而在脚本下方加入以下代码后却做不出上述的效果(脚本链接=>https://rpg.blue/home.php?mod=space&uid=291206&do=blog&id=12749)
  1. class Scene_Map < Scene_Base
  2.   alias m5_create_message_window create_message_window
  3.   def create_message_window
  4.     m5_create_message_window
  5.     if $game_switches[M5MC20140305::SWI]
  6.       @message_window.windowskin = Cache.system("Window")
  7.     else
  8.       @message_window.windowskin = Cache.system("No▽Window")
  9.     end
  10.   end
  11. end
复制代码

[pre lang="ruby"]=begin

===============================================================================

  对话框光标 By喵呜喵5

===============================================================================


【说明】


  允许使用任意图片作为对话框下一句提示的光标


=end

$m5script ||= {};$m5script[:M5MC20140305] = 20140305

module M5MC20140305

#==============================================================================

# 设定部分

#==============================================================================


  FILENAME = "Cursor"


  # 光标图片的文件名,放到Graphics\System文件夹下


  FRAME = 4


  # 光标图片的帧数,只有一张图片并且不需要动画效果这里填写1就好了


  DURA = 10


  # 光标播放动画效果时每张图片的持续时间


  MODE = 1


  # 光标显示模式,1表示固定位置,2表示跟随文字移动


  #当光标显示模式为[固定位置]时:


    POS1 = [491,387]


    # 对话框居下时光标的[X,Y]坐标


    POS2 = [491,239]


    # 对话框居中时光标的[X,Y]坐标


    POS3 = [491,91]


    # 对话框居上时光标的[X,Y]坐标


  #当光标显示模式为[随文字移动]时:


    POSX = 12


    # 光标在左右方向的偏移


    POSY = 12


    # 光标在上下方向的偏移



  Z = 201


  # 光标的Z坐标,当光标遮住某些窗口时请尝试修改这里


  SWI = 1


  # 对应ID的开关打开的时候,不显示光标


#==============================================================================

# 设定结束

#==============================================================================

class Sprite_MessageCursor < Sprite

  def initialize

    super(nil)

    self.z = Z

    self.bitmap = Cache.system(FILENAME)

    self.visible = false

    @duration = @frame = 0

    @width = self.bitmap.width / FRAME

    self.src_rect.set(@frame * @width, 0, @width, self.bitmap.height)

  end

  def update_placement(pos = 2)

    self.x,self.y = pos == 2 ? POS1 : (pos == 1 ? POS2 : POS3)

  end

  def update_placement_plus(orig,pos)

    self.x,self.y = orig

    self.x += pos[:x] + POSX

    self.y += pos[:y] + POSY

  end

  def update

    super

    return unless self.visible

    return @duration -= 1 if @duration > 0

    self.src_rect.set(@frame * @width, 0, @width, self.bitmap.height)

    @duration = DURA

    @frame = (@frame == FRAME - 1) ? 0 : @frame + 1

  end

end

end # M5MC20140305

class Window_Message

  alias m5_20140305_initialize initialize

  def initialize

    m5_20140305_initialize

    @m5_20140305_cursor = M5MC20140305::Sprite_MessageCursor.new

  end

  alias m5_20140305_dispose dispose

  def dispose

    m5_20140305_dispose

    @m5_20140305_cursor.dispose

  end

  alias m5_20140305_update update

  def update

    m5_20140305_update

    @m5_20140305_cursor.update

    return @m5_20140305_cursor.visible = false unless self.open?

    @m5_20140305_cursor.visible = self.pause

    @m5_20140305_cursor.visible = false if $game_switches[M5MC20140305::SWI]

  end

  if M5MC20140305::MODE == 1

    alias m5_20140305_update_placement update_placement

    def update_placement

      m5_20140305_update_placement

      @m5_20140305_cursor.update_placement(@position)

    end

  else # M5MC20140305::MODE != 1

    alias m5_20140416_new_page new_page

    def new_page(text, pos)

      m5_20140416_new_page(text, pos)

      @m5_20140305_cursor.update_placement_plus([self.x,self.y],pos)

    end

    alias m5_20140416_process_normal_character process_normal_character

    def process_normal_character(c, pos)

      m5_20140416_process_normal_character(c, pos)

      @m5_20140305_cursor.update_placement_plus([self.x,self.y],pos)

    end

    alias m5_20140416_process_draw_icon process_draw_icon

    def process_draw_icon(icon_index, pos)

      m5_20140416_process_draw_icon(icon_index, pos)

      @m5_20140305_cursor.update_placement_plus([self.x,self.y],pos)

    end

  end

end

#以下是我加的部份
class Scene_Map < Scene_Base
  alias m5_create_message_window create_message_window
  def create_message_window
    m5_create_message_window
    if $game_switches[M5MC20140305::SWI]
      @message_window.windowskin = Cache.system("Window")
    else
      @message_window.windowskin = Cache.system("No▽Window")
    end
  end
end[/pre]

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2020-8-14 00:10:32 | 显示全部楼层
本帖最后由 喵呜喵5 于 2020-8-14 00:14 编辑

Scene_Map 的 create_message_window 只有在地图界面打开时才会调用一次,所以如果你始终停留在地图上,那这么写代码并不能满足你的需求
所以思路就变成了在一个每次打开对话框都会执行的方法里面增加修改对话框皮肤的逻辑
于是可以找到 Window_Message 的 update_placement 方法:

  1. class Window_Message
  2.   alias m5_20200813_update_placement update_placement
  3.   def update_placement
  4.     m5_20200813_update_placement
  5.     if $game_switches[M5MC20140305::SWI]
  6.       self.windowskin = Cache.system("Window")
  7.     else
  8.       self.windowskin = Cache.system("No▽Window")      
  9.     end
  10.   end
  11. end
复制代码


不过,在某些情况下,update_placement 也并不能满足你的实际需求,具体从代码上来说,update_placement 并不是每“句”对话都执行一次,而是每“段”对话都执行一次,如果前后两句对话的位置、对话框背景这些属性都相同时,它们会被视作同一段对话,第二句对话播放前是不会执行 update_placement 的,所以如下图所示的事件配法并不会按照你的预期来显示

Snipaste_2020-08-14_00-05-15.png

最简单粗暴的做法就是,靠一个等待指令将第一句对话和第二句对话拆分成两段对话

Snipaste_2020-08-14_00-06-34.png

另一种做法是不在 update_placement 这种每段话执行的方法后面增加逻辑,而是直接在 new_page 这种每句对话都会执行的方法里刷新对话框的皮肤

  1. class Window_Message
  2.   alias m5_20200813_new_page new_page
  3.   def new_page
  4.     m5_20200813_new_page
  5.     if $game_switches[M5MC20140305::SWI]
  6.       self.windowskin = Cache.system("Window")
  7.     else
  8.       self.windowskin = Cache.system("No▽Window")      
  9.     end
  10.   end
  11. end
复制代码


评分

参与人数 1赞 +1 收起 理由
alexncf125 + 1 精品文章

查看全部评分

回复

使用道具 举报

葱

梦石
26
星屑
13748
在线时间
2230 小时
注册时间
2012-12-12
回帖
567

极短28获奖

发表于 2020-8-13 22:01:19 | 显示全部楼层
应该贴上喵5的对话框光标脚本……或者链接。
总之翻了一下,喵5的对话框光标脚本用的不是window的小箭头吧?是单独的箭头文件。不知道你用的究竟是哪个脚本……

▶ 葱兔の游戏列表 (´・ω・`)
回复

使用道具 举报

梦石
0
星屑
29901
在线时间
5734 小时
注册时间
2016-3-8
回帖
1653
 楼主| 发表于 2020-8-13 22:15:22 | 显示全部楼层
本帖最后由 alexncf125 于 2020-8-13 22:17 编辑
congwsbn 发表于 2020-8-13 22:01
应该贴上喵5的对话框光标脚本……或者链接。
总之翻了一下,喵5的对话框光标脚本用的不是window的小箭头吧 ...


我发帖时有附上链接的说...被DZ吃掉了...

其实与喵5的脚本没什么关系(即是可无视1L的內容,直接看"以下")

以下:

我只是想当某开关为true时
Window_Message的windowskin用Window.png

当某开关为false时
Window_Message的windowskin用No▽Window.png而已
回复

使用道具 举报

梦石
0
星屑
29901
在线时间
5734 小时
注册时间
2016-3-8
回帖
1653
 楼主| 发表于 2020-8-14 05:48:10 | 显示全部楼层
本帖最后由 alexncf125 于 2020-8-17 21:46 编辑
喵呜喵5 发表于 2020-8-14 00:10
Scene_Map 的 create_message_window 只有在地图界面打开时才会调用一次,所以如果你始终停留在地图上,那 ...


谢谢喵5大大悉心指导,涨知识了
您显浅易明的教导能很好地理解
对我这小白来说简直是帮大忙了
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部