查看: 6115|回复: 8

[RMVA发布] 【教程向】小优教你扩充装备栏+换装系统(更新到Step3)

[复制链接]
梦石
0
星屑
1032
在线时间
145 小时
注册时间
2013-10-16
回帖
254
发表于 2015-2-23 10:31:11 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 rpg-sheep 于 2015-2-24 07:51 编辑

由于word版式问题,目前正在更新......


效果预览:

0-1

0-1


看到这么炫的界面,你是不是也心动了呢?别急,小优来教你如何制作红色框框里的界面~
【某小白】我没有脚本基础怎么办呢?(⊙o⊙)?
【小优】你有小学六年级的语数英还有电脑基础就行~还需要一定PS基础。↖(^ω^)↗
【某伸手党】哎呀,我要做红框框以外的部分!!o(>﹏<)o
【小优】不教~保密(我会告诉你原理差不多么)O(∩_∩)O
【某大神】你太弱了。╭∩╮(︶︿︶)╭∩╮
【小优】……(#‵′)凸
那么小优将会如何写这篇教程呢?
*代码少,思路多
*教你如何偷懒(不会偷懒的程序员不是好程序员=w=)

[fold=Step1:“抄袭”(已完成)]

Step1:“抄袭”

【某小白】小优!!你不教我们真知识,先教这个干什么?
偷懒儿~~

【小优】别急,先看我怎么抄。新建工程什么的就不用说了吧~你需要把RM原来的这五个脚本从上面复制过来。注意:是复制,不是在原先的地方改。(对小白说:)RM的def会重新定义方法,不用担心冲突哦~

1-1

1-1

之后,把main里面的rgss_main { SceneManager.run }改为
[pre lang="ruby"]rgss_main { Font.default_name = "方正卡通简体"
            Graphics.resize_screen(640, 480)
            SceneManager.run }[/pre]
【某小白】为什么先做这些设置?
【小优】一开始就要决定好字体和屏幕大小,因为后面的一些细节都需要和字体匹配,如果最后再改会非常麻烦的!(我改的640*480,分辨率和字体可以随意改的~)
[/fold]

[fold=Step2:脱离RM原脚本并加入菜单(已完成)]

Step2:脱离RM原脚本并加入菜单

复制完后,我们需要做脱离,原因是防止与RM原脚本冲突。
第一步:把所有的Equip(红框部分)都改成其他的,我改的是Cloth。

2-1

2-1

然后要特别注意的是Scene_Cloth里面有很多生成新窗口的部分,都要改过来(不止这三个)

2-2

2-2

第二步:加入菜单
提前将场景加入菜单是为了方便调试。
把上面的Window_MenuCommand和Scene_Menu复制过来。
首先从Window_MenuCommand中找到这一句。

2-3

2-3

把其他的都删了。然后重定义方法(防冲突)并且加上你的command。
一般的command有三个参数,第一个是显示的名字,第二个是交互用,第三个是有效状态。
第二个参数后面会提到。有效状态指是否禁用,比如禁用存档什么的。

2-4

2-4

来到Scene_Menu找到这一句

2-5

2-5

同样是删掉其他部分,重定义方法,新建指令“试衣间”。注意相同颜色的地方名字要一致。

2-6

2-6

运行游戏。如果进入菜单出现左图,进入试衣间出现右图,并且未报错,那么恭喜你改对了~

2-7

2-7

2-8

2-8

至此第二步就完成喽~
[/fold]

[fold=Step3:修改窗口(已完成)]

Step3:修改窗口

从这一步开始,小优主要提供思路~
加入了菜单,看到了自己“抄袭”的成果,是不是有些小激动呢?别急,作为一个程序员,可不能只靠抄袭。所有复制过来的内容,最后有90%是需要修改的!你可以放心的打上“原创”喽!
修改窗口位置之前,你需要先想好自己的窗口是什么样子的。
左图就是小优范例窗口的样式哦,如果你想要做右图,当然没问题!

3-1

3-1

下一步是分解窗口,把你的排版想法分解组合成一个个RM的窗口。

3-2

3-2

确定了如何使用窗口,下一步是匹配窗口,即用什么窗口显示什么。确定了目的,我们就好改了。
如何确定用什么RM窗口显示你想要的窗口?
偷懒儿~~

建议观察以下四处。
1.超类(蓝色部分)。涉及到选择的通常超类为Window_Selectable会更省事,而不涉及选项的,通常超类为Window_Base会更方便。
2.实例变量(天蓝色部分),有一些已经帮你定义好的实例变量。他们决定窗口之间的关系。比如这个例子,Window_ClothSlot可以控制status_window和item_window。
3.描述(紫色部分)你可以了解这个窗口是干什么用的

3-3

3-3

4.初始化对象。如果里面有@actor对于显示角色会很方便的

3-4

3-4

根据以上想法,我做出了如下匹配。

3-5

3-5

之后就是简单地更改窗口位置以及大小啦~这就不用我多说了吧?
[/fold]

[fold=Tip1:实现各种操作方式的方法(等待编辑)]

实现各种操作方式的方法

[/fold]

[fold=Tip2:友好的操作界面(已完成)]

友好的操作界面

小优也一直在思考如何让操作界面更友好的问题,毕竟操作界面的友好程度决定了玩家是否愿意去玩。我觉得以下几个做法可以提高界面的友好程度:
1.颜色不要太亮,伤眼睛
2.界面不要太复杂。太复杂的话,玩家找不到哪里是哪里,会晕的
3.操作尽可能简洁,例如上面的例子中,只使用上下左右键更换装备。这样比RM原来的使用确定键和后退键的方法省了一半时间,细节处理是非常重要的~
[/fold]

[fold=Step4:扩充装备栏(编辑中)]

Step4:扩充装备栏

大家都知道,RM默认仅有5个装备栏。可是有些游戏需要6个甚至更多,怎么办?
方法一:
偷懒儿~~
看红色部分,这个决定了只有5个装备栏。
果断废掉!!!!!为了偷懒我不要了。
[/fold]

[fold=Step5:加入换装系统(等待更新)]

Step5:加入换装系统

[/fold]

[fold=Tip3:有没有想过这个问题?(等待更新)]

有没有想过这个问题?

[/fold]
开心咸鱼每一天~
梦石
10
星屑
5748
在线时间
1849 小时
注册时间
2013-2-14
回帖
327

开拓者

发表于 2015-2-23 19:44:10 | 显示全部楼层
学习中。。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
37 小时
注册时间
2013-7-27
回帖
5
发表于 2015-2-28 21:32:52 | 显示全部楼层
VA的立绘换装帖子基本找不到呀。。。楼主救星~ 赞一个……(当惯了伸手党之后的痛……)
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2015-3-6 22:07:36 | 显示全部楼层
Step4:扩充装备栏
大家都知道,RM默认仅有5个装备栏。可是有些游戏需要6个甚至更多,怎么办?
方法一:
偷懒儿~~
看红色部分,这个决定了只有5个装备栏。
果断废掉!!!!!为了偷懒我不要了。

编辑中里面是一段说明···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
117
在线时间
35 小时
注册时间
2014-4-21
回帖
4
发表于 2015-3-19 23:34:19 | 显示全部楼层
本帖最后由 nevets 于 2015-3-19 23:49 编辑

关于扩展装备slot,这里是我的一个解决方案,理论上可以插入任意数量的slot,只要在一开始slot名称定义数组里加进去就能自动识别。不过有个问题没解决,就是在装备列表里,超出画面的项就不会画出来,是个系统原来就没考虑的小bug,尚未解决,其他都OK了。

ps。话说楼主还真是懒啊,开个贴,把我拉进这个坑,看到关键地方,居然说偷个懒就糊弄过去了。。。我那个都那个了你就给我看这个?

[pre lang="ruby"]#这里是我的一个解决方案,理论上可以插入任意数量的slot,
#只要在一开始slot名称定义数组里加进去就能自动识别。
#不过有个问题没解决,就是在装备列表里,超出画面的项就不会画出来,
#是个系统原来就没考虑的小bug,尚未解决,其他都OK了。

#使用方法:在数据库中装备的note里,加入这么一行:“<装备位置 x>”,
#其中x就是装备的slot id,这个id就是Vocab::ESlots数组里的序号。


module Vocab
  # 替换系统装备部位,随意增加多少个都行
  ESlots = ["0武器",
            "1盾牌",
            "2头盔",
            "3铠甲",
            "4饰品",
            "5外套",
            "6裤子",
            "7内衣",
            "8内裤",
            "9鞋子"
  ]
end

module DataManager
  #--------------------------------------------------------------------------
  # ● 修改$data_armors
  #--------------------------------------------------------------------------
  def self.modify_data_armors
    $data_armors.each_with_index {|armor,index|
      if armor
        armor.note =~ /<装备位置\W*\s+(\d+)>/
        armor.etype_id = $1.to_i if $1
      end
   
    }
  end
  #--------------------------------------------------------------------------
  # ● 修改self.init
  #--------------------------------------------------------------------------
  def self.init
    @last_savefile_index = 0
    load_database
    create_game_objects
    setup_battle_test if $BTEST
    modify_data_armors # 修改数据
  end
end

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 获取装备栏的数组
  #--------------------------------------------------------------------------
  def equip_slots
    return Array.new(Vocab::ESlots.size) {|i| i==1 ? 0 : i} if dual_wield? # 双持武器
    return Array.new(Vocab::ESlots.size) {|i| i} # 普通
  end
end


class Window_EquipSlot < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 获取列数
  #--------------------------------------------------------------------------
  def col_max
    return 2
  end
  #--------------------------------------------------------------------------
  # ● 获取项目数
  #--------------------------------------------------------------------------
  def item_max
    return (get_item_slots.size)
  end
  #--------------------------------------------------------------------------
  # ● 获取装备slot数组(跳过不可装备的slot)
  #--------------------------------------------------------------------------
  def get_item_slots
    arr = []
    if @actor
      for i in (0..@actor.equip_slots.size-1)
        if enable?(i);  arr.push(i);  end
      end
    end #if @actor
    return arr
  end
  #--------------------------------------------------------------------------
  # ● 获取装备栏的名字
  #--------------------------------------------------------------------------
  def slot_name(index)
    if @actor
      return Vocab::ESlots[index]
    else; return ""
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制所有项目
  #--------------------------------------------------------------------------
  def draw_all_items
    return unless @actor
    item_max.times {|index|
      i = get_item_slots[index]
      rect = item_rect_for_text(index)
#~       draw_icon(168, rect.x, rect.y) #画slot的图标
      change_color(system_color)
      draw_text(rect.x, rect.y, 48, line_height, slot_name(i)) #写slot名称
      draw_item_name(@actor.equips, rect.x + 48, rect.y) #画装备的item
    }
  end
end
[/pre]
回复

使用道具 举报

无限の剣制

梦石
0
星屑
10445
在线时间
5019 小时
注册时间
2013-2-28
回帖
4942

开拓者贵宾

发表于 2015-3-20 09:38:48 | 显示全部楼层
nevets 发表于 2015-3-19 23:34
关于扩展装备slot,这里是我的一个解决方案,理论上可以插入任意数量的slot,只要在一开始slot名称定义数组 ...

这个问题还是很好解决的,在生成已装备列表窗口时重新生成一下窗口内容contents就好了,比如
  1. class Scene_Equip < Scene_MenuBase
  2.   #--------------------------------------------------------------------------
  3.   # ● 生成装备栏窗口
  4.   #--------------------------------------------------------------------------
  5.   alias slot_vip_create_slot_window create_slot_window
  6.   def create_slot_window
  7.     slot_vip_create_slot_window
  8.     @slot_window.create_contents
  9.     @slot_window.refresh
  10.   end
  11. end
复制代码
具体可以参考这个脚本里面的处理
https://rpg.blue/thread-371391-1-1.html
回复

使用道具 举报

梦石
0
星屑
117
在线时间
35 小时
注册时间
2014-4-21
回帖
4
发表于 2015-3-20 23:12:47 | 显示全部楼层
VIPArcher 发表于 2015-3-20 09:38
这个问题还是很好解决的,在生成已装备列表窗口时重新生成一下窗口内容contents就好了,比如具体可以参考 ...


可能我前面对问题的描述不太清楚,实际上我是这样解决这个问题的:
改掉这一段:
[pre lang="ruby"]class Window_Selectable < Window_Base
  def refresh
    create_contents     #这里本来是contents.dispose。但dispose并不改变contents的位图大小。所以需要create_contents,重新定义位图大小。改好了以后所有可能出现的类似问题全部解决了。
    draw_all_items
  end
end
[/pre]

评分

参与人数 1星屑 +100 收起 理由
VIPArcher + 100 我很赞同

查看全部评分

回复

使用道具 举报

梦石
3
星屑
75
在线时间
200 小时
注册时间
2008-7-8
回帖
145
发表于 2015-8-8 12:22:32 | 显示全部楼层
马克!虽然看来看去还是略难懂
回复

使用道具 举报

梦石
3
星屑
75
在线时间
200 小时
注册时间
2008-7-8
回帖
145
发表于 2015-8-8 17:58:07 | 显示全部楼层
经过测试发现了一个小问题
按理来说这种换装选项应该是与装备选项平行的一个概念,因而在handler关联的方法上应该跟equip一样是:command_personal
并且把对Scene_Cloth的调用放到on_personal_ok这个方法内部的判断中

这样才能让按完菜单按钮后先选择人物再进入界面
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部