查看: 2155|回复: 5

[已经解决] 【VA】求问如何把选项改成这样

[复制链接]
梦石
0
星屑
50
在线时间
33 小时
注册时间
2013-11-10
回帖
6
发表于 2014-7-24 15:05:42 | 显示全部楼层 |阅读模式

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

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

×
默认是这样

如何改成选项显示在如图所示标注的地方,就像galgame一样的那种

求类似脚本orz

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-7-24 15:12:12 | 显示全部楼层
虽然我没看到图,不过我觉得这个脚本应该可以满足你(参考脚本注释,看不懂就算了……):
http://woodpenguin.web.fc2.com/rgss3/choice_ex.html

[pre lang="ruby" line="1"]=begin

▼ 選択肢拡張 ver. 2.3

RPGツクールVXAce用スクリプト

制作 : 木星ペンギン
URL  : http://woodpenguin.blog.fc2.com/

------------------------------------------------------------------------------
概要

□ 選択肢を連続して設定した場合、つなげて一つの選択肢にする機能の追加。
□ 条件を設定することで、その項目を表示しない機能の追加。
□ 選択肢内容が前回と同じだった場合、
    カーソルの初期位置を前回選んだ項目にする機能の追加。
□ 選択肢ウィンドウの位置を一時的に変更する機能の追加。
□ 条件を設定することで、その項目を半透明にして選択不可にする機能の追加。
□ 選択肢毎にヘルプメッセージを表示できる機能の追加。

------------------------------------------------------------------------------
使い方

□ 選択肢の表示を続けて配置すると、一つの選択肢にまとめられます。
  ・「キャンセルの場合」の処理は、無効以外を設定したものが適用され、
     複数ある場合は後に設定された選択肢のものが適用されます。
  
□ 選択肢の文章中に if(条件) と入れ、その条件が偽になると項目が表示されなくなります。
  ・s でスイッチ、v で変数を参照できます。
  ・「キャンセルの場合」の項目が表示されない場合、無効と同じ処理をします。

□ 注釈に以下の文字列を入れることで、選択肢ウィンドウの表示位置を
   一時的に変更することが出来ます。
  
    選択肢位置(x, y[, row])
   
      x   : ウィンドウを表示する X 座標。
      y   : ウィンドウを表示する Y 座標。
      row : 選択肢を表示する最大行数。
            指定しない場合は、通常の最大行数を無視して
            すべての選択肢が表示されます。
  
□ 選択肢の文章中に en(条件) と入れ、その条件が偽になると項目が半透明で表示されます。
  
□ 各項目の下に、注釈で以下の文字列を入れると、続きの文章を
    項目のヘルプメッセージとしてカーソルを合わせたときに標示することができます。
  
    選択肢ヘルプ
   
□ 詳細は下記のサイトを参照してください。

  http://woodpenguin.web.fc2.com/rgss3/choice_ex.html
  
=end
module WdTk
module ChoiceEX
#//////////////////////////////////////////////////////////////////////////////
#
# 設定項目
#
#//////////////////////////////////////////////////////////////////////////////
  #--------------------------------------------------------------------------
  # ● 選択肢の最大行数
  #     選択肢を表示するウィンドウの行数の最大数です。
  #     選択肢がこの数より小さければ、選択肢の数に合わせます。
  #--------------------------------------------------------------------------
  RowMax = 4
  
  #--------------------------------------------------------------------------
  # ● 選択肢の位置記憶
  #     前回表示した選択肢と全く同じ内容の選択肢を表示する場合、
  #     カーソルの初期位置を前回選んだ項目にする機能です。
  #     false で無効化できます。
  #--------------------------------------------------------------------------
  Store = true
  
  #--------------------------------------------------------------------------
  # ● 選択肢ヘルプを読み取る文字列
  #--------------------------------------------------------------------------
  Help = "選択肢ヘルプ"
  
end

#//////////////////////////////////////////////////////////////////////////////
#
# 以降、変更する必要なし
#
#//////////////////////////////////////////////////////////////////////////////

  @material ||= []
  @material << :ChoiceEX
  def self.include?(sym)
    @material.include?(sym)
  end
  
end

#==============================================================================
# ■ Game_Message
#------------------------------------------------------------------------------
#  文章や選択肢などを表示するメッセージウィンドウの状態を扱うクラスです。この
# クラスのインスタンスは $game_message で参照されます。
#==============================================================================

class Game_Message
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :choice_x                 # 選択肢ウィンドウの表示 X 座標
  attr_accessor :choice_y                 # 選択肢ウィンドウの表示 Y 座標
  attr_accessor :choice_row_max           # 選択肢ウィンドウの表示行数
  attr_accessor :choice_enables           # 選択肢の有効状態
  attr_accessor :choice_help              # 選択肢のヘルプ
  #--------------------------------------------------------------------------
  # ○ クリア
  #--------------------------------------------------------------------------
  alias _wdtk_choice_clear clear
  def clear
    _wdtk_choice_clear
    @choice_x = @choice_y = nil
    @choice_row_max = WdTk::ChoiceEX::RowMax
    @choice_enables = []
    @choice_help = {}
  end
end

#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ☆ 選択肢のセットアップ
  #--------------------------------------------------------------------------
  def setup_choices(params)
    result = []
    add_choices(params, @index, result)
    $game_message.choice_enables = $game_message.choices.collect do |c|
      !c.slice!(/\s*en\(([^\)]+)\)/i) || choice_eval($1)
    end
    unless $game_message.choices.empty?
      m = result.index($game_message.choice_cancel_type - 1)
      $game_message.choice_enables << (!m || $game_message.choice_enables[m])
      result << $game_message.choice_cancel_type - 1
      $game_message.choice_proc = Proc.new {|n| @branch[@indent] = result[n] }
    else
      @branch[@indent] = -1
    end
  end
  #--------------------------------------------------------------------------
  # ● 選択肢の追加
  #--------------------------------------------------------------------------
  def add_choices(params, i, result, d = 0)
    params[0].each_with_index do |s, n|
      choice = s.dup
      next if choice.slice!(/\s*if\(([^\)]+)\)/i) && !choice_eval($1)
      $game_message.choices << choice
      result << n + d
    end
    if params[1] == 5 || (params[1] > 0 && result.include?(params[1] + d - 1))
      $game_message.choice_cancel_type = params[1] + d
    end
    indent = @list.indent
    loop do
      i += 1
      if @list.indent == indent
        case @list.code
        when 402 # [**] の場合
          m = result.index(@list.parameters[0] + d)
          get_help_texts(m, i + 1) if m
        when 404 # 分岐終了
          break
        end
      end
    end
    i += 1
    add_choices(@list.parameters, i, result, d + 5) if @list.code == 102
  end
  #--------------------------------------------------------------------------
  # ● 分岐用
  #--------------------------------------------------------------------------
  def choice_eval(formula)
    s, v = $game_switches, $game_variables
    begin
      Kernel.eval(formula)
    rescue
      msgbox "以下の条件判定でエラーが出ました。\n\n", formula
      true
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘルプ用テキストの取得
  #--------------------------------------------------------------------------
  def get_help_texts(b, i)
    if @list.code == 108 && @list.parameters[0] == WdTk::ChoiceEX::Help
      $game_message.choice_help = []
      loop do
        i += 1
        break if @list.code != 408
        $game_message.choice_help << @list.parameters[0]
      end
    end
  end
  #--------------------------------------------------------------------------
  # ◯ 注釈
  #--------------------------------------------------------------------------
  alias _wdtk_choice_command_108 command_108
  def command_108
    _wdtk_choice_command_108
    @comments.each do |comment|
      if comment =~ /選択肢位置\((\d+),\s*(\d+),?\s*(\d*)\)/
        $game_message.choice_x = $1.to_i
        $game_message.choice_y = $2.to_i
        $game_message.choice_row_max = ($3.empty? ? 99 : $3.to_i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 分岐終了の場合
  #--------------------------------------------------------------------------
  def command_404
    if next_event_code == 102
      @branch[@indent] -= 5 if @branch.include?(@indent)
      @index += 1
      command_skip
#~     else
#~       @branch.delete(@indent)
    end
  end
end

#==============================================================================
# ■ Window_ChoiceList
#==============================================================================
class Window_ChoiceList
  #--------------------------------------------------------------------------
  # ☆ 入力処理の開始
  #--------------------------------------------------------------------------
  def start
    return unless close?
    last_choices = @list.collect {|c| c[:name] }
    update_placement
    refresh
    unless WdTk::ChoiceEX::Store && last_choices == $game_message.choices
      select(0)
    end
    open
    activate
  end
  #--------------------------------------------------------------------------
  # ○ ウィンドウ位置の更新
  #--------------------------------------------------------------------------
  alias _wdtk_choice_update_placement update_placement
  def update_placement
    _wdtk_choice_update_placement
    self.height = [height, fitting_height($game_message.choice_row_max)].min
    if @message_window.y >= Graphics.height / 2
      self.y = @message_window.y - height
    else
      self.y = @message_window.y + @message_window.height
    end
    self.x = $game_message.choice_x if $game_message.choice_x
    self.y = $game_message.choice_y if $game_message.choice_y
  end
  #--------------------------------------------------------------------------
  # ☆ コマンドリストの作成
  #--------------------------------------------------------------------------
  def make_command_list
    $game_message.choices.each_with_index do |choice, i|
      add_command(choice, :choice, $game_message.choice_enables)
    end
  end
  #--------------------------------------------------------------------------
  # ○ 項目の描画
  #--------------------------------------------------------------------------
  alias _wdtk_choice_draw_item draw_item
  def draw_item(index)
    @choice_enabled = command_enabled?(index)
    _wdtk_choice_draw_item(index)
  end
  #--------------------------------------------------------------------------
  # ● テキスト描画色の変更
  #--------------------------------------------------------------------------
  def change_color(color, enabled = true)
    super(color, enabled && @choice_enabled)
  end
  #--------------------------------------------------------------------------
  # ● キャンセルボタンが押されたときの処理
  #--------------------------------------------------------------------------
  def process_cancel
    if $game_message.choice_enables[item_max]
      super
    else
      Sound.play_buzzer
    end
  end
  #--------------------------------------------------------------------------
  # ☆ キャンセルハンドラの呼び出し
  #--------------------------------------------------------------------------
  def call_cancel_handler
    $game_message.choice_proc.call(item_max)
    close
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウを閉じる
  #--------------------------------------------------------------------------
  def close
    @message_window.on_show_fast unless $game_message.choice_help.empty?
    super
  end
  #--------------------------------------------------------------------------
  # ● ヘルプウィンドウ更新メソッドの呼び出し
  #--------------------------------------------------------------------------
  def call_update_help
    update_help if active && !$game_message.choice_help.empty?
  end
  #--------------------------------------------------------------------------
  # ● ヘルプウィンドウの更新
  #--------------------------------------------------------------------------
  def update_help
    @message_window.force_clear
    if $game_message.choice_help.include?(index)
      $game_message.texts.replace($game_message.choice_help[index])
    else
      $game_message.texts.clear
    end
  end
end

#==============================================================================
# ■ Window_Message
#==============================================================================
class Window_Message
  #--------------------------------------------------------------------------
  # ● 文章の標示を強制クリア
  #--------------------------------------------------------------------------
  def force_clear
    @gold_window.close
    @fiber = nil
    close
    if WdTk.include?(:MesEff)
      @character_sprites.each do |sprite, params|
        next if params.empty?
        sprite.bitmap.clear
        sprite.visible = false
        params.clear
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 文章を最後まで表示する
  #--------------------------------------------------------------------------
  def on_show_fast
    @show_fast = true
  end
end[/pre]

点评

果然看不懂orz  发表于 2014-7-24 17:40
回复

使用道具 举报

梦石
0
星屑
50
在线时间
33 小时
注册时间
2013-11-10
回帖
6
 楼主| 发表于 2014-7-24 17:43:00 | 显示全部楼层
1053181679 发表于 2014-7-24 17:35
卧槽我发现图挂了……

QQ截图20140724150144.png QQ图片20140724150323.jpg

点评

图片变量条件分歧的我会,就是嫌麻烦,并且选项太多做起来得不偿失  发表于 2014-7-24 20:43
嗯,你还可以找个事件触教你用图片,变量,条件分歧什么的去做这个。  发表于 2014-7-24 18:20
嗯,这个脚本满足不了你。你需要找脚本触定制……  发表于 2014-7-24 17:44
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2014-7-24 18:56:04 | 显示全部楼层
本帖最后由 tseyik 于 2014-7-24 18:57 编辑

Visual Novel Choices
http://galvs-scripts.com/2012/11/26/visual-novel-choices/
001.jpg
7.jpg

点评

此脚本棒哭!刚刚去改图了忘回复了!谢谢!!!  发表于 2014-7-24 22:12
可是这个脚本看上去挺符合你的要求的啊~  发表于 2014-7-24 20:48

评分

参与人数 1梦石 +1 收起 理由
taroxd + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
54
在线时间
1049 小时
注册时间
2012-1-27
回帖
1380
发表于 2014-7-24 19:11:32 | 显示全部楼层

RE: 【VA】求问如何把选项改成这样

本帖最后由 黑化の鼠标 于 2014-7-24 19:19 编辑

比较轻松的方法是等脚本触写脚本。
比较不轻松的方法是自己用变量操作和分支条件,图片显示制作。
然后大致提供一下比较不轻松的思路范例
下载地址
大致上提供了两种显示选项的思路,不过实质上这种东西就没什么太大的限制,这个部分也只是提供了两个我自己暂时想得到的显示方式而已。
(所以还请别被这两种破烂的显示方式束缚住思路,请尽情地发挥你的想象力吧。)
大致效果(基本上抱着尽快把问题解决的偷懒心态导致所有使用素材都相当拙计,虽然事实上就算全力以赴也只是那个破样)
第一种
第一种.gif
第二种
第二种.gif
大致上需要注意的地方就是
B.png
一号事件块和二号事件块的本质基本一致,都是用来进行显示图片,根据操作来判定选择肢的位置用的。
三号事件块是用来执行【当选择了一号选项】之后要进行的事件用的。(也就是当选择肢=1时的情况)
四号事件块是用来执行【当选择了二号选项】之后要进行的事件用的。(也就是当选择肢=2时的情况)
五号事件块只是用来防止在进行选择时人物会乱动的情况,如果觉得多个事件块太碍事可以删掉把一号和二号事件块的执行方式换成自动执行试试,我个人测试时换成自动执行的话感觉效果不是很好所以才有了五号事件块这个多余的东西。

注明:还请不要在意工程名称那种事情....只是我拿一个刚起草了框架的废坑来胡搞瞎搞而已.....

点评

实在不会弄脚本看外文又头晕那就只能走事件了,不过实质上上面几位提供的脚本都是相当方便快捷的东西...你自己拿回去看看应该就能明白了....  发表于 2014-7-24 21:14
嘛....这种事就看你自己的个人选择了,我个人是只要能达成自己的需求就好,为了速度和效率选择脚本也是不错的选择  发表于 2014-7-24 21:13
纯事件吗…好华丽QAQ但做一个选项就这么麻烦那就有点得不偿失了……顺便说说上面的脚本是我看不懂,不会用【别吐槽我…………  发表于 2014-7-24 20:41
惨了,没装全局变量,这下只能玩读档进EXTRA的把戏了∑(゚ω゚ノ)ノ
我感觉我快成兜售Q键幻灯片狂魔了
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2014-7-24 21:26:40 | 显示全部楼层

範

本帖最后由 tseyik 于 2014-7-24 21:39 编辑

範本
Visual Novel Choices v.1.9.rar (353.17 KB, 下载次数: 75)
也可改変成這樣
001.jpg
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部