zoukankan      html  css  js  c++  java
  • 如何优雅的研究 RGSS3 (七) 加入LOGO屏幕

    对于游戏 LOGO 屏幕。

    首先设计 LOGO Scene类。我们知道,现场类 Scene_Base 子类。

    让我们回顾一下现场的作品。

    首先运行开始处理。其次是开始治疗。然后停止更新屏幕,最后,治疗结束前,理。

    以下来逐个分析这些方法。


    当进入 LOGO 画面时,显然不须要也不可能回到上一个画面,因此在開始处理的方法中,我们要清空场景的切换记录。

    接下来要创建出须要显示的 LOGO 图片,可是不能让它马上显示,而是要使其淡入画面,因此要冻结住图像的显示。

    最后播放 LOGO 画面的音效。

      #--------------------------------------------------------------------------
      # ● 開始处理
      #--------------------------------------------------------------------------
      def start
        super
        SceneManager.clear
        Graphics.freeze
        create_logo
        play_logo_music
      end

    在画面開始后,我们要准备图像的渐变、接受按键,并初始化计数器。

      #--------------------------------------------------------------------------
      # ● 開始后处理
      #--------------------------------------------------------------------------
      def post_start
        perform_transition
        Input.update
        @count = CONF_LOGO::DISP_FLAME_LOGO
      end

    在更新画面时。除了调用的更新画面方法外。还要推断LOGO画面是否结束,结束则进入标题画面。


      #--------------------------------------------------------------------------
      # ● 更新画面
      #--------------------------------------------------------------------------
      alias :_orig_update :update
      def update
        _orig_update
        SceneManager.goto(Scene_Title) if disp_logo?
      end

    而仅仅有按下跳过键或达到一定时间 LOGO 画面才会结束。而这个一定的时间我们将它设置为一个常量,每次更新画面时将计数器减一。当计数器为零时则结束 LOGO 画面。

      #--------------------------------------------------------------------------
      # ● 推断LOGO画面是否结束
      #--------------------------------------------------------------------------
      def disp_logo?
        if Input.trigger?(:C)
          true if CONF_LOGO::SKIP_LOGO
        else
          @count -= 1
          true if @count <= 0
        end
      end

    在结束 LOGO 画面前不要忘了将图片与音乐淡出。

      #--------------------------------------------------------------------------
      # ● 结束前处理
      #--------------------------------------------------------------------------
      def pre_terminate
        fadeout_all(transition_speed)
      end


    淡出方法也非常easy。

      #--------------------------------------------------------------------------
      # ● 淡出声音和图形
      #--------------------------------------------------------------------------
      def fadeout_all(time)
        RPG::ME.fade(time) if @use_me
        Graphics.fadeout(time)
        RPG::SE.stop if @use_se
        RPG::ME.stop if @use_me
      end<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>


    之后在结束处理中将图片精灵消除。

      #--------------------------------------------------------------------------
      # ● 结束处理
      #--------------------------------------------------------------------------
      def terminate
        super
        dispose_logo
      end

    整个场景中事实上仅仅有一个精灵,也就是 LOGO 图像精灵。

    它在開始处理中创建。

      #--------------------------------------------------------------------------
      # ● 生成LOGO
      #--------------------------------------------------------------------------
      def create_logo
        @sprite = Sprite.new
        @sprite.bitmap = Cache.system(CONF_LOGO::FILE_LOGO)
        center_sprite(@sprite)
      end


    从缓存冲取出图像创建出精灵。然后将精灵放置在屏幕中央。

      #--------------------------------------------------------------------------
      # ● 精灵移动到屏幕中央
      #--------------------------------------------------------------------------
      def center_sprite(sprite)
        sprite.ox = sprite.bitmap.width / 2
        sprite.oy = sprite.bitmap.height / 2
        sprite.x = Graphics.width / 2
        sprite.y = Graphics.height / 2
      end


    该精灵在结束处理中被释放。

      #--------------------------------------------------------------------------
      # ● 释放LOGO
      #--------------------------------------------------------------------------
      def dispose_logo
        @sprite.bitmap.dispose
        @sprite.dispose
      end


    在 Scene_Base 中有一个运行渐变 perform_transition 方法,它调用 transition_speed 获取渐变速度。

    我们将其重载为自己的版本号。

      #--------------------------------------------------------------------------
      # ● 获取渐变速度
      #--------------------------------------------------------------------------
      def transition_speed
        if Input.trigger?(:C)
          return 0
        else
          return CONF_LOGO::FADE_SPEED_LOGO
        end
      end

    LOGO 画面中的音效在開始处理时调用 play_logo_music 播放。

      #--------------------------------------------------------------------------
      # ● 播放LOGO显示时的音效
      #--------------------------------------------------------------------------
      def play_logo_music
        @use_se = true
        @use_me = false
      
        logo_music = RPG::SE.new(CONF_LOGO::MU_LOGO)
        logo_music.play rescue @use_se = false
        
        unless @use_se
          @use_me = true
          logo_music = RPG::ME.new(CONF_LOGO::MU_LOGO)
          logo_music.play rescue @use_me = false
        end
        
      end

    这样我们的 LOGO 画面类就设计好了,当中涉及到了很多常量,我们用一个专门的模块来定义它们。

    #==============================================================================
    # ■ CONF_LOGO
    #------------------------------------------------------------------------------
    #  设定常量
    #==============================================================================
    
    module CONF_LOGO
    
      # LOGO功能开关
      USE_LOGO = true
      
      # 回到标题画面时是否显示LOGO画面
      RESET_LOGO = false
      
      # TEST时是否显示LOGO画面
      TEST_LOGO = true
      
      # 能否够跳过LOGO画面
      SKIP_LOGO = true
      
      # LOGO图像文件名称
      # (Graphics/System/设定的LOGO画面文件名称)
      FILE_LOGO = "logo"
      
      # LOGO画面中的SE
      # (Audio/SE/设定的SE文件名称 Audio/ME/设定的ME文件名称)
      # ※当值为空时不播放
      MU_LOGO = ""
      
      # 淡入淡出渐变率(帧数)
      FADE_SPEED_LOGO = 10
      
      # LOGO显示的时间的长度(帧数)
      DISP_FLAME_LOGO = 30
    
    end

    重写 SceneManager 中的 first_scene_class,使得最初的场景中显示 LOGO 画面。

    #==============================================================================
    # ■ SceneManager
    #------------------------------------------------------------------------------
    #  场景切换的管理器。

    RGSS3 内置了新功能,在使用 call 方法切换新场景时,能够 # 用 return 方法返回上一个场景。

    #============================================================================== module SceneManager @reset_flg = true #-------------------------------------------------------------------------- # ● 获取最初场景的所属类 #-------------------------------------------------------------------------- def self.first_scene_class if CONF_LOGO::USE_LOGO and @reset_flg @reset_flg = false # 假设显示LOGO if CONF_LOGO::TEST_LOGO # 假设在測试时显示LOGO $BTEST ? Scene_Battle : Scene_Logo else # 假设不在測试时显示LOGO $BTEST ? Scene_Battle : ( $TEST ? Scene_Title : Scene_Logo ) end else # 假设不显示LOGO $BTEST ? Scene_Battle : Scene_Title end end end


    完整的脚本插件代码例如以下

    #encoding:utf-8
    #==============================================================================
    # ■ CONF_LOGO
    #------------------------------------------------------------------------------
    #  设定常量
    #==============================================================================
    
    module CONF_LOGO
    
      # LOGO功能开关
      USE_LOGO = true
      
      # 回到标题画面时是否显示LOGO画面
      RESET_LOGO = false
      
      # TEST时是否显示LOGO画面
      TEST_LOGO = true
      
      # 能否够跳过LOGO画面
      SKIP_LOGO = true
      
      # LOGO图像文件名称
      # (Graphics/System/设定的LOGO画面文件名称)
      FILE_LOGO = "logo"
      
      # LOGO画面中的SE
      # (Audio/SE/设定的SE文件名称 Audio/ME/设定的ME文件名称)
      # ※当值为空时不播放
      MU_LOGO = ""
      
      # 淡入淡出渐变率(帧数)
      FADE_SPEED_LOGO = 10
      
      # LOGO显示的时间的长度(帧数)
      DISP_FLAME_LOGO = 30
    
    end
    
    #==============================================================================
    # ■ Scene_Logo
    #------------------------------------------------------------------------------
    #  LOGO画面。
    #==============================================================================
    
    class Scene_Logo < Scene_Base
      #--------------------------------------------------------------------------
      # ● 開始处理
      #--------------------------------------------------------------------------
      def start
        super
        SceneManager.clear
        Graphics.freeze
        create_logo
        play_logo_music
      end
      #--------------------------------------------------------------------------
      # ● 開始后处理
      #--------------------------------------------------------------------------
      def post_start
        perform_transition
        Input.update
        @count = CONF_LOGO::DISP_FLAME_LOGO
      end
      #--------------------------------------------------------------------------
      # ● 更新画面
      #--------------------------------------------------------------------------
      alias :_orig_update :update
      def update
        _orig_update
        SceneManager.goto(Scene_Title) if disp_logo?
      end
      #--------------------------------------------------------------------------
      # ● 推断LOGO画面是否结束
      #--------------------------------------------------------------------------
      def disp_logo?
        if Input.trigger?(:C)
          true if CONF_LOGO::SKIP_LOGO
        else
          @count -= 1
          true if @count <= 0
        end
      end
      #--------------------------------------------------------------------------
      # ● 结束前处理
      #--------------------------------------------------------------------------
      def pre_terminate
        fadeout_all(transition_speed)
      end
      #--------------------------------------------------------------------------
      # ● 结束处理
      #--------------------------------------------------------------------------
      def terminate
        super
        dispose_logo
      end
      #--------------------------------------------------------------------------
      # ● 获取渐变速度
      #--------------------------------------------------------------------------
      def transition_speed
        if Input.trigger?(:C)
          return 0
        else
          return CONF_LOGO::FADE_SPEED_LOGO
        end
      end
      #--------------------------------------------------------------------------
      # ● 生成LOGO
      #--------------------------------------------------------------------------
      def create_logo
        @sprite = Sprite.new
        @sprite.bitmap = Cache.system(CONF_LOGO::FILE_LOGO)
        center_sprite(@sprite)
      end
      #--------------------------------------------------------------------------
      # ● 释放LOGO
      #--------------------------------------------------------------------------
      def dispose_logo
        @sprite.bitmap.dispose
        @sprite.dispose
      end
      #--------------------------------------------------------------------------
      # ● 精灵移动到屏幕中央
      #--------------------------------------------------------------------------
      def center_sprite(sprite)
        sprite.ox = sprite.bitmap.width / 2
        sprite.oy = sprite.bitmap.height / 2
        sprite.x = Graphics.width / 2
        sprite.y = Graphics.height / 2
      end
      #--------------------------------------------------------------------------
      # ● 播放LOGO显示时的音效
      #--------------------------------------------------------------------------
      def play_logo_music
        @use_se = true
        @use_me = false
      
        logo_music = RPG::SE.new(CONF_LOGO::MU_LOGO)
        logo_music.play rescue @use_se = false
        
        unless @use_se
          @use_me = true
          logo_music = RPG::ME.new(CONF_LOGO::MU_LOGO)
          logo_music.play rescue @use_me = false
        end
        
      end
      #--------------------------------------------------------------------------
      # ● 淡出声音和图形
      #--------------------------------------------------------------------------
      def fadeout_all(time)
        RPG::ME.fade(time) if @use_me
        Graphics.fadeout(time)
        RPG::SE.stop if @use_se
        RPG::ME.stop if @use_me
      end
    end
    
    #==============================================================================
    # ■ SceneManager
    #------------------------------------------------------------------------------
    #  场景切换的管理器。

    RGSS3 内置了新功能,在使用 call 方法切换新场景时。能够 # 用 return 方法返回上一个场景。 #============================================================================== module SceneManager @reset_flg = true #-------------------------------------------------------------------------- # ● 获取最初场景的所属类 #-------------------------------------------------------------------------- def self.first_scene_class if CONF_LOGO::USE_LOGO and @reset_flg @reset_flg = false # 假设显示LOGO if CONF_LOGO::TEST_LOGO # 假设在測试时显示LOGO $BTEST ? Scene_Battle : Scene_Logo else # 假设不在測试时显示LOGO $BTEST ? Scene_Battle : ( $TEST ?

    Scene_Title : Scene_Logo ) end else # 假设不显示LOGO $BTEST ? Scene_Battle : Scene_Title end end end














  • 相关阅读:
    Linux下破解windows密码最终秘籍
    vc编程实现NTFS数据流创建与检测
    C# 登陆 电脑 QQ 发送消息
    一个自创/发明编程语言的想法
    可迭代的前端项目开发规范
    写给那些讨厌微软系的人
    组件化的前端开发流程
    一个java swt桌面程序开发到打包的总结(2)
    一个java swt桌面程序开发到打包的总结(3)
    一个java swt桌面程序开发到打包的总结(1)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4606875.html
Copyright © 2011-2022 走看看