查看: 2194|回复: 4

[已经解决] 【脚本问题】角色制作编辑脚本出了点问题,求解

[复制链接]
梦石
0
星屑
50
在线时间
92 小时
注册时间
2013-2-23
回帖
127
发表于 2014-2-19 04:48:25 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 sh0016 于 2014-2-21 03:47 编辑

下面这脚本是一个非常简单的角色制作编辑脚本。差不多就是DQ9,世界树迷宫等RPG中的创造角色系统那样的感觉。

呼出脚本要用这段:
[pre lang="ruby" line="1"]$act_id = 0
$act_class = 0
$act_name = 0
$act_ini = 5
SceneManager.call(Scene_RecMenu)
Window_RecCommand::init_command_position
Fiber.yield[/pre]

[pre lang="ruby" line="1"]#==============================================================================
# NewClass: Window_RecCommand = 主指令表
#==============================================================================

class Window_RecCommand < Window_MenuCommand
  #--------------------------------------------------------------------------
  # 生成指令列表
  #--------------------------------------------------------------------------
  def make_command_list
    add_main_commands
  end
  #--------------------------------------------------------------------------
  # 添加指令
  #--------------------------------------------------------------------------
  def add_main_commands
    add_command("种族",  :type_imp)
    add_command("形象",  :face_imp)#, type_ok?)
    add_command("职业", :class_imp)#, type_ok?)
    add_command("名字",  :name_imp)#, type_ok?)
    add_command("完成",    :ok_imp)#,  all_ok?)
  end
  #--------------------------------------------------------------------------
  # 获取指令的有效状态
  #--------------------------------------------------------------------------
  def type_ok?
    return false if $act_id == 0
    return true
  end
  #--------------------------------------------------------------------------
  # 获取“完成”指令的有效状态
  #--------------------------------------------------------------------------
  def all_ok?
    return false if $act_id == 0
    return false if $act_class == 0
    return false if $act_name == 0
    return true
  end
  #--------------------------------------------------------------------------
  # 按下取消键时的处理
  #--------------------------------------------------------------------------
  def process_cancel
    $game_actors[6].setup(6)
    $game_actors[7].setup(7)
#~     $game_actors[8].setup(8)
#~     $game_actors[9].setup(9)
    Sound.play_cancel
    Input.update
    deactivate
    call_cancel_handler
  end
end

#==============================================================================
# ■ NewClass: Window_NewActor = 生成角色的状态
#==============================================================================

class Window_NewActor < Window_Base
  #--------------------------------------------------------------------------
  # 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, window_width, fitting_height(10))
    self.opacity = 0
    @actor = nil
    refresh
  end
  #--------------------------------------------------------------------------
  # 获取窗口的宽度
  #--------------------------------------------------------------------------
  def window_width
    return 160
  end
  #--------------------------------------------------------------------------
  # 设置角色
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # 刷新
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    return unless @actor
    draw_item
  end
  #--------------------------------------------------------------------------
  # 绘制项目
  #--------------------------------------------------------------------------
  def draw_item
    lh = line_height
    dw = window_width-28
    dh = fitting_height(10)
    #--
    colour = Color.new(0, 0, 0, translucent_alpha)
    rect = Rect.new(0, 0, dw, dh)
    contents.fill_rect(rect, colour)
    #--
    change_color(system_color)
    draw_text(4, lh*5, dw, line_height, "Name")
    draw_text(4, lh*6, dw, line_height, "Class")
    change_color(normal_color)
    draw_actor_face(@actor, (dw-96)/2, 12)
    draw_actor_name(@actor, 4+dw/2, lh*5, dw)
    draw_actor_class(@actor, 4+dw/2, lh*6, dw)
    #--
    text1 = ""
    text2 = ""
    text3 = ""
    text4 = ""
    case @actor.class_id
      when 11
        text1 = ""
      when 12
        text1 = ""
      when 13
        text1 = ""
    end
    #--
    draw_text(12, lh*7, dw, lh*4, text1)
    draw_text(12, lh*8, dw, lh*4, text2)
    draw_text(12, lh*9, dw, lh*4, text3)
    draw_text(12, lh*10, dw, lh*4, text4)
  end
end

#==============================================================================
# ■ NewClass: Window_TypeCommand = 种族选项
#==============================================================================

class Window_TypeCommand < Window_MenuCommand
  #--------------------------------------------------------------------------
  # 生成指令列表
  #--------------------------------------------------------------------------
  def make_command_list
    add_original_commands
  end
  #--------------------------------------------------------------------------
  # 独自添加指令用
  #--------------------------------------------------------------------------
  def add_original_commands
    add_command("人类/男",   :male)
    add_command("人类/女", :female)
#~     add_command("精灵",    :spirit)
#~     add_command("魔物",   :monster)
  end
end

#==============================================================================
# ■ NewClass: Window_FaceCommand = 形象选项
#==============================================================================

class Window_FaceCommand < Window_MenuCommand
  #--------------------------------------------------------------------------
  # 生成指令列表
  #--------------------------------------------------------------------------
  def make_command_list
    add_original_commands
  end
  #--------------------------------------------------------------------------
  # 独自添加指令用
  #--------------------------------------------------------------------------
  def add_original_commands
    add_command("形象1",  :face1)
    add_command("形象2",  :face2)
    add_command("形象3",  :face3)
    add_command("形象4",  :face4)
    add_command("形象5",  :face5)
    add_command("形象6",  :face6)
    add_command("形象7",  :face7)
    add_command("形象8",  :face8)
  end
end

#==============================================================================
# ■ NewClass: Window_ClassCommand = 职业选项
#==============================================================================

class Window_ClassCommand < Window_MenuCommand
  #--------------------------------------------------------------------------
  # 生成指令列表
  #--------------------------------------------------------------------------
  def make_command_list
    add_original_commands
  end
  #--------------------------------------------------------------------------
  # 独自添加指令用
  #--------------------------------------------------------------------------
  def add_original_commands
    add_command("职业1",  :class1)
    add_command("职业2",  :class2)
    add_command("职业3",  :class3)
    add_command("职业4",  :class4)
  end
end

#==============================================================================
# ■ NewClass: Scene_RecMenu
#==============================================================================

class Scene_RecMenu < Scene_Menu
  #--------------------------------------------------------------------------
  # 开始处理
  #--------------------------------------------------------------------------
  def start
    super
    @actor = $game_actors[$act_ini]
    create_new_window
    create_type_command_window
    create_face_command_window
    create_class_command_window
    @type_command_window.hide
    @face_command_window.hide
    @class_command_window.hide
    @new_window.actor = @actor
    @new_window.refresh
  end
  #--------------------------------------------------------------------------
  # 生成指令窗口
  #--------------------------------------------------------------------------
  def create_command_window
    @command_window = Window_RecCommand.new
    @command_window.set_handler(:type_imp,   method(:command_type_imp))
    @command_window.set_handler(:face_imp,   method(:command_face_imp))
    @command_window.set_handler(:class_imp,  method(:command_class_imp))
    @command_window.set_handler(:name_imp,   method(:command_name_imp))
    @command_window.set_handler(:ok_imp,     method(:command_ok_imp))
    @command_window.set_handler(:cancel,     method(:return_scene))
    @command_window.x = Graphics.width/2 - 60
    @command_window.y = (Graphics.height - @command_window.height) / 2
  end
  #--------------------------------------------------------------------------
  # 生成状态窗口
  #--------------------------------------------------------------------------
  def create_new_window
    @new_window = Window_NewActor.new
    @new_window.actor = @actor
    @new_window.x = 60
    @new_window.y = (Graphics.height - @new_window.height) / 2
  end
  #--------------------------------------------------------------------------
  # 生成选择窗口
  #--------------------------------------------------------------------------
  def create_type_command_window
    @type_command_window = Window_TypeCommand.new
    @type_command_window.x = @command_window.width + @command_window.x
    @type_command_window.y = @command_window.y
  end
  #--------------------------------------------------------------------------
  # 生成选择窗口
  #--------------------------------------------------------------------------
  def create_face_command_window
    @face_command_window = Window_FaceCommand.new
    @face_command_window.x = @command_window.width + @command_window.x
    @face_command_window.y = @command_window.y
  end
  #--------------------------------------------------------------------------
  # 生成选择窗口
  #--------------------------------------------------------------------------
  def create_class_command_window
    @class_command_window = Window_ClassCommand.new
    @class_command_window.x = @command_window.width + @command_window.x
    @class_command_window.y = @command_window.y
  end
  #--------------------------------------------------------------------------
  # 指令
  #--------------------------------------------------------------------------
  def command_type_imp
    @type_command_window.show
    @type_command_window.select(0)
    @type_command_window.activate
    @type_command_window.set_handler(:ok,     method(:on_type_ok))
    @type_command_window.set_handler(:cancel, method(:on_imp_cancel))
  end
  #--------------------------------------------------------------------------
  # 指令
  #--------------------------------------------------------------------------
  def command_face_imp
    @face_command_window.show
    @face_command_window.select(0)
    @face_command_window.activate
    @face_command_window.set_handler(:ok,     method(:on_face_ok))
    @face_command_window.set_handler(:cancel, method(:on_imp_cancel))
  end
  #--------------------------------------------------------------------------
  # 指令
  #--------------------------------------------------------------------------
  def command_class_imp
    @class_command_window.show
    @class_command_window.select(0)
    @class_command_window.activate
    @class_command_window.set_handler(:ok,     method(:on_class_ok))
    @class_command_window.set_handler(:cancel, method(:on_imp_cancel))
  end
  #--------------------------------------------------------------------------
  # 指令
  #--------------------------------------------------------------------------
  def command_name_imp
    $act_ini = @actor.actor_id
    $act_name = 1
    @command_window.refresh
    SceneManager.call(Scene_Name)
    SceneManager.scene.prepare(@actor.actor_id, 6)
  end
  #--------------------------------------------------------------------------
  # 指令“确定”
  #--------------------------------------------------------------------------
  def on_type_ok
    case @type_command_window.current_symbol
      when :male
        @actor = $game_actors[6]
      when :female
        @actor = $game_actors[7]
#~       when :spirit
#~         @actor = $game_actors[8]
#~       when :monster
#~         @actor = $game_actors[9]
    end
    $act_id = 1
    @new_window.actor = @actor
    @new_window.refresh
    @type_command_window.unselect
    @type_command_window.hide
    @command_window.activate
    @command_window.refresh
  end
  #--------------------------------------------------------------------------
  # 指令“确定”
  #--------------------------------------------------------------------------
  def on_face_ok
    #--
    case @face_command_window.current_symbol
      when :face1
        f = 1
      when :face2
        f = 2
      when :face3
        f = 3
      when :face4
      f = 4
      when :face5
        f = 5
      when :face6
        f = 6
      when :face7
        f = 7
      when :face8
        f = 8
    end
    #--
    f += @actor.actor_id * 10
    case f
    # 男性
      when 61
        n = "Actor4"
        i = 4
      when 62
        n = "Actor4"
        i = 0
      when 63
        n = "Actor4"
        i = 2
      when 64
        n = "Actor4"
        i = 6
      when 65
        n = "Actor5"
        i = 0
      when 66
        n = "Actor5"
        i = 2
      when 67
        n = "Actor5"
        i = 4
      when 68
        n = "Actor5"
        i = 6
      # 女性
      when 71
        n = "Actor4"
        i = 5
      when 72
        n = "Actor4"
        i = 1
      when 73
        n = "Actor4"
        i = 3
      when 74
        n = "Actor4"
        i = 7
      when 75
        n = "Actor5"
        i = 1
      when 76
        n = "Actor5"
        i = 3
      when 77
        n = "Actor5"
        i = 5
      when 78
        n = "Actor5"
        i = 7
    end
    #--
#~     @actor = @new_window.actor
    @new_window.actor = @actor
    @actor.set_graphic(n, i, n, i)
    @new_window.refresh
    @face_command_window.unselect
    @face_command_window.hide
    @command_window.activate
  end
  #--------------------------------------------------------------------------
  # 指令“确定”
  #--------------------------------------------------------------------------
  def on_class_ok
    case @class_command_window.current_symbol
      when :class1
        c = 10
      when :class2
        c = 11
      when :class3
        c = 12
      when :class4
        c = 13
      when :class5
        c = 14
      when :class6
        c = 15
      when :class7
        c = 16
      when :class8
        c = 17
    end
#~     c += 10 if @actor.actor_id == 7
    @actor.change_class(c)
    #--
    $act_class = 1
    @new_window.refresh
    @class_command_window.unselect
    @class_command_window.hide
    @command_window.activate
    @command_window.refresh
  end
  #--------------------------------------------------------------------------
  # 指令“取消”
  #--------------------------------------------------------------------------
  def on_imp_cancel
    @type_command_window.unselect
    @type_command_window.hide
    @face_command_window.unselect
    @face_command_window.hide
    @class_command_window.unselect
    @class_command_window.hide
    @command_window.activate
  end
  #--------------------------------------------------------------------------
  # 输入指令
  #--------------------------------------------------------------------------
  def command_ok_imp
    for i in 12...40
      c = i
      break if $game_switches != true
    end
    #--
    $game_switches[c] = true
    actor = $game_actors[c]
    actor.set_graphic(@actor.character_name, @actor.character_index,
      @actor.face_name, @actor.face_index)
    actor.name = @actor.name
    actor.change_class(@actor.class_id)
    $game_party.add_actor(actor.actor_id) #if $game_party.members.size < 4
    #--
    $game_actors[6].setup(6)
    $game_actors[7].setup(7)
#~     $game_actors[8].setup(8)
#~     $game_actors[9].setup(9)
    return_scene
  end
end
[/pre]

基本上是先拿几个当作基础模型的角色,通过选项改名字、头像与职业,再把这写数据写入到一个新的空白角色上,最后让这新角色入队,模型角色则会被初始化。效果大致如下(不包括背景):
Baidu IME_2014-2-19_15-18-50.jpg Baidu IME_2014-2-19_15-20-18.jpg

脚本中(自己)是用6~9号角色当作基础模型,分别只有头像跟行走图显示,目前当作性别的选择处理用。会编辑这4位角色,然后再把编辑资料导入到新空白的角色上(先在数据库里放一个完全空白的ACTOR),空白的判断方式是ID相应的开关是否开启(开=非空白)。完成后会把4位模型角色初始化到原本状态,这样不会留下这次的编辑到下一次制作上。处理方式差不多就是这样。

选项有【种族】【形象】【职业】跟【名字】,最后是【完成】。

【种族】是用来换基础模型用的。
【形象】是选择头像跟行走图。
【职业】顾名思义就是职业。
【名字】会呼出Scene_Name(取名字画面)。
【完成】就是编辑完毕让新角色入队。

问题就是主菜单那里(RecCommand)如果没有选择第一个选项【种族】,其他选项就无法起效,完全不懂为什么。。。。
Baidu IME_2014-2-19_15-19-8.jpg Baidu IME_2014-2-19_15-19-35.jpg
像这样其他选项可以打开选择窗口,但这些窗口中的选项无法确认,只能听到确认键的声效,毫无反应。。。。(可以cancel)
本来应该是更改选项(更新左边的窗口中的脸图或职业显示),然后关闭(隐藏)。。。。

只有先选择第一个选项的【种族】,然后回到主菜单里(无论是ok还是cancel),其他的选项就有正常反应了。。。。。
有试过用选项限制,只有先选择【种族】后才会开放下面的选项,差不多是这个样子: Baidu IME_2014-2-19_15-17-17.jpg
这样要先选择【种族】才能继续编辑其他,可以回避这个问题。。。。但从取名字的Scene_Name回来之后,会让这问题重新跳出来。。。。

真心求解决办法m(_ _)m。

此外,还有个问题是没办法在Command里面用@actor,会变成nilclass,同样原因不明。。。。(←自己再试试好了
最后请允许我奢求select_last的用法与写法m(_ _)m  


如果有哪里写的不清楚请喷出来。   

点评

用事件做不就得了,而且简单!  发表于 2014-2-19 21:37
梦想是成为触手的新手DE☆SU(<ゝω·)绮罗星 ~☆
梦石
0
星屑
50
在线时间
92 小时
注册时间
2013-2-23
回帖
127
 楼主| 发表于 2014-2-19 21:47:39 | 显示全部楼层
@345912390  用事件很不美观,而且各种内部处理比较麻烦(←全力作死中
梦想是成为触手的新手DE☆SU(<ゝω·)绮罗星 ~☆
回复

使用道具 举报

梦石
0
星屑
3348
在线时间
1120 小时
注册时间
2009-4-15
回帖
761
发表于 2014-2-19 22:06:06 | 显示全部楼层
第一个问题没看明白,所以不说话
第二个问题,你想在Command里用@actor可以,在Scene里初始化Command的时候将Scene的@actor传递给Command就可以了啊

点评

也是。。。。去重写下  发表于 2014-2-19 22:22
回复

使用道具 举报

梦石
0
星屑
1398
在线时间
989 小时
注册时间
2011-5-11
回帖
418
发表于 2014-2-20 11:32:34 | 显示全部楼层
其实你可以把【种族】做成一个卡片式的List。选择某一项后就可以下一步【形象】》》【职业】》》【名字】》》【完成】。
这就像普通的“傻瓜式”程序安装一样,下一步>>下一步>>下一步>>直到完成不就得了!
这样做可以做到【种族】【形象】【职业】都可以做成卡片式的List,这样玩家可以清楚的明白每个页面每个选项是不是自己所需要的!
如果只是你上图那样的话,还不如用事件做,简单!

点评

1)卡片式选项可以做参考 2)已经说过了内部处理很麻烦,如果你粗略看下应该就你明白我指什么了。 3)这是脚本练习,用事件有意义?  发表于 2014-2-20 22:00
http://rpg.blue/static/image/smiley/yct/A059.gif中国字认识都不到一半,哪的心情学英语呀!
回复

使用道具 举报

梦石
0
星屑
50
在线时间
92 小时
注册时间
2013-2-23
回帖
127
 楼主| 发表于 2014-2-21 03:46:46 | 显示全部楼层
此问题以解决,感谢大家的回复(→ →)
梦想是成为触手的新手DE☆SU(<ゝω·)绮罗星 ~☆
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部