查看完整版本: [-- 新手问题解答后发出的教程.(很不详细) --]

幻想森林论坛 -> RM思路探讨 -> 新手问题解答后发出的教程.(很不详细) [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

无视即可 2007-10-27 13:58

新手问题解答后发出的教程.(很不详细)

首先说下地图显示角色坐标的,
先发个成品,这个看懂觉得小儿科就不用向下看了
复制代码


  1. #==============================================================================
    # ■ Window_PlayTime
    #------------------------------------------------------------------------------
    #  菜单画面显示游戏时间的窗口。
    #==============================================================================

    class Window_Zuobiao < Window_Base
      #--------------------------------------------------------------------------
      # ● 初始化对像
      #--------------------------------------------------------------------------
      def initialize
        super(0, 0, 160, 96)
        self.contents = Bitmap.new(width - 32, height - 32)
        refresh
      end
      #--------------------------------------------------------------------------
      # ● 刷新
      #--------------------------------------------------------------------------
      def refresh
        self.contents.clear
        self.contents.font.color = system_color
        self.contents.draw_text(4, 0, 120, 32, "角色坐标:")
        self.contents.draw_text(4, 32, 120, 32, "x:")
        self.contents.draw_text(64, 32, 120, 32, "y:")
        self.contents.draw_text(16-88, 32, 120, 32, $game_player.x.to_s, 2)
        self.contents.draw_text(64-78, 32, 120, 32, $game_player.y.to_s, 2)
      end
      #--------------------------------------------------------------------------
      # ● 刷新画面
      #--------------------------------------------------------------------------
      def update
        super
        if Graphics.frame_count / Graphics.frame_rate != @total_sec
          refresh
        end
      end
    end
    class Scene_Map
      #--------------------------------------------------------------------------
      # ● 主处理
      #--------------------------------------------------------------------------
      def main
        # 生成活动块
        @spriteset = Spriteset_Map.new
        # 生成信息窗口
        @message_window = Window_Message.new
        @m=Window_Zuobiao.new
        # 执行过渡
        Graphics.transition
        # 主循环
        loop do
          # 刷新游戏画面
          Graphics.update
          # 刷新输入信息
          Input.update
          # 刷新画面
          update
          # 如果画面切换的话就中断循环
          if $scene != self
            break
          end
        end
        # 准备过渡
        Graphics.freeze
        # 释放活动块
        @spriteset.dispose
        # 释放信息窗口
        @message_window.dispose
        @m.dispose
        # 标题画面切换中的情况下
        if $scene.is_a?(Scene_Title)
          # 淡入淡出画面
          Graphics.transition
          Graphics.freeze
        end
      end
      #--------------------------------------------------------------------------
      # ● 刷新画面
      #--------------------------------------------------------------------------
      def update
        # 循环
        loop do
          # 按照地图、实例、主角的顺序刷新
          # (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
          #  的机会的重要因素)
          $game_map.update
          $game_system.map_interpreter.update
          $game_player.update
          # 系统 (计时器)、画面刷新
          $game_system.update
          $game_screen.update
          # 如果主角在场所移动中就中断循环
          unless $game_temp.player_transferring
            break
          end
          # 执行场所移动
          transfer_player
          # 处理过渡中的情况下、中断循环
          if $game_temp.transition_processing
            break
          end
        end
        # 刷新活动块
        @spriteset.update
        # 刷新信息窗口
        @message_window.update
        @m.update
        # 游戏结束的情况下
        if $game_temp.gameover
          # 切换的游戏结束画面
          $scene = Scene_Gameover.new
          return
        end
        # 返回标题画面的情况下
        if $game_temp.to_title
          # 切换到标题画面
          $scene = Scene_Title.new
          return
        end
        # 处理过渡中的情况下
        if $game_temp.transition_processing
          # 清除过渡处理中标志
          $game_temp.transition_processing = false
          # 执行过渡
          if $game_temp.transition_name == ""
            Graphics.transition(20)
          else
            Graphics.transition(40, "Graphics/Transitions/" +
              $game_temp.transition_name)
          end
        end
        # 显示信息窗口中的情况下
        if $game_temp.message_window_showing
          return
        end
        # 遇敌计数为 0 且、且遇敌列表不为空的情况下
        if $game_player.encounter_count == 0 and $game_map.encounter_list != []
          # 不是在事件执行中或者禁止遇敌中
          unless $game_system.map_interpreter.running? or
                $game_system.encounter_disabled
            # 确定队伍
            n = rand($game_map.encounter_list.size)
            troop_id = $game_map.encounter_list[n]
            # 队伍有效的话
            if $data_troops[troop_id] != nil
              # 设置调用战斗标志
              $game_temp.battle_calling = true
              $game_temp.battle_troop_id = troop_id
              $game_temp.battle_can_escape = true
              $game_temp.battle_can_lose = false
              $game_temp.battle_proc = nil
            end
          end
        end
        # 按下 B 键的情况下
        if Input.trigger?(Input::B)
          # 不是在事件执行中或菜单禁止中
          unless $game_system.map_interpreter.running? or
                $game_system.menu_disabled
            # 设置菜单调用标志以及 SE 演奏
            $game_temp.menu_calling = true
            $game_temp.menu_beep = true
          end
        end
        # 调试模式为 ON 并且按下 F9 键的情况下
        if $DEBUG and Input.press?(Input::F9)
          # 设置调用调试标志
          $game_temp.debug_calling = true
        end
        # 不在主角移动中的情况下
        unless $game_player.moving?
          # 执行各种画面的调用
          if $game_temp.battle_calling
            call_battle
          elsif $game_temp.shop_calling
            call_shop
          elsif $game_temp.name_calling
            call_name
          elsif $game_temp.menu_calling
            call_menu
          elsif $game_temp.save_calling
            call_save
          elsif $game_temp.debug_calling
            call_debug
          end
        end
      end
      #--------------------------------------------------------------------------
      # ● 调用战斗
      #--------------------------------------------------------------------------
      def call_battle
        # 清除战斗调用标志
        $game_temp.battle_calling = false
        # 清除菜单调用标志
        $game_temp.menu_calling = false
        $game_temp.menu_beep = false
        # 生成遇敌计数
        $game_player.make_encounter_count
        # 记忆地图 BGM 、停止 BGM
        $game_temp.map_bgm = $game_system.playing_bgm
        $game_system.bgm_stop
        # 演奏战斗开始 SE
        $game_system.se_play($data_system.battle_start_se)
        # 演奏战斗 BGM
        $game_system.bgm_play($game_system.battle_bgm)
        # 矫正主角姿势
        $game_player.straighten
        # 切换到战斗画面
        $scene = Scene_Battle.new
      end
      #--------------------------------------------------------------------------
      # ● 调用商店
      #--------------------------------------------------------------------------
      def call_shop
        # 清除商店调用标志
        $game_temp.shop_calling = false
        # 矫正主角姿势
        $game_player.straighten
        # 切换到商店画面
        $scene = Scene_Shop.new
      end
      #--------------------------------------------------------------------------
      # ● 调用名称输入
      #--------------------------------------------------------------------------
      def call_name
        # 清除商店调用名称输入标志
        $game_temp.name_calling = false
        # 矫正主角姿势
        $game_player.straighten
        # 切换到名称输入画面
        $scene = Scene_Name.new
      end
      #--------------------------------------------------------------------------
      # ● 调用菜单
      #--------------------------------------------------------------------------
      def call_menu
        # 清除商店调用菜单标志
        $game_temp.menu_calling = false
        # 已经设置了菜单 SE 演奏标志的情况下
        if $game_temp.menu_beep
          # 演奏确定 SE
          $game_system.se_play($data_system.decision_se)
          # 清除菜单演奏 SE 标志
          $game_temp.menu_beep = false
        end
        # 矫正主角姿势
        $game_player.straighten
        # 切换到菜单画面
        $scene = Scene_Menu.new
      end
      #--------------------------------------------------------------------------
      # ● 调用存档
      #--------------------------------------------------------------------------
      def call_save
        # 矫正主角姿势
        $game_player.straighten
        # 切换到存档画面
        $scene = Scene_Save.new
      end
      #--------------------------------------------------------------------------
      # ● 调用调试
      #--------------------------------------------------------------------------
      def call_debug
        # 清除商店调用调试标志
        $game_temp.debug_calling = false
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 矫正主角姿势
        $game_player.straighten
        # 切换到调试画面
        $scene = Scene_Debug.new
      end
      #--------------------------------------------------------------------------
      # ● 主角的场所移动
      #--------------------------------------------------------------------------
      def transfer_player
        # 清除主角场所移动调试标志
        $game_temp.player_transferring = false
        # 移动目标与现在的地图有差异的情况下
        if $game_map.map_id != $game_temp.player_new_map_id
          # 设置新地图
          $game_map.setup($game_temp.player_new_map_id)
        end
        # 设置主角位置
        $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
        # 设置主角朝向
        case $game_temp.player_new_direction
        when 2  # 下
          $game_player.turn_down
        when 4  # 左
          $game_player.turn_left
        when 6  # 右
          $game_player.turn_right
        when 8  # 上
          $game_player.turn_up
        end
        # 矫正主角姿势
        $game_player.straighten
        # 刷新地图 (执行并行事件)
        $game_map.update
        # 在生成活动块
        @spriteset.dispose
        @spriteset = Spriteset_Map.new
        # 处理过渡中的情况下
        if $game_temp.transition_processing
          # 清除过渡处理中标志
          $game_temp.transition_processing = false
          # 执行过渡
          Graphics.transition(20)
        end
        # 执行地图设置的 BGM、BGS 的自动切换
        $game_map.autoplay
        # 设置画面
        Graphics.frame_reset
        # 刷新输入信息
        Input.update
      end
    end


直接把上面的脚本插入 Main前就可以了,由于方法不优化我的机器里有点卡
不知大家的.
由于是复制了时间窗口偷懒的所以有个
复制代码

  1. #==============================================================================
    # ■ Window_PlayTime
    #------------------------------------------------------------------------------
    #  菜单画面显示游戏时间的窗口。
    #==============================================================================
    对于新手来说会复制改造就不错
    下面是脚本主要内容,
    class Window_Zuobiao < Window_Base
      #--------------------------------------------------------------------------
      # ● 初始化对像
      #--------------------------------------------------------------------------
      def initialize
        super(0, 0, 160, 96)
        self.contents = Bitmap.new(width - 32, height - 32)
        refresh
      end
      #--------------------------------------------------------------------------
      # ● 刷新
      #--------------------------------------------------------------------------
      def refresh
        self.contents.clear
        self.contents.font.color = system_color
        self.contents.draw_text(4, 0, 120, 32, "角色坐标:")
        self.contents.draw_text(4, 32, 120, 32, "x:")
        self.contents.draw_text(64, 32, 120, 32, "y:")
        self.contents.draw_text(16-88, 32, 120, 32, $game_player.x.to_s, 2)
        self.contents.draw_text(64-78, 32, 120, 32, $game_player.y.to_s, 2)
      end
      #--------------------------------------------------------------------------
      # ● 刷新画面
      #--------------------------------------------------------------------------
      def update
        super
        if Graphics.frame_count / Graphics.frame_rate != @total_sec
          refresh
        end
      end
    end


$game_player.y和$game_player.x是在game_player中找到的角色坐标,
我就把他应用了,由于self.contents.draw_text显示变量要在后面加入to_s
所以我显示坐标也用了,其他的用self.contents.draw_text来显示字的就不多说,
用老方法在地图类中有窗口设置的地方照猫画虎显示窗口.






还有的怎样使Level up以图片方式显示:


下面是我的回答

Window_BattleStatus#中就有设置
复制代码

  1. if @level_up_flags
            self.contents.font.color = normal_color
            self.contents.draw_text(actor_x, 96, 120, 32, "LEVEL UP!")
          else
            draw_actor_state(actor, actor_x, 96)
          end


用这个
复制代码

  1.       bitmap=Bitmap.new("Graphics/pictures/某某某")
        src_rect=Rect.new(0,0,bitmap.width,bitmap.height)
        self.contents.blt(actor_x,96,bitmap,src_rect)
    [code]
    替代原来的
    [code]
    self.contents.font.color = normal_color
            self.contents.draw_text(actor_x, 96, 120, 32, "LEVEL UP!")

图片的名字写在"某某某"那个位置,记住,图片要放在pictures文件甲





上面的感觉够详细的了,大家如果有不明白的就在本贴问

Saiholmes 2007-10-27 14:52
呃,希望LZ贴代码时,使用 [#code]这里是代码[/#code]  使用时去掉#
否则遇到这个符号就会出现问题哦~~
复制代码
  1. [i]

无视即可 2007-10-27 17:27
..去掉井号???这样不就不能直接复制了吗??
赶到这个论坛而已详细解释,不要像我上面的一样

莳绱主锍 2008-03-02 15:53
呵呵,顶个 [s:182]


查看完整版本: [-- 新手问题解答后发出的教程.(很不详细) --] [-- top --]



Powered by PHPWind v7.5 SP3 Code ©2003-2010 PHPWind
Time 0.105161 second(s),query:2 Gzip enabled

You can contact us