Project1

标题: 想请教如何修改脚本,能在显示文章时出现“上下黑边” [打印本页]

作者: 水舞沨流    时间: 2021-3-30 00:30
标题: 想请教如何修改脚本,能在显示文章时出现“上下黑边”
本帖最后由 水舞沨流 于 2021-3-30 00:43 编辑

问题的起因:希望玩家能直观地意识到“剧情对话结束了,我可以继续操作了。”
思路是:准备一张有透明通道的泛用型上下黑边图片,在每次显示文章时都自动显示。

Q:“你为什么不在每次发生剧情的时候都直接显示图片?”
A:因为前面已经做了很多剧情了,中间还有播放音效或者插入CG、等待20帧之类的演出,想借助F11的伟大力量一劳永逸地解决问题XD

————————————————————————————————————
后续编辑:

对不起我现在感到惭愧极了,因为我循着印象找到了一个叫做电影式对话的脚本:
https://rpg.blue/thread-206814-1-1.html

据说会造成许多冲突,有着很大的移植难度,

所以还是很好奇在保证兼容性的基础上,有没有直接实现我用黑体标注的那种效果的方式XD。
作者: 89444640    时间: 2021-3-30 09:17
公用事件1,显示图片1黑边是上移,淡入20帧,黑边2下移20帧播放音效,
结束时候反向操作 公用事件2,怕有没玩过rpg的菜鸟不知道干啥,显示图结束后显示图片按任意键继续,醒目位置醒目颜色,分歧着个得用脚本,presh any什么的,我不是程序不知道,一般我要用就写按空格继续,爱按不按,不按别玩。按键后图片消失干干啥干啥。
放着绿色环保的不用非要用脚本,要不自己能写,要不就抱着以后越来越多冲突的觉悟吧。
作者: soulsaga    时间: 2021-3-30 14:26
本帖最后由 soulsaga 于 2021-3-30 14:33 编辑

在每次显示文章时都自动显示

那和不显示有区别吗..你一直都能操作啊

或且这样並行公共事件判断对话中就显示图片..怎样写来着..等大佬..
作者: guoxiaomi    时间: 2021-3-30 15:34
只要能明确的追踪到黑边显示的开始和结束应该不难,是否理解为:
1. 在没有黑边的情况下,第一次出现对话指令时开始出现黑边
2. 在有黑边的情况下,持续监测,一旦玩家可以自由移动的时,移除黑边

在这两个地方启动并行的公共事件显示/移除黑边应该就可以了。
作者: RPGzh500223    时间: 2021-3-30 21:40
我没太明白楼主的意思
大概写了下
class Window_Message < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化状态
  #--------------------------------------------------------------------------
  def initialize
    super(80, 304, 480, 160)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.visible = false
    self.z = 9998
    @fade_in = false
    @fade_out = false
    @contents_showing = false
    @cursor_width = 0
    self.active = false
    self.index = -1
   
    skin = Bitmap.new("Graphics/Windowskins/001-Blue01")
    skin.fill_rect(Rect.new(0, 0, 128, 128), Color.new(0, 0, 0, 0))
    skin.fill_rect(Rect.new(128, 0, 64, 64), Color.new(0, 0, 0, 0))
    self.windowskin = skin
   
    @blacks = Array.new(2) {|i|
      sprite = Sprite.new
      sprite.bitmap = Bitmap.new(640, 50 + i * 126)
      sprite.bitmap.fill_rect(sprite.bitmap.rect, Color.new(0, 0, 0, 180))
      sprite.y = 304 * i
      sprite.z = self.z + 1
      sprite.visible = false
      sprite
    }
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    terminate_message
    $game_temp.message_window_showing = false
    if @input_number_window != nil
      @input_number_window.dispose
    end
    super
   
    @blacks.each {|i|
      i.bitmap.dispose
      i.dispose
    }
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    # 渐变的情况下
    if @fade_in
      self.contents_opacity += 24
      
      @blacks.each {|i| i.opacity += 24 }
      
      if @input_number_window != nil
        @input_number_window.contents_opacity += 24
      end
      if self.contents_opacity == 255
        @fade_in = false
      end
      return
    end
    # 输入数值的情况下
    if @input_number_window != nil
      @input_number_window.update
      # 确定
      if Input.trigger?(Input::C)
        $game_system.se_play($data_system.decision_se)
        $game_variables[$game_temp.num_input_variable_id] =
          @input_number_window.number
        $game_map.need_refresh = true
        # 释放输入数值窗口
        @input_number_window.dispose
        @input_number_window = nil
        terminate_message
      end
      return
    end
    # 显示信息中的情况下
    if @contents_showing
      # 如果不是在显示选择项中就显示暂停标志
      if $game_temp.choice_max == 0
        self.pause = true
      end
      # 取消
      if Input.trigger?(Input::B)
        if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
          $game_system.se_play($data_system.cancel_se)
          $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
          terminate_message
        end
      end
      # 确定
      if Input.trigger?(Input::C)
        if $game_temp.choice_max > 0
          $game_system.se_play($data_system.decision_se)
          $game_temp.choice_proc.call(self.index)
        end
        terminate_message
      end
      return
    end
    # 在渐变以外的状态下有等待显示的信息与选择项的场合
    if @fade_out == false and $game_temp.message_text != nil
      @contents_showing = true
      $game_temp.message_window_showing = true
      reset_window
      refresh
      Graphics.frame_reset
      self.visible = true
      self.contents_opacity = 0
      
      @blacks.each {|i| i.visible = true }
      
      if @input_number_window != nil
        @input_number_window.contents_opacity = 0
      end
      @fade_in = true
      return
    end
    # 没有可以显示的信息、但是窗口为可见的情况下
    if self.visible
      @fade_out = true
      self.opacity -= 48
      
      @blacks.each {|i| i.opacity -= 48 }
      
      if self.opacity == 0
        self.visible = false
        
        @blacks.each {|i| i.visible = false }
        
        @fade_out = false
        $game_temp.message_window_showing = false
      end
      return
    end
  end
end

作者: RPGzh500223    时间: 2021-3-31 10:10
现在看我5楼脚本,一堆问题……
skin那块  $game_system.message_frame = 1 就能解决
也没考虑战斗以及更改文章选项问题

保留窗口样式,实际上使脚本更简单了
默认的消息窗口,位置为下时 ,只留了16高度(有点窄)
楼主可以考虑修改窗口Y值

——————————分割————————————————————
楼主问类似的问题,可以先PS张效果图,方便理解
作者: 精灵使者    时间: 2021-5-9 21:35
我在考虑显示黑边之类和黑边结束的那些事件指令要不要写成公共事件调用
这样会更加简洁一些,而且方便下次修改




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1