Project1

标题: 美工也要做游戏!窗口间信息传递和位图覆盖的问题!? [打印本页]

作者: 赤原猎犬    时间: 2015-3-20 10:47
标题: 美工也要做游戏!窗口间信息传递和位图覆盖的问题!?
本帖最后由 赤原猎犬 于 2015-3-20 10:49 编辑

     经过了1昼夜的努力,我把我的RM菜单改良成了这个样子:


    接下来打算开始进行制作任务菜单,但由于没什么经验,我还是决定先从修改现有的任务模板开始入手。
那么最主要的就是制作一个新的UI了,于是我做出了这个样子的东西....


等等?
好像有什么地方不对?
...我的选项呢?我的文字呢?

    检查了半分钟之后发现似乎图片把文字都覆盖掉了,摆弄了半天也找不到调节图层顺序的办法。如果单单只是显示文字的部分也就算了,用draw_text也能搞定,但是选项支都被压在下面呢!


    接下来我进行了漫无目的的数次尝试.....
    尝试1.建立一个只有这个图片的窗口作为背景,然后其他窗口压在上面!
             如意算盘打的虽然好,但是事实很残酷,被压住的部分全都变成了模糊后的背景地图,换言之:有底下的背景窗口和没有一个样...
    尝试2.做一个遮罩!把这个图片分割后拼装!
             如意算盘打的虽然好,但是事实依然很残酷,首先这蠢办法没有解决图片会把文字和选项支压在下面的问题,其次我没有办法找出智能的调整遮罩的办法,比如我设置了height=Graphics.height-@window_task.height他就是报错我也没什么办法,既然如此我还是另谋他路吧。
    尝试3.全都用图片!
             如意算盘...这什么如意算盘!?每段文字都要做出图片然后另外做程序、工作量和文件大小翻着倍往上涨,这种蠢办法显然没力气也没时间做.....


求指条明路

除此以外关于窗口间信息传递的问题.....
我查阅了默认脚本和一些插件脚本,似乎在各个窗口间传输数据都是通过一个场景、然后依靠实例变量作为中介(诸如..    @item_window=Window_TaskList.new(Graphics.width-339, wy, 339, wh))等等....
但是我尝试了2个小时都没有成功,无论怎么写都报错,我也就放弃了。请问这个到底是如何工作的?

2015320-102132.jpg (158.21 KB, 下载次数: 26)

2015320-102132.jpg

2015320-102216.jpg (124.12 KB, 下载次数: 26)

2015320-102216.jpg

作者: 喵呜喵5    时间: 2015-3-20 10:58
中文八级阅读理解题……好长的题目描述还都是没用的信息…………

尝试1的做法完全可行,只能推断你是哪里写错了,你不附上代码的话完全无法解答

你最开始图片盖住文字是因为你先描绘了文字,再描绘了图片,顺序反过来就行了

最后附加的那个问题…………不给出你出错的代码我也不知道该怎么给你解释……参考帮助窗口如何获取物品列表窗口选择的物品那部分脚本吧
作者: zeldafd    时间: 2015-3-20 11:43
請把你那本書的相關SPRITE的Z降低
例如你把建構那本書的SPRITE類實例名為@book
那就
@book.z = 1
之類
我不記得表面文字的Z軸是什麼,所以請自己試一試不同的值=.=:
但改的方面應該就是要改Z軸
一般都是個位數就好
作者: 赤原猎犬    时间: 2015-3-20 11:52
既然方法1被认为是可行的,那么我也研究一下.....

好的、显然是可行的,接下来只要修改位置就可以了~
之前一次失败的原因已经不可考证、推测是连续2次cache了同一张图片所以之前的那张就被转移了吧..大概吧、不去管它..

关于那个实例的问题.....请许我再去写一遍出来....(由于行行报错已经被我怒删了)

作者: 赤原猎犬    时间: 2015-3-20 12:56
本帖最后由 赤原猎犬 于 2015-3-20 12:57 编辑

有问题的部分是第66行开始到第121行结束。

RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_MenuStatus
  4. #------------------------------------------------------------------------------
  5. #  2015-3-18这段代码只有我和上帝看得懂
  6. #   2015-3-20现在只有上帝看的懂了...
  7. #==============================================================================
  8.  
  9. class Window_MenuStatus < Window_Selectable
  10.   #--------------------------------------------------------------------------
  11.   # ● 定义实例变量
  12.   #--------------------------------------------------------------------------
  13.   attr_reader   :pending_index            # 保留位置(整队用)
  14.   #--------------------------------------------------------------------------
  15.   # ● 初始化对象
  16.   #--------------------------------------------------------------------------
  17.   def initialize(x, y)
  18.     super(x, y, window_width, window_height)
  19.     @pending_index = -1
  20.     self.opacity=0
  21.     refresh
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 获取窗口的宽度
  25.   #--------------------------------------------------------------------------
  26.   def window_width
  27.     Graphics.width - 160
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 获取窗口的高度
  31.   #--------------------------------------------------------------------------
  32.   def window_height
  33.     Graphics.height
  34.   end
  35.  
  36.   #--------------------------------------------------------------------------
  37.   # ● 获取标准的边距尺寸
  38.   #--------------------------------------------------------------------------
  39.   def standard_padding
  40.     return 20
  41.   end
  42.   #--------------------------------------------------------------------------
  43.   # ● 获取项目数
  44.   #--------------------------------------------------------------------------
  45.   def item_max
  46.     $game_party.members.size
  47.   end
  48.   #--------------------------------------------------------------------------
  49.   # ● 获取项目的高度
  50.   #--------------------------------------------------------------------------
  51.   def item_height
  52.     (height - standard_padding * 2) / 4
  53.   end
  54.  
  55.   #--------------------------------------------------------------------------
  56.   # ● 获取项目的绘制矩形
  57.   #--------------------------------------------------------------------------
  58.   def item_rect(index)
  59.     rect = Rect.new
  60.     rect.width = 300
  61.     rect.height = 100
  62.     rect.x = index % col_max * (item_width + spacing)
  63.     rect.y = index / col_max * item_height
  64.     rect
  65.   end
  66.   #------------------------------------------
  67.   # * 肖像对应
  68.   #-------------------------------------------
  69.   def set_face_respond(symbol,face)
  70.     @portrait[symbol]=face
  71.   end
  72.  
  73.   #---------------------------------------------
  74.   # * 添加肖像对应!
  75.   #----------------------------------------------
  76.   def new_face_respond
  77.     set_face_respond($game_party.member[0],"face_mainhero")
  78.     set_face_respond($game_party.member[1],"face_nothero")
  79.   end   
  80.  
  81.   #---------------------------------------------------------------------------
  82.   # *角色肖像绘制
  83.   #----------------------------------------------------------------------------
  84.   def draw_portrait(x,y,enabled,portrait)
  85.     bitmap=Cache.picture(portrait)
  86.     rect=Rect.new(0,0,bitmap.width,bitmap.height)
  87.     contents.blt(x,y,bitmap,rect,enabled ? 255 : translucent_alpha)
  88.   end
  89.  
  90.   #---------------------------------------------------------------------------
  91.   # * 原始-角色肖像绘制
  92.   #----------------------------------------------------------------------------
  93.   #def draw_portrait(x,y,enabled,portrait)
  94.   #  bitmap=Cache.picture("face_mainhero")
  95.   #  rect=Rect.new(0,0,bitmap.width,bitmap.height)
  96.   #  contents.blt(x,y,bitmap,rect,enabled ? 255 : translucent_alpha)
  97.   #end
  98.  
  99.   #--------------------------------------------------------------------------
  100.   # ● 绘制简单的状态
  101.   #--------------------------------------------------------------------------
  102.   def draw_actor_simple_status(actor, x, y)
  103.     draw_actor_name(actor,x+100,y-line_height)
  104.     #draw_actor_level(actor,x+70,y)
  105.     #draw_actor_icons(actor,x,y + line_height * 2)
  106.     #draw_actor_class(actor,x+150,y)
  107.     draw_actor_hp(actor,x, y + line_height * 1)
  108.     draw_actor_mp(actor,x ,y + line_height * 2)
  109.   end
  110.  
  111.   #--------------------------------------------------------------------------
  112.   # ● 绘制项目
  113.   #--------------------------------------------------------------------------
  114.   def draw_item(index)
  115.     actor = $game_party.members[index]
  116.     enabled = $game_party.battle_members.include?(actor)
  117.     rect = item_rect(index)
  118.     draw_item_background(index)
  119.     draw_portrait(rect.x,rect.y,enabled,@portrait[$game_party.members[index]])
  120.     draw_actor_simple_status(actor, rect.x+100 , rect.y + 25 )
  121.   end
  122.  
  123.   #--------------------------------------------------------------------------
  124.   # ● 绘制项目的背景
  125.   #--------------------------------------------------------------------------
  126.   def draw_item_background(index)
  127.     if index == @pending_index
  128.       contents.fill_rect(item_rect(index), pending_color)
  129.     end
  130.   end
  131.  
  132.   #--------------------------------------------------------------------------
  133.   # ● 按下确定键时的处理
  134.   #--------------------------------------------------------------------------
  135.   def process_ok
  136.     super
  137.     $game_party.menu_actor = $game_party.members[index]
  138.   end
  139.  
  140.   #--------------------------------------------------------------------------
  141.   # ● 返回上一个选择的位置
  142.   #--------------------------------------------------------------------------
  143.   def select_last
  144.     select($game_party.menu_actor.index || 0)
  145.   end
  146.  
  147.   #--------------------------------------------------------------------------
  148.   # ● 设置保留位置(整队用)
  149.   #--------------------------------------------------------------------------
  150.   def pending_index=(index)
  151.     last_pending_index = @pending_index
  152.     @pending_index = index
  153.     redraw_item(@pending_index)
  154.     redraw_item(last_pending_index)
  155.   end
  156. end


简而言之就是我把每个角色的头像都用自己的方法自行设置了,需要想办法重新把他们挂钩,但是显然效果不理想,报错的位置是在第119行
    draw_portrait(rect.x,rect.y,enabled,@portrait[$game_party.members[index]])
nomethoderror
undefined method'[]'for nil:NilClass
....反正我不知道到底该怎么搞才对
作者: 喵呜喵5    时间: 2015-3-20 18:31
赤原猎犬 发表于 2015-3-20 12:56
有问题的部分是第66行开始到第121行结束。

#encoding:utf-8

问题:
new_face_respond 这个方法没有调用
@portrait 这个哈希没有初始化
是 $game_party.members 不是 $game_party.member

修改后:
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_MenuStatus
  4. #------------------------------------------------------------------------------
  5. #  2015-3-18这段代码只有我和上帝看得懂
  6. #   2015-3-20现在只有上帝看的懂了...
  7. #   2015-3-20你好,我是上帝(By 喵呜喵5)
  8. #==============================================================================

  9. class Window_MenuStatus < Window_Selectable
  10.   #--------------------------------------------------------------------------
  11.   # ● 定义实例变量
  12.   #--------------------------------------------------------------------------
  13.   attr_reader   :pending_index            # 保留位置(整队用)
  14.   #--------------------------------------------------------------------------
  15.   # ● 初始化对象
  16.   #--------------------------------------------------------------------------
  17.   def initialize(x, y)
  18.     super(x, y, window_width, window_height)
  19.     @pending_index = -1
  20.     self.opacity=0
  21.     refresh
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 获取窗口的宽度
  25.   #--------------------------------------------------------------------------
  26.   def window_width
  27.     Graphics.width - 160
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 获取窗口的高度
  31.   #--------------------------------------------------------------------------
  32.   def window_height
  33.     Graphics.height
  34.   end

  35.   #--------------------------------------------------------------------------
  36.   # ● 获取标准的边距尺寸
  37.   #--------------------------------------------------------------------------
  38.   def standard_padding
  39.     return 20
  40.   end
  41.   #--------------------------------------------------------------------------
  42.   # ● 获取项目数
  43.   #--------------------------------------------------------------------------
  44.   def item_max
  45.     $game_party.members.size
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 获取项目的高度
  49.   #--------------------------------------------------------------------------
  50.   def item_height
  51.     (height - standard_padding * 2) / 4
  52.   end

  53.   #--------------------------------------------------------------------------
  54.   # ● 获取项目的绘制矩形
  55.   #--------------------------------------------------------------------------
  56.   def item_rect(index)
  57.     rect = Rect.new
  58.     rect.width = 300
  59.     rect.height = 100
  60.     rect.x = index % col_max * (item_width + spacing)
  61.     rect.y = index / col_max * item_height
  62.     rect
  63.   end
  64.   #------------------------------------------
  65.   # * 肖像对应
  66.   #-------------------------------------------
  67.   def set_face_respond(symbol,face)
  68.     @portrait ||= {}
  69.     @portrait[symbol] = face
  70.   end

  71.   #---------------------------------------------
  72.   # * 添加肖像对应!
  73.   #----------------------------------------------
  74.   def new_face_respond
  75.     set_face_respond($game_party.members[0],"face_mainhero")
  76.     set_face_respond($game_party.members[1],"face_nothero")
  77.   end   

  78.   #---------------------------------------------------------------------------
  79.   # *角色肖像绘制
  80.   #----------------------------------------------------------------------------
  81.   def draw_portrait(x,y,enabled,portrait)
  82.     bitmap=Cache.picture(portrait)
  83.     rect=Rect.new(0,0,bitmap.width,bitmap.height)
  84.     contents.blt(x,y,bitmap,rect,enabled ? 255 : translucent_alpha)
  85.   end

  86.   #---------------------------------------------------------------------------
  87.   # * 原始-角色肖像绘制
  88.   #----------------------------------------------------------------------------
  89.   #def draw_portrait(x,y,enabled,portrait)
  90.   #  bitmap=Cache.picture("face_mainhero")
  91.   #  rect=Rect.new(0,0,bitmap.width,bitmap.height)
  92.   #  contents.blt(x,y,bitmap,rect,enabled ? 255 : translucent_alpha)
  93.   #end

  94.   #--------------------------------------------------------------------------
  95.   # ● 绘制简单的状态
  96.   #--------------------------------------------------------------------------
  97.   def draw_actor_simple_status(actor, x, y)
  98.     draw_actor_name(actor,x+100,y-line_height)
  99.     #draw_actor_level(actor,x+70,y)
  100.     #draw_actor_icons(actor,x,y + line_height * 2)
  101.     #draw_actor_class(actor,x+150,y)
  102.     draw_actor_hp(actor,x, y + line_height * 1)
  103.     draw_actor_mp(actor,x ,y + line_height * 2)
  104.   end

  105.   #--------------------------------------------------------------------------
  106.   # ● 绘制项目
  107.   #--------------------------------------------------------------------------
  108.   def draw_item(index)
  109.     actor = $game_party.members[index]
  110.     enabled = $game_party.battle_members.include?(actor)
  111.     rect = item_rect(index)
  112.     draw_item_background(index)
  113.     new_face_respond
  114.     draw_portrait(rect.x,rect.y,enabled,@portrait[$game_party.members[index]])
  115.     draw_actor_simple_status(actor, rect.x+100 , rect.y + 25 )
  116.   end

  117.   #--------------------------------------------------------------------------
  118.   # ● 绘制项目的背景
  119.   #--------------------------------------------------------------------------
  120.   def draw_item_background(index)
  121.     if index == @pending_index
  122.       contents.fill_rect(item_rect(index), pending_color)
  123.     end
  124.   end

  125.   #--------------------------------------------------------------------------
  126.   # ● 按下确定键时的处理
  127.   #--------------------------------------------------------------------------
  128.   def process_ok
  129.     super
  130.     $game_party.menu_actor = $game_party.members[index]
  131.   end

  132.   #--------------------------------------------------------------------------
  133.   # ● 返回上一个选择的位置
  134.   #--------------------------------------------------------------------------
  135.   def select_last
  136.     select($game_party.menu_actor.index || 0)
  137.   end

  138.   #--------------------------------------------------------------------------
  139.   # ● 设置保留位置(整队用)
  140.   #--------------------------------------------------------------------------
  141.   def pending_index=(index)
  142.     last_pending_index = @pending_index
  143.     @pending_index = index
  144.     redraw_item(@pending_index)
  145.     redraw_item(last_pending_index)
  146.   end
  147. end
复制代码

作者: 赤原猎犬    时间: 2015-3-21 05:52
本帖最后由 赤原猎犬 于 2015-3-21 05:53 编辑

原来是这么用的、感觉差之毫厘。
不过后来思考了一下发现我的思路好像出错了,对应头像应该对应到角色本身上啊....现在是对应到了队列的成员上,队列变了头像也不会变。
相关的内容只找到了game_actor类下的
  def actor
    $data_actors[@actor_id]
  end
之后添加对应
然后我就不知道该怎么把队伍中的角色对应起来了...
所有actor.name之类的实例都有没数组之类的东西,没法一个个单独设置。

然后我换了个办法

  #---------------------------------------------
  # * 添加肖像对应!
  #----------------------------------------------
  def new_face_respond
    set_face_respond("主角的名字","face_mainhero")
    set_face_respond("娜塔丽","face_nothero")
    set_face_respond("泰伦斯","face_mainhero")
  end   


然后
    draw_portrait(rect.x,rect.y,enabled,@portrait[actor.name])
姑且对应到名字上了,但是这样之后换角色名字的时候就要回来改、虽然不是很麻烦但是显然也不是一个合格的脚本该有的情况。
那么怎么对应到角色本身的ID呢..又没有actor.id这么便利的东西。







欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1