查看: 2304|回复: 2

[已经解决] 让窗口逐渐出现/消失的问题

[复制链接]
梦石
0
星屑
50
在线时间
96 小时
注册时间
2009-7-6
回帖
15
发表于 2013-5-12 12:51:57 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Sion 于 2013-5-25 17:18 编辑

我在地图界面中直接用Window_Base构建了一个窗口来显示我想输入的东西~
比如这样 (游戏用的分辨率是800*600)
$test = Window_Base.new(20, 20, 800, 48)
$test.contents.draw_text(0, 0, 800, 30, "测试", 0)

然后我觉得直接这样显示很突兀,就加了一个让他逐渐出现的方法
$test.opacity = 0
$test.contents_opacity = 0
for i in 0..30
  Graphics.update
  $test.opacity += 255/30
  $test.contents_opacity += 255/30
end

但是这样一来就出现问题了,
如果我需要窗口出现的时间特别长,比如300帧(上面那个是30帧),
那在窗口显示的30帧内,人物就什么都不能做
我尝试过在事件里面用并行处理调用过那个界面,也不行的
请问~怎样在让窗口逐渐显示的同时 又能控制人物呢?

(我也试过把Graphics.update删掉,但是这样一来就没法精确控制时间——因为i递加得太快~)

小白真心求解
梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
回帖
638
发表于 2013-5-12 13:13:17 | 显示全部楼层
脚本里找个位置,最好就是第一个
[pre lang="ruby" line="1"]module Math
  def self.f(x)
    return self.f(x+1) if x < 0
    return self.f(x-1) if x > 2
    (x-1)**2
  end
end
class Window_Base
  #--------------------------------------------------------------------------
  # ● 移动到
  #--------------------------------------------------------------------------
  def move_to(x, y,duration, opa=nil)
    @old_x = self.x
    @old_y = self.y
    @target_x = (x ? x : self.x)
    @target_y = (y ? y : self.y)
    @target_opa = (opa ? opa : @target_opa)
    @old_opa = self.opacity
    @duration = duration
    @duration_full = duration.to_f
  end
  #--------------------------------------------------------------------------
  # ● 刷新移动
  #--------------------------------------------------------------------------
  def move_update
    return true if @duration.nil? or @duration <= 0
    @duration -= 1
    var = 1-Math.f(@duration/@duration_full+1)
    self.x = (@old_x + (@target_x-@old_x) *var+0.5).to_i
    self.y = (@old_y + (@target_y-@old_y) *var+0.5).to_i
    self.opacity = @old_opa + (@target_opa - @old_opa)*var if @target_opa
    self.contents_opacity = self.opacity
    false
  end
end
[/pre]
找到Scene_Map的update方法,里面加一句update_diy_windows
再在main前加上:
[pre lang="ruby" line="1"]class Scene_Map
  def update_diy_windows
    @diy_windows ||= []
    @diy_windows.each{|wnd|wnd.move_update;wnd.update}
  end
  def add_diy_window(wnd)
    @diy_windows ||= []
    @diy_windows << wnd
  end
  def dispose_diy_window(wnd)
    @diy_windows ||= []
    @diy_windows.delete(wnd)
    wnd.dispose
  end
end[/pre]


使用方法,如lz写得那样,但是本脚本只在地图上有效,其他地方(如战斗时)使用会出错.
$test = Window_Base.new(20, 20, 800, 48)
$test.contents.draw_text(0, 0, 800, 30, "测试", 0)
SceneManager.scene.add_diy_window($test)
$test.opacity = 0
$test.contents_opacity = 0
$test.move_to(nil, nil, 300, 255)


就能在300内将窗口从透明变为不透明。

$test.move_to(500, 20, 30, 255)

就能在300内将窗口从原位置移动到(500, 20)透明变为不透明。
$test.move_to(500, nil, 30, 255)
$test.move_to(nil, 500, 30, 255)
这个lz可以试试

释放窗口使用:
SceneManager.scene.dispose_diy_window($test)
就行,没试过,可能有错

点评

不过现在6R好像没有看到有选为答案的功能。。  发表于 2013-5-12 14:29
刚刚试了···可以用的~谢谢~  发表于 2013-5-12 14:28
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复

使用道具 举报

梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
回帖
1526
发表于 2013-5-12 13:15:25 | 显示全部楼层
不要用 for 跑回圈,那得等回圈跑完才会执行后面的,您应该在 def update 刷新那边做,

并且用一个变量来计算执行次数,譬如 ot += 1,判断 ot 小于 30 就执行原本在 for 内的代码。

点评

soga。。我之前还没想到改update里面的内容~  发表于 2013-5-12 14:30

评分

参与人数 1星屑 +100 收起 理由
Sion + 100 认可答案

查看全部评分

修改劇本中,仔細審查原來的劇情大綱,覺得有點不太滿意,嘗試編寫不同主角不同主線的劇情,希望能寫得出來。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部