设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2033|回复: 2
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
96 小时
注册时间
2009-7-6
帖子
18
跳转到指定楼层
1
发表于 2013-5-12 12:51:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 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递加得太快~)

小白真心求解

Lv1.梦旅人

梦石
0
星屑
50
在线时间
687 小时
注册时间
2012-10-29
帖子
1543
3
发表于 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 认可答案

查看全部评分

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
2
发表于 2013-5-12 13:13:17 | 只看该作者
脚本里找个位置,最好就是第一个
RUBY 代码复制
  1. module Math
  2.   def self.f(x)
  3.     return self.f(x+1) if x < 0
  4.     return self.f(x-1) if x > 2
  5.     (x-1)**2
  6.   end
  7. end
  8. class Window_Base
  9.   #--------------------------------------------------------------------------
  10.   # ● 移动到
  11.   #--------------------------------------------------------------------------
  12.   def move_to(x, y,duration, opa=nil)
  13.     @old_x = self.x
  14.     @old_y = self.y
  15.     @target_x = (x ? x : self.x)
  16.     @target_y = (y ? y : self.y)
  17.     @target_opa = (opa ? opa : @target_opa)
  18.     @old_opa = self.opacity
  19.     @duration = duration
  20.     @duration_full = duration.to_f
  21.   end
  22.   #--------------------------------------------------------------------------
  23.   # ● 刷新移动
  24.   #--------------------------------------------------------------------------
  25.   def move_update
  26.     return true if @duration.nil? or @duration <= 0
  27.     @duration -= 1
  28.     var = 1-Math.f(@duration/@duration_full+1)
  29.     self.x = (@old_x + (@target_x-@old_x) *var+0.5).to_i
  30.     self.y = (@old_y + (@target_y-@old_y) *var+0.5).to_i
  31.     self.opacity = @old_opa + (@target_opa - @old_opa)*var if @target_opa
  32.     self.contents_opacity = self.opacity
  33.     false
  34.   end
  35. end

找到Scene_Map的update方法,里面加一句update_diy_windows
再在main前加上:
RUBY 代码复制
  1. class Scene_Map
  2.   def update_diy_windows
  3.     @diy_windows ||= []
  4.     @diy_windows.each{|wnd|wnd.move_update;wnd.update}
  5.   end
  6.   def add_diy_window(wnd)
  7.     @diy_windows ||= []
  8.     @diy_windows << wnd
  9.   end
  10.   def dispose_diy_window(wnd)
  11.     @diy_windows ||= []
  12.     @diy_windows.delete(wnd)
  13.     wnd.dispose
  14.   end
  15. end



使用方法,如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游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-25 01:25

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表