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

Project1

 找回密码
 注册会员
搜索
查看: 9851|回复: 36
打印 上一主题 下一主题

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

[复制链接]

Lv3.寻梦者

○赛

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

贵宾

跳转到指定楼层
发表于 2013-12-27 09:10:21 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 天地有正气 于 2014-2-17 19:59 编辑

实在太乱了!!!!
我决定重新排版!!!!!

所有教程都拜托P叔删除了,接下来我将重新写一篇!

预计:

改写脚本篇

第一章 标题画面
这一章实现:在标题画面下增加选项,移动位置,点击选项后显示图片。

第二章 菜单画面
这一章实现:新的菜单画面。

第三章 对话窗口
这一章实现:添加新的对话框功能。

动手实践篇

第一章 地图名显示
这一章实现:各种地图名效果。

第二章 人物介绍窗口
这一章实现:自行编写一个状态窗口。

第三章 自己的菜单
这一章实现:重新编写菜单脚本。

第四章 技能书脚本
这一章实现:编写技能书脚本。

第五章 敌人等级系统
这一章实现:给敌人附带等级。

其他的我就不再列出了,毕竟现在一章也没写呢!不过我保证,一定会努力、认真的写的!

但是、更新速度、、不敢保证太快。

text.jpg (111.8 KB, 下载次数: 22)

text.jpg

评分

参与人数 6星屑 +704 梦石 +1 收起 理由
Sion + 300 感谢分享
存档不能 + 20 精品文章
guoyq1988 + 12 年末比较忙,先收藏了,有空再看.
kuerlulu + 12 鼓励..
丰聪耳神子 + 10 精神鼓励
怪蜀黍 + 350 + 1 发布奖励

查看全部评分

Lv1.梦旅人

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

使用道具 举报

Lv3.寻梦者

○赛

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

贵宾

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

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

0.0真神奇啊。
@protosssonny
回复 支持 反对

使用道具 举报

Lv3.寻梦者

○赛

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

贵宾

34
 楼主| 发表于 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了~

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

○赛

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

贵宾

33
 楼主| 发表于 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

贵宾

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

使用道具 举报

Lv2.观梦者

故九江太守

梦石
0
星屑
612
在线时间
2167 小时
注册时间
2012-12-5
帖子
4464
31
发表于 2014-2-3 00:39:12 | 只看该作者
一讲能写长点么……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

使用道具 举报

Lv3.寻梦者

○赛

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

贵宾

29
 楼主| 发表于 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 发布奖励

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

○赛

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

贵宾

28
 楼主| 发表于 2014-2-2 09:29:41 | 只看该作者
第十章  如何创建一个窗口4

这次来说说如何在窗口中显示图标什么的。
rect
取得位图的矩形(Rect)。

blt(x, y, src_bitmap, src_rect[, opacity])
传送 src_bitmap 的矩形 src_rect(Rect)到该位图的座标(x,y)。

opacity 指定其不透明度,范围为 0 ~ 255。

这是F1帮助手册里的内容。我来简单解释一下,为什么要有个“矩形”。
比如说,一张标题图片是640*480,而矩形就是它的显示范围,如果矩形是120*120,那就只会显示120*120的图片。

上一次不是显示了个角色姓名吗?这一次就加一个图标。
self.contents.blt(66,0,Bitmap.new("001-Weapon01"),Rect.new(0,0,24,24))
我们来解释一下。
66是X坐标,0是Y坐标,Bitmap.new就是一个实例,显示图片,Rect.new是矩形的实例,从图标的x0,y0位置也就是左上角开始,截取24*24的像素。

大家运行一下试试看吧。

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

○赛

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

贵宾

27
 楼主| 发表于 2014-2-1 22:10:38 | 只看该作者
第九章  创建第一个窗口3

这一节主要是讲上一次是如何得出那个66的 = = 刚刚发现和66rpg的66一样..好吉利 = =

大家可以打开帮助,找到Bitmap,看到最后面有一个方法。
  1. text_size(str)
  2. 取得以 draw_text 方法描绘字符串 str 的矩形(Rect)。但是,不包含斜体的部分。
复制代码
我就是用这个方法得到的..

用法一:在开始游戏之前临时建立一个Bitmap类的实例,调用该方法得到宽度。
代码:
text = Bitmap.new(1,1).text_size("新手村").width
p text
exit
临时建立一个宽1长1的Bitmap,调用方法。

用法二:在窗口里使用该方法。
代码:
def refresh
    self.contents.clear
    w = self.contents.text_size("新手村").width
    draw_text(0,0,w,22,"新手村")
end

用法三(重点):
在draw_text(x,y,width,height)后面,有
draw_text(rect, str[, align])

这里用到了Rect类(矩形),可以直接利用text_size获得矩形。
代码:
w = self.contents.text_size("新手村")
draw_text(w,"新手村")

好了,上面那些纯属非重点,重点从这里开始 = =

既然“新手村”是不会变的,那么为什么要反复描绘呢?
我们现在就要让它“变”起来,我们要将“新手村”换成当前队伍里一号角色的名字
首先介绍一个非常有用的东西,内嵌表达式
在F1帮助里也有,就是可以在字符串里以“#{变量名}”的方式代入变量。
于是可以得到下面的东西。
  1. def refresh
  2.     self.contents.clear
  3.     @name = $game_party.actors[0].name # 变量@name代入一号角色名字
  4.     self.contents.draw_text(0,0,text_size(@name).width,text_size(@name).height,"#{@name}")
  5. end
复制代码
好了,本章结束 = = 由于本章未经测试,可能有误,欢迎批评指正!我会塞最大的糖表示感谢(虽然只有30)!

评分

参与人数 1梦石 +1 收起 理由
怪蜀黍 + 1 发布奖励

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-26 01:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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