じ☆ve冰风 发表于 2024-4-19 21:49:55

基础的游戏设定菜单脚本(新手向)

这个脚本会变动音乐和音效音量,加上窗口还是全屏的选项。

依然是很久以前做的嗯……不知道是不是火星。

整体的思想+基础来自于月光奏鸣曲。

脚本直接加在main之前就行,默认添加选项的是标题画面,当然会脚本的就可以加在菜单里了。


效果:







RUBY 代码
#========================================
#标题添加设定脚本v.1.0
#脚本的想法来自于月光奏鸣曲
#作者为Elamed,使用时请保留以上信息。
#========================================

class Game_System
attr_accessor :bgm_volume
attr_accessor :se_volume
attr_accessor :moniter_mode
def initialize
    @bgm_volume = 80
    @se_volume = 80
    @moniter_mode = 0
end
def bgm_play(bgm)
    @playing_bgm = bgm
    if bgm != niland bgm.name != ""
      Audio.bgm_play("Audio/BGM/" + bgm.name, @bgm_volume, bgm.pitch)
    else
      Audio.bgm_stop
    end
    Graphics.frame_reset
end
def bgs_play(bgs)
    @playing_bgs = bgs
    if bgs != niland bgs.name != ""
      Audio.bgs_play("Audio/BGS/" + bgs.name, @bgm.volume, bgs.pitch)
    else
      Audio.bgs_stop
    end
    Graphics.frame_reset
end
    def me_play(me)
    if me != niland me.name != ""
      Audio.me_play("Audio/ME/" + me.name, @se.volume, me.pitch)
    else
      Audio.me_stop
    end
    Graphics.frame_reset
end
def se_play(se)
    if se != niland se.name != ""
      Audio.se_play("Audio/SE/" + se.name, @se_volume, se.pitch)
    end
end
end

class Scene_Title
def main
      if$BTEST
      battle_test
      return
    end
    $data_actors      = load_data("Data/Actors.rxdata")
    $data_classes       = load_data("Data/Classes.rxdata")
    $data_skills      = load_data("Data/Skills.rxdata")
    $data_items         = load_data("Data/Items.rxdata")
    $data_weapons       = load_data("Data/Weapons.rxdata")
    $data_armors      = load_data("Data/Armors.rxdata")
    $data_enemies       = load_data("Data/Enemies.rxdata")
    $data_troops      = load_data("Data/Troops.rxdata")
    $data_states      = load_data("Data/States.rxdata")
    $data_animations    = load_data("Data/Animations.rxdata")
    $data_tilesets      = load_data("Data/Tilesets.rxdata")
    $data_common_events = load_data("Data/CommonEvents.rxdata")
    $data_system      = load_data("Data/System.rxdata")
    $game_system = Game_System.new
    ifFileTest.exist?("SettingData.rxdata")
      file = File.open("SettingData.rxdata", "r")
      $data_system_set    = load_data("SettingData.rxdata")
      $game_system= Marshal.load(file)
      file.close
    else
      file = File.open("SettingData.rxdata", "w")
      Marshal.dump($game_system, file)
      file.close
    end
    if$game_system.moniter_mode == 1
      unless$keybd
      $keybd = Win32API.new'user32.dll', 'keybd_event', ['i', 'i', 'l', 'l'], 'v'
      $keybd.call 0xA4, 0, 0, 0
      $keybd.call13, 0, 0, 0
      $keybd.call13, 0, 2, 0
      $keybd.call 0xA4, 0, 2, 0
    end
end
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.title($data_system.title_name)
    # 生成命令窗口
    s1 = "新游戏"
    s2 = "读取"
    s3 = "设定"
    s4 = "退出"
    @command_window = Window_Command.new(200, )
    @command_window.x = 400
    @command_window.y = 205
    # 判定继续的有效性
    # 存档文件一个也不存在的时候也调查
    # 有効为 @continue_enabled 为 true、無効为 false
    @continue_enabled = false
    for i in0..3
      ifFileTest.exist?("Save#{i+1}.rxdata")
      @continue_enabled = true
      end
    end
    if@continue_enabled
      @command_window.index = 1
    end
    # 演奏标题 BGM
    $game_system.bgm_play($data_system.title_bgm)
    # 停止演奏 ME、BGS
    Audio.me_stop
    Audio.bgs_stop
    # 执行过渡
    Graphics.transition
    # 主循环
    loopdo
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面被切换就中断循环
      if$scene != self
      break
      end
    end
    # 装备过渡
    Graphics.freeze
    # 释放命令窗口
    @command_window.dispose
    # 释放标题图形
    @sprite.bitmap.dispose
    @sprite.dispose
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
    # 刷新命令窗口
    @command_window.update
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 命令窗口的光标位置的分支
      case@command_window.index
      when0# 新游戏
      command_new_game
      when1# 继续
      command_continue
      when2
      command_option
      when3# 退出
      command_shutdown
      end
    end
end
def command_option
    $game_system.se_play($data_system.decision_se)
    $scene = Scene_Option.new
end
end


class Window_System < Window_Selectable
    def initialize
    super(160, 100, 300, 32 * 4)
    @settings = $game_system
    @item_max = 3
    self.contents = Bitmap.new(width - 32, @item_max * 32)
    refresh
    self.index = 0
end
def refresh(bgm_volume = @settings.bgm_volume, se_volume = @settings.se_volume, moniter_mode = @settings.moniter_mode)
    self.contents.clear
    self.contents.font.size = 16
    @settings.bgm_volume = bgm_volume
    @settings.se_volume = se_volume
    @settings.moniter_mode = moniter_mode
    rect = Rect.new(4, 32 * 0, self.contents.width - 8, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    text = "BGM:   "
    blocknum = @settings.bgm_volume / 10
    for i in2..blocknum
      case i
      when2
      text = text + ""
      when3
      text = text + "▁"# 30
      when4
      text = text + "▂"# 40
      when5
      text = text + "▃"# 50
      when6
      text = text + "▄"# 60
      when7
      text = text + "▅"# 70
      when8
      text = text + "▆"# 80
      when9
      text = text + "▇"# 90
      when10
      text = text + "█"# 100
      end   
    end
    self.contents.draw_text(rect, text)
    rect = Rect.new(4, 32 * 1, self.contents.width - 8, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    blocknum = @settings.se_volume / 10
    text = "SE:    "
    for i in2..blocknum
      case i
      when2
      text = text + ""
      when3
      text = text + "▁"# 30
      when4
      text = text + "▂"# 40
      when5
      text = text + "▃"# 50
      when6
      text = text + "▄"# 60
      when7
      text = text + "▅"# 70
      when8
      text = text + "▆"# 80
      when9
      text = text + "▇"# 90
      when10
      text = text + "█"# 100
      end   
    end
    self.contents.draw_text(rect, text)
    rect = Rect.new(4, 32 * 2, self.contents.width - 8, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))   
    text = "模式(需要重新启动游戏):"
    case@settings.moniter_mode
    when0
      text = text + " 窗口"
    when1
      text = text + " 全屏"
    end
    self.contents.draw_text(rect, text)
end
end

class Scene_Option
    def initialize
      @bgm_volume = $game_system.bgm_volume
      @se_volume = $game_system.se_volume
      @moniter_mode = $game_system.moniter_mode
    end
    def main
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.title($data_system.title_name)
    @sprite.opacity = 180
    @system_window = Window_System.new
    @system_window.opacity = 180
    # 执行过渡
    Graphics.transition
    # 主循环
    loopdo
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if$scene != self
      break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @system_window.dispose
    @sprite.dispose
end
def update
    @system_window.update
    @sprite.update
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.decision_se)
      $game_system.bgm_volume = @bgm_volume
      $game_system.se_volume = @se_volume
      $game_system.moniter_mode = @moniter_mode
      file = File.open("SettingData.rxdata", "w")
      Marshal.dump($game_system, file)
      file.close      
      # 切换到菜单画面
      $scene = Scene_Title.new
      return
    end
    if Input.trigger?(Input::RIGHT)
      if@system_window.index == 0
      if@bgm_volume < 100
          $game_system.se_play($data_system.cursor_se)
         @bgm_volume = @bgm_volume + 10
             $game_system.bgm_play($data_system.title_bgm)
      @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       else
         $game_system.se_play($data_system.cancel_se)
      @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       end      
      elsif@system_window.index == 1
      if@se_volume < 100
          $game_system.se_play($data_system.cursor_se)
         @se_volume = @se_volume + 10
      @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       else
         $game_system.se_play($data_system.cancel_se)
      @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       end
   elsif@system_window.index == 2
       if@moniter_mode == 0
         $game_system.se_play($data_system.decision_se)
         @moniter_mode = 1
         @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       else
         $game_system.se_play($data_system.decision_se)
         @moniter_mode = 0
         @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       end
   end
    return
end
      if Input.trigger?(Input::LEFT)
      if@system_window.index == 0
      if@bgm_volume > 20
          $game_system.se_play($data_system.cursor_se)
         @bgm_volume = @bgm_volume - 10
             $game_system.bgm_play($data_system.title_bgm)
         @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       else
         $game_system.se_play($data_system.cancel_se)
         @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       end      
      elsif@system_window.index == 1
      if@se_volume > 20
          $game_system.se_play($data_system.cursor_se)
         @se_volume = @se_volume - 10
         @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       else
         $game_system.se_play($data_system.cancel_se)
         @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       end
   elsif@system_window.index == 2
       if@moniter_mode == 0
         $game_system.se_play($data_system.decision_se)
         @moniter_mode = 1
         @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       else
         $game_system.se_play($data_system.decision_se)
         @moniter_mode = 0
         @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
       end
   end
    return
end
    @system_window.refresh(@bgm_volume, @se_volume, @moniter_mode)
end
end



这个设定脚本很基础,所以基本上还是新手用的可能性比较高……
所以……嗯,后天开始整合新手向简洁菜单以及继续调整游。
             本帖来自P1论坛作者艾拉梅德,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=336751若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 基础的游戏设定菜单脚本(新手向)