查看: 4537|回复: 12

[已经解决] 按照论坛的帖子制作Scene_menu的背景,但是始终不成功

[复制链接]
梦石
0
星屑
50
在线时间
57 小时
注册时间
2012-9-1
回帖
24
发表于 2013-3-29 17:12:41 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 huhumaru 于 2013-3-30 11:54 编辑

(工程下载地址在最后)
如题,我是按照这个帖子http://rpg.blue/thread-226400-1-1.html 最后的部分来制作背景的。
我想达到的效果是,最下面一层是游戏进行中的画面,也就是Scene_MenuBase脚本的第29行调用的@background_sprite.bitmap = SceneManager.background_bitmap 这个画面

然后在这一层的上面新建一层,调用一张PNG图片,

最上面才是各个窗口。

我按照教程里把以下这段代码粘贴到Scene_Menu里面,
[pre lang="ruby" line="1"]class Window_background < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 544,416)
    self.opacity = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    bitmap = Cache.load_bitmap("Graphics/System/","Menubackground")
    rect = Rect.new(0, 0, 544,416)   
    contents.blt(0,0, bitmap, rect, 255)
    bitmap.dispose
  end
end[/pre]
然后命名为Menubackground的PNG图片也放到对应的System文件夹下了,但是始终这张图片显示不出来。

求高人指点一下到底问题出在哪里。


我的Scene_Menu的代码如下:
[pre lang="ruby" line="1"]#encoding:utf-8
#==============================================================================
# ■ Scene_Menu
#------------------------------------------------------------------------------
#  菜单画面
#==============================================================================

class Window_background < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 544,416)
    self.opacity = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    bitmap = Cache.load_bitmap("Graphics/System/","Menubackground")
    rect = Rect.new(0, 0, 544,416)   
    contents.blt(0,0, bitmap, rect, 255)
    bitmap.dispose
  end
end

class Scene_Menu < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  def start
    super
    create_command_window
    create_gold_window
    create_status_window
    create_MenuHelp_window
  end
  #--------------------------------------------------------------------------
  # ● 生成帮助窗口
  #--------------------------------------------------------------------------
  def create_MenuHelp_window
    @Menuhelp_window = Window_MenuHelp.new
    @Menuhelp_window.x = 0
    @Menuhelp_window.y = 0
  end
  #--------------------------------------------------------------------------
  # ● 生成指令窗口
  #--------------------------------------------------------------------------
  def create_command_window
    @command_window = Window_MenuCommand.new
    @command_window.x = 0
    @command_window.y = 48
    @command_window.set_handler(:item,      method(:command_item))
    @command_window.set_handler(:skill,     method(:command_personal))
    @command_window.set_handler(:equip,     method(:command_personal))
    @command_window.set_handler(:status,    method(:command_personal))
    @command_window.set_handler(:formation, method(:command_formation))
    @command_window.set_handler(:save,      method(:command_save))
    @command_window.set_handler(:game_end,  method(:command_game_end))
    @command_window.set_handler(:cancel,    method(:return_scene))
  end
  #--------------------------------------------------------------------------
  # ● 生成金钱窗口
  #--------------------------------------------------------------------------
  def create_gold_window
    @gold_window = Window_Gold.new
    @gold_window.x = 0
    @gold_window.y = Graphics.height - @gold_window.height
  end
  #--------------------------------------------------------------------------
  # ● 生成状态窗口
  #--------------------------------------------------------------------------
  def create_status_window
    #@status_window = Window_MenuStatus.new(@command_window.width, 0)
    @status_window = Window_MenuStatus.new(@command_window.width, 48)
  end
  #--------------------------------------------------------------------------
  # ● 指令“物品”
  #--------------------------------------------------------------------------
  def command_item
    SceneManager.call(Scene_Item)
  end
  #--------------------------------------------------------------------------
  # ● 指令“技能”“装备”“状态”
  #--------------------------------------------------------------------------
  def command_personal
    @status_window.select_last
    @status_window.activate
    @status_window.set_handler(:ok,     method(:on_personal_ok))
    @status_window.set_handler(:cancel, method(:on_personal_cancel))
  end
  #--------------------------------------------------------------------------
  # ● 指令“整队”
  #--------------------------------------------------------------------------
  def command_formation
    @status_window.select_last
    @status_window.activate
    @status_window.set_handler(:ok,     method(:on_formation_ok))
    @status_window.set_handler(:cancel, method(:on_formation_cancel))
  end
  #--------------------------------------------------------------------------
  # ● 指令“存档”
  #--------------------------------------------------------------------------
  def command_save
    SceneManager.call(Scene_Save)
  end
  #--------------------------------------------------------------------------
  # ● 指令“结束游戏”
  #--------------------------------------------------------------------------
  def command_game_end
    SceneManager.call(Scene_End)
  end
  #--------------------------------------------------------------------------
  # ● 个人指令“确定”
  #--------------------------------------------------------------------------
  def on_personal_ok
    case @command_window.current_symbol
    when :skill
      SceneManager.call(Scene_Skill)
    when :equip
      SceneManager.call(Scene_Equip)
    when :status
      SceneManager.call(Scene_Status)
    end
  end
  #--------------------------------------------------------------------------
  # ● 个人指令“取消”
  #--------------------------------------------------------------------------
  def on_personal_cancel
    @status_window.unselect
    @command_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 整队“确定”
  #--------------------------------------------------------------------------
  def on_formation_ok
    if @status_window.pending_index >= 0
      $game_party.swap_order(@status_window.index,
                             @status_window.pending_index)
      @status_window.pending_index = -1
      @status_window.redraw_item(@status_window.index)
    else
      @status_window.pending_index = @status_window.index
    end
    @status_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 整队“取消”
  #--------------------------------------------------------------------------
  def on_formation_cancel
    if @status_window.pending_index >= 0
      @status_window.pending_index = -1
      @status_window.activate
    else
      @status_window.unselect
      @command_window.activate
    end
  end
end

[/pre]

工程下载地址:ht(防止和谐)tp://dl.vmall.com/c0dddka961
梦石
0
星屑
200
在线时间
120 小时
注册时间
2007-8-17
回帖
128
发表于 2013-3-29 17:25:09 | 显示全部楼层
自家论坛的地址和谐什么啊   麻烦你恢复下
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-3-29 20:29:25 | 显示全部楼层
除了修改这段语句外你的游戏中还有没有添加了什么其他的菜单扩展脚本?

建议把工程发上来……
回复

使用道具 举报

梦石
0
星屑
50
在线时间
57 小时
注册时间
2012-9-1
回帖
24
 楼主| 发表于 2013-3-29 21:10:00 | 显示全部楼层
喵呜喵5 发表于 2013-3-29 20:29
除了修改这段语句外你的游戏中还有没有添加了什么其他的菜单扩展脚本?

建议把工程发上来…… ...

求帮助,我已经把工程传上来啦~~~~
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-3-29 21:47:35 | 显示全部楼层
Scene_MenuBase第29、30行:
@background_sprite.bitmap = SceneManager.background_bitmap
@background_sprite.color.set(16, 16, 16, 128)
改成:
@background_sprite.bitmap = Cache.system("Menubackground")
@background_sprite.color.set(0, 0, 0, 0)

TM截图未命名.png
回复

使用道具 举报

梦石
0
星屑
50
在线时间
57 小时
注册时间
2012-9-1
回帖
24
 楼主| 发表于 2013-3-30 00:15:07 | 显示全部楼层
喵呜喵5 发表于 2013-3-29 21:47
Scene_MenuBase第29、30行:
@background_sprite.bitmap = SceneManager.background_bitmap
@background_sp ...

感谢您的回复,但是人家要的不是这样的效果啦。

如果用PHOTOSHOP里面的图层来做比喻的话,我想要的效果是:

1、最下面的背景层是地图模糊后的图,也就是Scene_MenuBase里面的
[pre lang="ruby" line="1"]
def create_background
    @background_sprite = Sprite.new
    @background_sprite.bitmap = SceneManager.background_bitmap
    @background_sprite.color.set(16, 16, 16, 128)
  end[/pre]
这一行

2、地图图层上面是第二个图层,我的思路是新建一个sprite,然后调用一张png图片,但是不知道具体的做法

3、第三层才是各个窗口(已经把self.opacity = 0 )这句加上了
回复

使用道具 举报

梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
回帖
1526
发表于 2013-3-30 00:50:04 | 显示全部楼层
画图的方法是读取位图
  1. bitmap = Cache.load_bitmap("Graphics/Party/", player_filename)
复制代码
用 load_bitmap 或 system 或 Picture 都看您自己的考量,反正就是 Cache 到 bitmap 中.

然后建立一个显示描绘此位图的矩形
  1. rect = Rect.new(0, 0, bitmap.width, bitmap.height)
复制代码
基本上这一行可以照搬不用改的。

再就是开始描绘图形了
  1. contents.blt(x, y, bitmap, rect, 不透明度)
复制代码
这个依照您的需要,改 x, y 座标,和不透明度,一般常用是 255 完全不透明。

最后在画完图之后,把 bitmap 给 dispose 清掉,免残留
  1. bitmap.dispose
复制代码
修改劇本中,仔細審查原來的劇情大綱,覺得有點不太滿意,嘗試編寫不同主角不同主線的劇情,希望能寫得出來。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
57 小时
注册时间
2012-9-1
回帖
24
 楼主| 发表于 2013-3-30 08:08:48 | 显示全部楼层
本帖最后由 huhumaru 于 2013-3-30 08:22 编辑
j433463 发表于 2013-3-30 00:50
画图的方法是读取位图用 load_bitmap 或 system 或 Picture 都看您自己的考量,反正就是 Cache 到 bitmap  ...


非常感谢,我按照您的方法把图片建立在Window_MenuStatus中了,但是又出现一个新的问题,图片把窗口里本该显示的内容盖住了,请问应该怎么设置Z值呢?(追加:我重新理了一下思路,貌似这样draw出来的图像是在窗口的边框加上padding里面的,我想要的是图片整个充当窗口的背景,包括边框和padding的部分)

还有个问题就是,只能在窗口里绘图,在scene_menubase里绘图的话会提示我content没有定义,我不知道怎么定义

以下是代码和截图:

[pre lang="ruby" line="1"]
  #--------------------------------------------------------------------------
  # ● 获取窗口背景图
  #--------------------------------------------------------------------------
  def wa
    bitmap = Cache.load_bitmap("Graphics/WindowBack/", "back01")
    rect = Rect.new(0, 0,bitmap.width, bitmap.height)
    contents.blt(0, 0, bitmap, rect, 255)
    bitmap.dispose
  end[/pre]

[pre lang="ruby" line="1"]
  #--------------------------------------------------------------------------
  # ● 绘制项目
  #--------------------------------------------------------------------------
  def draw_item(index)
    wa
    actor = $game_party.members[index]
    enabled = $game_party.battle_members.include?(actor)
    rect = item_rect(index)
    draw_item_background(index)
    draw_actor_HalfBody(actor, rect.x, rect.y, enabled)
    draw_actor_name(actor,rect.x+35, rect.y+279)
    draw_actor_icons(actor,rect.x+35,rect.y+233+line_height*2)
    draw_actor_level(actor,rect.x+103, rect.y+233+line_height*2)
    draw_actor_hp(actor,rect.x+35, rect.y+233+line_height*3)
  end[/pre]

未标题-1.jpg


回复

使用道具 举报

梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
回帖
1526
发表于 2013-3-30 08:50:40 | 显示全部楼层
本帖最后由 j433463 于 2013-3-30 08:53 编辑

如果是要当整个窗口的背景图,方法又不一样了,我拿主菜单为例,图片是整个主菜单的背景,所以要在 Scene_Menu 来改,若是状态页,则是改 Scene_Status ,依此类推。

首先,在 Scene_Menu 的开始处理 def start 中,super 的下面加一行:
  1.     create_background
复制代码
就是要在主菜单开始时生成背景,然后在 def start 的 end 后面加入这个生成背景的主程序:
  1.   #--------------------------------------------------------------------------
  2.   # ● 生成背景
  3.   #--------------------------------------------------------------------------
  4.   def create_background
  5.     @background_sprite = Sprite.new
  6.     @background_sprite.bitmap = Cache.load_bitmap("Graphics/Pictures/","1-032-72")
  7.     @background_sprite.color.set(0, 0, 0, 0)
  8.   end
  9.   #--------------------------------------------------------------------------
  10.   # ● 结束背景
  11.   #--------------------------------------------------------------------------
  12.   def dispose_background
  13.     @background_sprite.dispose
  14.   end
复制代码
这主程序分成两个部份,一个是生成时的处理,一个是菜单结束时,背景图的释放处理,后者不必多作什么,菜单结束时会去执行 dispose_ 开头的。
(更正一下,这是因为在 Scene_MenuBase 中有定义 def terminate 结束时的处理了)

从这个程序中,我回答您之前的问题,您看到生成背景的方式了,这儿就用到建立 Sprite.new 方法,并且有给一个 @background_sprite 变量名,
所以像这样绘的图就可以用 @background_sprite.z = n 来指定 z 的值。

您也可不去改动默认脚本,用下面我这个方式,在 Main 前插入这样的脚本:
  1. # 菜单
  2. class Scene_Menu < Scene_MenuBase
  3.    #--------------------------------------------------------------------------
  4.   # ● 生成背景
  5.   #--------------------------------------------------------------------------
  6.   def create_background
  7.     @background_sprite = Sprite.new
  8.     @background_sprite.bitmap = Cache.load_bitmap("Graphics/Titles1/","star_01")
  9.     @background_sprite.color.set(0, 0, 0, 0)
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 结束处理
  13.   #--------------------------------------------------------------------------
  14.   def terminate
  15.     super
  16.     dispose_background
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 结束背景
  20.   #--------------------------------------------------------------------------
  21.   def dispose_background
  22.     @background_sprite.dispose
  23.   end
  24. end

  25. #状态
  26. class Scene_Status < Scene_MenuBase
  27.   #--------------------------------------------------------------------------
  28.   # ● 生成背景
  29.   #--------------------------------------------------------------------------
  30.   def create_background
  31.     @background_sprite = Sprite.new
  32.     @background_sprite.bitmap = Cache.load_bitmap("Graphics/Titles1/","DATA20_0852")
  33.     @background_sprite.color.set(0, 0, 0, 0)
  34.   end
  35.   #--------------------------------------------------------------------------
  36.   # ● 结束处理
  37.   #--------------------------------------------------------------------------
  38.   def terminate
  39.     super
  40.     dispose_background
  41.   end
  42.   #--------------------------------------------------------------------------
  43.   # ● 结束背景
  44.   #--------------------------------------------------------------------------
  45.   def dispose_background
  46.     @background_sprite.dispose
  47.   end
  48. end

  49. #物品
  50. class Scene_Item < Scene_ItemBase
  51.   #--------------------------------------------------------------------------
  52.   # ● 生成背景
  53.   #--------------------------------------------------------------------------
  54.   def create_background
  55.     @background_sprite = Sprite.new
  56.     @background_sprite.bitmap = Cache.load_bitmap("Graphics/Titles1/","087")
  57.     @background_sprite.color.set(0, 0, 0, 0)
  58.   end
  59.   #--------------------------------------------------------------------------
  60.   # ● 结束处理
  61.   #--------------------------------------------------------------------------
  62.   def terminate
  63.     super
  64.     dispose_background
  65.   end
  66.   #--------------------------------------------------------------------------
  67.   # ● 结束背景
  68.   #--------------------------------------------------------------------------
  69.   def dispose_background
  70.     @background_sprite.dispose
  71.   end
  72. end

  73. #技能
  74. class Scene_Skill < Scene_ItemBase
  75.   #--------------------------------------------------------------------------
  76.   # ● 生成背景
  77.   #--------------------------------------------------------------------------
  78.   def create_background
  79.     @background_sprite = Sprite.new
  80.     @background_sprite.bitmap = Cache.load_bitmap("Graphics/Titles1/","043-Cave01")
  81.     @background_sprite.color.set(0, 0, 0, 0)
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 结束处理
  85.   #--------------------------------------------------------------------------
  86.   def terminate
  87.     super
  88.     dispose_background
  89.   end
  90.   #--------------------------------------------------------------------------
  91.   # ● 结束背景
  92.   #--------------------------------------------------------------------------
  93.   def dispose_background
  94.     @background_sprite.dispose
  95.   end
  96. end

  97. #装备
  98. class Scene_Equip < Scene_MenuBase
  99.   #--------------------------------------------------------------------------
  100.   # ● 生成背景
  101.   #--------------------------------------------------------------------------
  102.   def create_background
  103.     @background_sprite = Sprite.new
  104.     @background_sprite.bitmap = Cache.load_bitmap("Graphics/Titles1/","046-Cave04")
  105.     @background_sprite.color.set(0, 0, 0, 0)
  106.   end
  107.   #--------------------------------------------------------------------------
  108.   # ● 结束处理
  109.   #--------------------------------------------------------------------------
  110.   def terminate
  111.     super
  112.     dispose_background
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   # ● 结束背景
  116.   #--------------------------------------------------------------------------
  117.   def dispose_background
  118.     @background_sprite.dispose
  119.   end
  120. end
复制代码
其实只是把原本要放在默认脚本中集中在一个脚本内而已,好处是要删改比较方便,呵呵~~
修改劇本中,仔細審查原來的劇情大綱,覺得有點不太滿意,嘗試編寫不同主角不同主線的劇情,希望能寫得出來。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
57 小时
注册时间
2012-9-1
回帖
24
 楼主| 发表于 2013-3-30 09:34:25 | 显示全部楼层
j433463 发表于 2013-3-30 08:50
如果是要当整个窗口的背景图,方法又不一样了,我拿主菜单为例,图片是整个主菜单的背景,所以要在 Scene_M ...

谢谢您的回复,从您的代码里我知道这种创建背景的方法了。
不过要按照我之前设想的效果的话,您的这种方法实际上是用新的背景图来取代原有的地图背景图。所以我在想可不可以用这样一种思路,就是分别在各个窗口调用窗口的独立背景。按照您给的方法可以给物品、装备、技能等scene创建背景,但scene_menu包含了menu_command、menu_status、Gold三个窗口,这三个窗口在scene类中是没有单独的scene的,那是不是要新建属于他们的单独的scene呢?

纯好奇而提问,其实到了这步窗口的效果也达到了。我主要是想从这些实例的修改来慢慢熟悉ruby,我没有程序基础,稍微有点头疼,呵呵。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部