设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 天地有正气
打印 上一主题 下一主题

[RMXP发布] RGSS1脚本教程 重写!!!

[复制链接]

Lv3.寻梦者

○赛

梦石
0
星屑
1249
在线时间
1276 小时
注册时间
2013-1-22
帖子
2246

贵宾

31
 楼主| 发表于 2014-2-2 09:39:02 | 只看该作者
本帖最后由 天地有正气 于 2014-2-2 11:13 编辑

第十一章  如何创建一个窗口5

这一节主要说一下血条的绘制。Bitmap类里面有一个方法,是专门用来填充颜色的。
fill_rect(x, y, width, height, color)
fill_rect(rect, color)
以 color(Color)颜色填充该位图的矩形(x,y,width,height)或 rect(Rect)。


我们把refresh方法中,除了self.contents.clear之外的内容都删光,开始编写血条。
编写之前,有必要了解一下血条的宽度是怎么算出来的,下面这句我认为是最好的写法,简介明了。
w = self.width * $game_party.actors[0].hp / [$game_party.actors[0].maxhp,1].max

然后,开始用fill_rect编写一个血条。
两种方法:
1.self.contents.fill_rect(0,0,w,20,Color.new(255,0,0,220))。
2.self.contents.fill_rect(Rect.new(0,0,w,20),Color.new(255,0,0,220))

至于边框,也是用fill_rect描绘,注意一条边一条边的描绘。

评分

参与人数 1星屑 +50 收起 理由
怪蜀黍 + 50 发布奖励

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
39 小时
注册时间
2010-7-17
帖子
42
32
发表于 2014-2-2 13:56:21 | 只看该作者
LZ辛苦了。写的很好!支持一个
回复 支持 反对

使用道具 举报

Lv2.观梦者

故九江太守

梦石
0
星屑
635
在线时间
2168 小时
注册时间
2012-12-5
帖子
4464
33
发表于 2014-2-3 00:39:12 | 只看该作者
一讲能写长点么……

点评

窗口比标题长了很多。。所有十一章加起来一共6000多字  发表于 2014-2-3 09:53
回复 支持 反对

使用道具 举报

Lv3.寻梦者

○赛

梦石
0
星屑
1249
在线时间
1276 小时
注册时间
2013-1-22
帖子
2246

贵宾

34
 楼主| 发表于 2014-2-6 19:31:59 | 只看该作者
插个楼!普通窗口已经讲完了,接下来该美化菜单了!不过我会先说说场景类基础,希望有哪位好人能够提供一个菜单排版!

点评

窗口坐标随机的排版一定是最好的。。。  发表于 2014-2-6 23:21
回复 支持 反对

使用道具 举报

Lv3.寻梦者

○赛

梦石
0
星屑
1249
在线时间
1276 小时
注册时间
2013-1-22
帖子
2246

贵宾

35
 楼主| 发表于 2014-2-6 19:39:56 | 只看该作者
第十二章  场景类基础

本章咱们来看看场景类(Scene_Xxx)是如何构成的~

场景类可以说是一个容器吧,我们先写好各种窗口(Window_Xxx)、对象(Game_Xxx)然后,这些最后都在场景里集合。

默认的F1帮助已经给出了最最基础的场景类脚本,我们来看看。
  1. class Scene_Xxxx
  2.   def main
  3.     Graphics.transition
  4.     loop do
  5.       Graphics.update
  6.       Input.update
  7.       update
  8.       if $scene != self
  9.         break
  10.       end
  11.     end
  12.     Graphics.freeze
  13.   end
  14.   def update
  15.   end
  16. end
复制代码
这就是一个场景类最原始的状态。

然后,我给这个基础的东西再添加一下。
  1. class Scene_Xxxx
  2.   def main
  3. # ================
  4. # 这里生成窗口等。
  5. # 例:[url=home.php?mod=space&uid=37298]@Window[/url] = Window_Base.new(0,0,90,90)
  6. # ================
  7.     Graphics.transition
  8.     loop do
  9.       Graphics.update
  10.       Input.update
  11.       update
  12.       if $scene != self
  13.         break
  14.       end
  15.     end
  16.     Graphics.freeze
  17. # ----------------------------
  18. # 这里释放一些东西。
  19. # 例:@window.dispose
  20. # ----------------------------
  21.   end
  22.   def update
  23. # 刷新
  24. # 例:@window.update
  25.   end
  26. end
复制代码

评分

参与人数 1星屑 +25 收起 理由
怪蜀黍 + 25 发布奖励

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

○赛

梦石
0
星屑
1249
在线时间
1276 小时
注册时间
2013-1-22
帖子
2246

贵宾

36
 楼主| 发表于 2014-2-7 17:19:03 | 只看该作者
第十三章  解析默认菜单

其实我准备直接出修改菜单来着……但是实在想不出排版……于是先弄个这个。

希望有人能给我个菜单排版啊……………………

不知道又没用讲过new方法,它是Class类的方法,以下摘自F1帮助。

new( ... )
生成并返回类的实例。该方法的参数,包括块参数在内,都会被传给 initialize。


所以xxx = Xxx_Xxx.new是生成实例。

以下是正文部分。

首先,是用class~end定义类,随后,可以看到有一个initialize方法。

因为附带了一个参数,所以调用菜单时需要一个参数。

接下来是主要部分,main方法,场景类必须有main方法。

先看这部分。

    # 生成命令窗口
    s1 = $data_system.words.item
    s2 = $data_system.words.skill
    s3 = $data_system.words.equip
    s4 = "状态"
    s5 = "存档"
    s6 = "结束游戏"
    @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])
    @command_window.index = @menu_index
    # 同伴人数为 0 的情况下
    if $game_party.actors.size == 0
      # 物品、特技、装备、状态无效化
      @command_window.disable_item(0)
      @command_window.disable_item(1)
      @command_window.disable_item(2)
      @command_window.disable_item(3)
    end
    # 禁止存档的情况下
    if $game_system.save_disabled
      # 存档无效
      @command_window.disable_item(4)
    end

一行一行慢慢来。

s1、2、3、4、5、6分别代入字符串,接下来用@command_window这个变量生成Window_Command的实例。

这个160是宽度,翻翻Window_Command就知道了。

然后是index,index是Window_Selectable类的属性,因为Window_Command是Window_Selectable的子类,所以有了这个属性。

再看:$game_party.actors.size这个全局变量代表着队伍人数,$game_party是Game_Party的实例,是在Scene_Title里生成的。

@command_window.disable_item是Window_Command类的方法,用来无效选项。

$game_system是Game_System的实例,找到Game_System,就能看到用attr_accessor定义了几个实例变量,至于实例变量是个什么东西,以后

讲解默认脚本时会提到。这个save_disabled也是那几个变量中的一个。

    # 生成游戏时间窗口
    @playtime_window = Window_PlayTime.new
    @playtime_window.x = 0
    @playtime_window.y = 224
    # 生成步数窗口
    @steps_window = Window_Steps.new
    @steps_window.x = 0
    @steps_window.y = 320
    # 生成金钱窗口
    @gold_window = Window_Gold.new
    @gold_window.x = 0
    @gold_window.y = 416
    # 生成状态窗口
    @status_window = Window_MenuStatus.new
    @status_window.x = 160
    @status_window.y = 0

继续讲解。

这些都是用变量生成实例。x,y是Window类的属性,可以参考F1 里的Window。

这四个窗口也是预先定义好的,从脚本编辑器往上翻翻Window_Xxx的类就能看见,其余几个都没什么可说的,关键是

这个Window_MenuStatus需要好好说说,不过,我们先暂且放一放。

剩下的main里的内容就是我们上次说过的Scene场景类的基础,一定要写。

那些dispose都是释放(消失),如果不释放,那么这些窗口将会一直存在。

然后继续看。

  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @command_window.update
    @playtime_window.update
    @steps_window.update
    @gold_window.update
    @status_window.update
    # 命令窗口被激活的情况下: 调用 update_command
    if @command_window.active
      update_command
      return
    end
    # 状态窗口被激活的情况下: 调用 update_status
    if @status_window.active
      update_status
      return
    end
  end

首先是调用各个窗口的update方法(大都是继承了Window_Base的)。

active也是Window类的属性,表示激活状态。为true则表示激活,为false表示不激活。

什么意思呢?比如说,@command_window的active是false,那么那个一闪一闪的表示被选择项的透明框框就会停止闪动。

然后再看。

  #--------------------------------------------------------------------------
  # ● 刷新画面 (命令窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_command
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换的地图画面
      $scene = Scene_Map.new
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 同伴人数为 0、存档、游戏结束以外的场合
      if $game_party.actors.size == 0 and @command_window.index < 4
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 命令窗口的光标位置分支
      case @command_window.index
      when 0  # 物品
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到物品画面
        $scene = Scene_Item.new
      when 1  # 特技
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 2  # 装备
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 3  # 状态
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 4  # 存档
        # 禁止存档的情况下
        if $game_system.save_disabled
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到存档画面
        $scene = Scene_Save.new
      when 5  # 游戏结束
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到游戏结束画面
        $scene = Scene_End.new
      end
      return
    end
  end

$game_system.se_play都是Game_System里的方法,作用是播放se,$scene = Xxx都是切换场景用的。

return是结束函数(方法?)处理的命令。

case when end是条件分歧语句,不知道的童鞋请看F1默认帮助,我就不信你看不懂条件分歧~

然后继续。

  #--------------------------------------------------------------------------
  # ● 刷新画面 (状态窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_status
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 激活命令窗口
      @command_window.active = true
      @status_window.active = false
      @status_window.index = -1
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 命令窗口的光标位置分支
      case @command_window.index
      when 1  # 特技
        # 本角色的行动限制在 2 以上的情况下
        if $game_party.actors[@status_window.index].restriction >= 2
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到特技画面
        $scene = Scene_Skill.new(@status_window.index)
      when 2  # 装备
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换的装备画面
        $scene = Scene_Equip.new(@status_window.index)
      when 3  # 状态
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到状态画面
        $scene = Scene_Status.new(@status_window.index)
      end
      return
    end
  end

这是角色选择的窗口,@status_window.index就是你选择的角色在$game_party.actors[]里的编号,以此来传递各个Scene类的参数。

恩,本章结束。因为已经解析过Scene_Menu了所以以后解析默认脚本就不会再额外解析Scene_Menu了~

点评

脚本用脚本框  发表于 2014-2-15 14:24

评分

参与人数 1星屑 +125 收起 理由
怪蜀黍 + 125 发布奖励

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

○赛

梦石
0
星屑
1249
在线时间
1276 小时
注册时间
2013-1-22
帖子
2246

贵宾

37
 楼主| 发表于 2014-2-17 19:53:13 | 只看该作者
本帖最后由 天地有正气 于 2014-2-18 19:38 编辑

@protossonny
因为实在是太混乱了,我自己都看不下去了!
所以,请P叔帮忙把所有的教程都删除!我想重新编写!

0.0真神奇啊。
@protosssonny

点评

重新编写可能不会有重复给分哦!吾不删除,汝先重写,写完再说~  发表于 2014-2-18 22:09
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
125
在线时间
152 小时
注册时间
2014-8-23
帖子
135
38
发表于 2014-8-27 13:37:42 | 只看该作者
无效楼层是怎么回事,这篇帖子对我来说很重要啊……
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-27 18:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表