查看: 1879|回复: 6

[已经解决] 美工也要做游戏!窗口间信息传递和位图覆盖的问题!?

[复制链接]
梦石
0
星屑
50
在线时间
27 小时
注册时间
2011-4-29
回帖
5
发表于 2015-3-20 10:47:17 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 赤原猎犬 于 2015-3-20 10:49 编辑

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


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

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

    检查了半分钟之后发现似乎图片把文字都覆盖掉了,摆弄了半天也找不到调节图层顺序的办法。如果单单只是显示文字的部分也就算了,用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
2015320-102216.jpg

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

开拓者短篇九导演组冠军

发表于 2015-3-20 10:58:23 | 显示全部楼层
中文八级阅读理解题……好长的题目描述还都是没用的信息…………

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

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

最后附加的那个问题…………不给出你出错的代码我也不知道该怎么给你解释……参考帮助窗口如何获取物品列表窗口选择的物品那部分脚本吧
回复

使用道具 举报

梦石
0
星屑
52
在线时间
704 小时
注册时间
2011-12-27
回帖
858
发表于 2015-3-20 11:43:43 | 显示全部楼层
請把你那本書的相關SPRITE的Z降低
例如你把建構那本書的SPRITE類實例名為@book
那就
@book.z = 1
之類
我不記得表面文字的Z軸是什麼,所以請自己試一試不同的值=.=:
但改的方面應該就是要改Z軸
一般都是個位數就好
回复

使用道具 举报

梦石
0
星屑
50
在线时间
27 小时
注册时间
2011-4-29
回帖
5
 楼主| 发表于 2015-3-20 11:52:21 | 显示全部楼层
既然方法1被认为是可行的,那么我也研究一下.....
2015320-114218.jpg
好的、显然是可行的,接下来只要修改位置就可以了~
之前一次失败的原因已经不可考证、推测是连续2次cache了同一张图片所以之前的那张就被转移了吧..大概吧、不去管它..

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

使用道具 举报

梦石
0
星屑
50
在线时间
27 小时
注册时间
2011-4-29
回帖
5
 楼主| 发表于 2015-3-20 12:56:18 | 显示全部楼层
本帖最后由 赤原猎犬 于 2015-3-20 12:57 编辑

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

[pre lang="ruby"]#encoding:utf-8
#==============================================================================
# ■ Window_MenuStatus
#------------------------------------------------------------------------------
#  2015-3-18这段代码只有我和上帝看得懂
#   2015-3-20现在只有上帝看的懂了...
#==============================================================================

class Window_MenuStatus < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :pending_index            # 保留位置(整队用)
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y, window_width, window_height)
    @pending_index = -1
    self.opacity=0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 获取窗口的宽度
  #--------------------------------------------------------------------------
  def window_width
    Graphics.width - 160
  end
  #--------------------------------------------------------------------------
  # ● 获取窗口的高度
  #--------------------------------------------------------------------------
  def window_height
    Graphics.height
  end
  
  #--------------------------------------------------------------------------
  # ● 获取标准的边距尺寸
  #--------------------------------------------------------------------------
  def standard_padding
    return 20
  end
  #--------------------------------------------------------------------------
  # ● 获取项目数
  #--------------------------------------------------------------------------
  def item_max
    $game_party.members.size
  end
  #--------------------------------------------------------------------------
  # ● 获取项目的高度
  #--------------------------------------------------------------------------
  def item_height
    (height - standard_padding * 2) / 4
  end
  
  #--------------------------------------------------------------------------
  # ● 获取项目的绘制矩形
  #--------------------------------------------------------------------------
  def item_rect(index)
    rect = Rect.new
    rect.width = 300
    rect.height = 100
    rect.x = index % col_max * (item_width + spacing)
    rect.y = index / col_max * item_height
    rect
  end
  #------------------------------------------
  # * 肖像对应
  #-------------------------------------------
  def set_face_respond(symbol,face)
    @portrait[symbol]=face
  end
  
  #---------------------------------------------
  # * 添加肖像对应!
  #----------------------------------------------
  def new_face_respond
    set_face_respond($game_party.member[0],"face_mainhero")
    set_face_respond($game_party.member[1],"face_nothero")
  end   
  
  #---------------------------------------------------------------------------
  # *角色肖像绘制
  #----------------------------------------------------------------------------
  def draw_portrait(x,y,enabled,portrait)
    bitmap=Cache.picture(portrait)
    rect=Rect.new(0,0,bitmap.width,bitmap.height)
    contents.blt(x,y,bitmap,rect,enabled ? 255 : translucent_alpha)
  end
  
  #---------------------------------------------------------------------------
  # * 原始-角色肖像绘制
  #----------------------------------------------------------------------------
  #def draw_portrait(x,y,enabled,portrait)
  #  bitmap=Cache.picture("face_mainhero")
  #  rect=Rect.new(0,0,bitmap.width,bitmap.height)
  #  contents.blt(x,y,bitmap,rect,enabled ? 255 : translucent_alpha)
  #end
  
  #--------------------------------------------------------------------------
  # ● 绘制简单的状态
  #--------------------------------------------------------------------------
  def draw_actor_simple_status(actor, x, y)
    draw_actor_name(actor,x+100,y-line_height)
    #draw_actor_level(actor,x+70,y)
    #draw_actor_icons(actor,x,y + line_height * 2)
    #draw_actor_class(actor,x+150,y)
    draw_actor_hp(actor,x, y + line_height * 1)
    draw_actor_mp(actor,x ,y + line_height * 2)
  end

  #--------------------------------------------------------------------------
  # ● 绘制项目
  #--------------------------------------------------------------------------
  def draw_item(index)
    actor = $game_party.members[index]
    enabled = $game_party.battle_members.include?(actor)
    rect = item_rect(index)
    draw_item_background(index)
    draw_portrait(rect.x,rect.y,enabled,@portrait[$game_party.members[index]])
    draw_actor_simple_status(actor, rect.x+100 , rect.y + 25 )
  end
  
  #--------------------------------------------------------------------------
  # ● 绘制项目的背景
  #--------------------------------------------------------------------------
  def draw_item_background(index)
    if index == @pending_index
      contents.fill_rect(item_rect(index), pending_color)
    end
  end
  
  #--------------------------------------------------------------------------
  # ● 按下确定键时的处理
  #--------------------------------------------------------------------------
  def process_ok
    super
    $game_party.menu_actor = $game_party.members[index]
  end
  
  #--------------------------------------------------------------------------
  # ● 返回上一个选择的位置
  #--------------------------------------------------------------------------
  def select_last
    select($game_party.menu_actor.index || 0)
  end
  
  #--------------------------------------------------------------------------
  # ● 设置保留位置(整队用)
  #--------------------------------------------------------------------------
  def pending_index=(index)
    last_pending_index = @pending_index
    @pending_index = index
    redraw_item(@pending_index)
    redraw_item(last_pending_index)
  end
end

[/pre]

简而言之就是我把每个角色的头像都用自己的方法自行设置了,需要想办法重新把他们挂钩,但是显然效果不理想,报错的位置是在第119行
    draw_portrait(rect.x,rect.y,enabled,@portrait[$game_party.members[index]])
nomethoderror
undefined method'[]'for nil:NilClass
....反正我不知道到底该怎么搞才对
回复

使用道具 举报

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

开拓者短篇九导演组冠军

发表于 2015-3-20 18:31:19 | 显示全部楼层
赤原猎犬 发表于 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
复制代码

评分

参与人数 1梦石 +1 收起 理由
taroxd + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
50
在线时间
27 小时
注册时间
2011-4-29
回帖
5
 楼主| 发表于 2015-3-21 05:52:41 | 显示全部楼层
本帖最后由 赤原猎犬 于 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这么便利的东西。
2015321-54909.jpg 2015321-55010.jpg

点评

還真的有def id...不過@actor_id都在你面前了...為什麼還會有這個問題  发表于 2015-3-23 06:34
我是不是口胡了..?看不懂問題...  发表于 2015-3-23 06:30
actor_id...  发表于 2015-3-23 06:29
就是有 actor.id 这么便利的东西啊……  发表于 2015-3-21 09:09
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部