Project1
标题:
请教一个关于制作新菜单的问题~
[打印本页]
作者:
egnas
时间:
2008-7-25 06:53
标题:
请教一个关于制作新菜单的问题~
想设计这么个菜单:
可以把物品栏里的任何一个东西给予某NPC。
效果是1、选择给予物品后出现一个物品菜单(和主菜单里的物品菜单一样)
2、选中某个物品后直接返回地图,出现该NPC的不同反应。
3、给予时可以增加给予量。
目前要解决的问题:
1、不知道如何在Scene_Item.new的基础上改出【样式和Scene_Item.new一样,但是确定某物品时不会出现目标窗口的菜单】
2、如何实现NPC在我点选了相应的物品后作出相应的反应?比如我点选了治疗水给他,返回地图时他会说“啊谢谢。”
谢谢各位。
作者:
凌冰
时间:
2008-7-25 09:37
用物品调用公共事件
另外$scene = Scene_Item.new召唤物品窗口
作者:
egnas
时间:
2008-7-25 17:03
厄,可能LS没看清楚我的说明。
我的意思是同样的物品,比如治疗水,在$scene = Scene_Item.new中使用的效果是恢复队伍中某人的HP,但是在给予菜单中(先记为Scene_Item111.new)中呢,使用后则返回地图,然后显示作用NPC的反应,不知道这么说明白不。
两个菜单相同点是样式完全相同,你身上有什么物品那么给予菜单中同样如此。
不同的就是点选某物品后出现的情况不一样的。
LS说的调用公共事件,那么无论对于Scene_Item还是Scene_Item111出现的都是相同的情况——都是调用某公共事件。
作者:
灯笼菜刀王
时间:
2008-7-25 19:52
你可以先设置一个开关,调用Scene_Item111的时候打开
然后在每个可以给NPC的物品都调用公共事件,然后分歧,当XX开关打开的时候。写上你想要的反映,开关关着的时候,就是正常的使用,也就是调用Scene_Item开关关上。
当然,判断NPC是不是在附近以及是不是你想要找的NPC等也可以写在公共事件内。
作者:
egnas
时间:
2008-7-25 21:12
我试过这种方法,但存在一个问题,就是无论此开关是否打开,既公共事件是否调用,该物品都会被【使用】!
举个例子,正常使用恢复药,选中它后会出现目标窗口,既给谁喝。
带上公共事件后,选种它后仍然是先出现目标窗口→判断给谁喝→物品消耗→然后才是触发公共事件。
也就是说,用开关的方法是没办法避开“出现目标窗口→判断给谁喝→物品消耗”这一段。
而想实现的效果是选中该物品后直接返回地图调用公共事件,这点也是Scene_Item111和Scene_Item不同的地方。而过后物品是否消耗则在事件中作出判定。
作者:
小闵
时间:
2008-7-25 21:23
複雜,偶不會,不過也頂上去,讓多點人來幫助LZ。{/tp}
作者:
灯笼菜刀王
时间:
2008-7-25 22:32
$送礼开关 = 1
class Scene_Item2
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
# 生成帮助窗口、物品窗口
@help_window = Window_Help.new
@item_window = Window_Item.new
# 关联帮助窗口
@item_window.help_window = @help_window
# 执行过度
Graphics.transition
# 主循环
loop do
# 刷新游戏画面
Graphics.update
# 刷新输入信息
Input.update
# 刷新画面
update
# 如果画面切换就中断循环
if $scene != self
break
end
end
# 装备过渡
Graphics.freeze
# 释放窗口
@help_window.dispose
@item_window.dispose
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
# 刷新窗口
@help_window.update
@item_window.update
# 物品窗口被激活的情况下: 调用 update_item
if @item_window.active
update_item
return
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 (物品窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_item
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 切换到菜单画面
$scene = Scene_Menu.new(0)
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 获取物品窗口当前选中的物品数据
@item = @item_window.item
# 不使用物品的情况下
unless @item.is_a?(RPG::Item)
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 不能使用的情况下
unless $game_party.item_can_use?(@item.id)
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 效果范围是我方的情况下
# 公共事件 ID 有效的情况下
if @item.common_event_id > 0
$game_switches[$送礼开关] = true
# 预约调用公共事件
$game_temp.common_event_id = @item.common_event_id
# 演奏物品使用时的 SE
$game_system.se_play(@item.menu_se)
# 消耗品的情况下
if @item.consumable
# 使用的物品数减 1
$game_party.lose_item(@item.id, 1)
# 再描绘物品窗口的项目
@item_window.draw_item(@item_window.index)
end
# 切换到地图画面
$scene = Scene_Map.new
return
end
return
end
end
#--------------------------------------------------------------------------
# ● 刷新画面 (目标窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_target
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 由于物品用完而不能使用的场合
unless $game_party.item_can_use?(@item.id)
# 再次生成物品窗口的内容
@item_window.refresh
end
# 删除目标窗口
@item_window.active = true
@target_window.visible = false
@target_window.active = false
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 如果物品用完的情况下
if $game_party.item_number(@item.id) == 0
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 使用物品的情况下
if used
# 演奏物品使用时的 SE
$game_system.se_play(@item.menu_se)
# 消耗品的情况下
if @item.consumable
# 使用的物品数减 1
$game_party.lose_item(@item.id, 1)
# 再描绘物品窗口的项目
@item_window.draw_item(@item_window.index)
end
# 再生成目标窗口的内容
@target_window.refresh
# 全灭的情况下
if $game_party.all_dead?
# 切换到游戏结束画面
$scene = Scene_Gameover.new
return
end
# 公共事件 ID 有效的情况下
if @item.common_event_id > 0
# 预约调用公共事件
$game_temp.common_event_id = @item.common_event_id
# 切换到地图画面
$scene = Scene_Map.new
return
end
end
# 无法使用物品的情况下
unless used
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
end
return
end
end
end
class Scene_Menu
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
$game_switches[$送礼开关] = false
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
复制代码
送礼的脚本- -,要调用的时候就用$scene = Scene_Item2.new 然后 根据我上面说的,用开关判断是不是对NPC使用,默认开关是1号。要换别的开关就在脚本最上面的 送礼开关那把开关编号写上就行了。
使用的时候要注意,这个版本为未测试版-v- 使用前请备份工程。
作者:
egnas
时间:
2008-7-25 23:14
行了,终于可以避开目标选单了!!谢谢你了,谢谢大家了。
如、如果可以的话,这个话题可以继续延伸下去么???
比如……如果我要给NPC一个武器或者护甲怎么办?系统规定装备是不能“使用”的啊……
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1