注册会员 登录
Project1 返回首页

喵呜喵5的树洞 https://rpg.blue/?291206 [收藏] [复制] [分享] [RSS]

日志

【脚本】公共事件转换为特殊界面

热度 45已有 6157 次阅读2014-10-1 20:09 |个人分类:脚本

★希望将这个脚本的最新版用于收费游戏必须先与我联系。

最新版脚本以及范例工程:

http://pan.baidu.com/s/1mhiiDc8

范例中使用这个脚本做出的效果:

21

鸡蛋
1

鲜花

刚表态过的朋友 (22 人)

发表评论 评论 (29 个评论)

回复 taroxd 2014-10-2 10:37
233333 喵呜喵老实交代你自己用不用这个脚本 233333
回复 永燃的狂炎 2014-10-2 11:05
我先不用=,= 之后等你完成后,我才用
回复 taroxd 2014-10-2 17:05
子弹君: 他肯定用拉~
真的?我觉得这个东西的设置比直接写脚本还要复杂
回复 喵呜喵5 2014-10-2 17:18
taroxd: 真的?我觉得这个东西的设置比直接写脚本还要复杂
我自己当然不用这玩意儿……因为确实比直接写一个Scene来的麻烦多了= =
下一版发布的时候这个脚本就支持自定义两个窗口的大小位置自定义界面背景自定义选项的出现条件以及eval了……

唯一的问题是现在我不知道应该如何让其他人看懂下一版的脚本应该怎么用……
回复 子弹君 2014-10-2 17:29
taroxd: 真的?我觉得这个东西的设置比直接写脚本还要复杂
还好
回复 子弹君 2014-10-3 02:36
暴走是什么情况233
回复 taroxd 2014-10-5 08:24
喵呜喵的暴走好可怕……
回复 taroxd 2014-10-5 09:00
看了一下代码……喵呜喵终于开始走向“元”的邪道了么……可喜可贺可喜可贺

给个建议吧。事件的设置(类似DSL)提供一个类似于 Window#move 的接口,同时设置窗口的四个坐标,这样是不是会比较好一点?

如果需要可读性,以及不需要同时设置4个的情况下,可以有这样的语法:
选择窗口 X: 7, Y: 78, 宽: 221, 高: 55

实现也很简单,如下
def 选择窗口(hash = {})
  @window.instance_eval do # 只是为了节约代码
    move(hash[:X] || x, hash[:Y] || y, hash[:宽] || width, hash[:高] || height)
  end
end
回复 taroxd 2014-10-5 09:10
另一种实现可以这样(不限于位置的调整,任何窗口的属性都可以实现)

# class ...

# 直接支持窗口的所有属性,并忽略大小写
list = Hash.new {|h, k| h[k] = :"#{k.downcase}=" }

# 下面是为了更可读的语法而进行的特殊设定
list[:宽] = :width=
list[:高] = :height=

# 利用 define_method 定义方法,读取外部的局部变量 list
define_method :set_window_attr do |hash = {}|
  hash.each {|k, v| @window.send(list[k], v) }
end

# 调用语法如下:
#   选择窗口 X: 7, Y: 78, 宽: 221, 高: 55, opacity: 128
alias 选择窗口 set_window_attr

# end class ...

于是一个简单的事件脚本 DSL 就完成了~
回复 喵呜喵5 2014-10-5 09:25
taroxd: 另一种实现可以这样(不限于位置的调整,任何窗口的属性都可以实现)

# class ...

# 直接支持窗口的所有属性,并忽略大小写
list = Hash.new {|h, k| h[k] = : ...
主要是在想如果有人往窗口里塞一些乱七八糟的东西该怎么办......
最开始窗口的设置用的也是事件指令来进行限制(人物的八围对应窗口的八个属性),设置起来那叫一个销魂......
回复 taroxd 2014-10-5 09:28
喵呜喵5: 主要是在想如果有人往窗口里塞一些乱七八糟的东西该怎么办......
最开始窗口的设置用的也是事件指令来进行限制(人物的八围对应窗口的八个属性),设置起来那叫 ...
只能塞进 xxxx= 这类的东西,怕个啥= =

大不了加一个 respond_to? 作限制,防止报错

我觉得
  选择窗口 x: 50, y: 50

  选择窗口X 50
  选择窗口Y 50

要方便得多啊

脚本的实现部分也方便得多
回复 喵呜喵5 2014-10-5 09:30
taroxd: 只能塞进 xxxx= 这类的东西,怕个啥= =

大不了加一个 respond_to? 作限制,防止报错

我觉得
  选择窗口 x: 50, y: 50

  选择窗口X 50
  选择窗口Y 50

要方 ...
嗯,确实是
回复 taroxd 2014-10-5 09:31
喵呜喵5: 嗯,确实是
对了,我让你帮我买的那本书你自己也可以看看哦~ 很不错的书
回复 喵呜喵5 2014-10-5 09:38
taroxd: 对了,我让你帮我买的那本书你自己也可以看看哦~ 很不错的书
中文的ruby元编程我现在都啃的死去活来的......
回复 taroxd 2014-10-5 21:10
这样的实现对程序猿和用户都更加友好不是么

如果不能将类似于“打开”的指令编成 hash 的话,
或许可以在窗口上提供一个 打开= 方法与之对应
或者将 *args 全部改为参数为 window 的一个 lambda
都是可以的实现方式

当然,这种借助ruby语法的缺点就是,透明,隐藏这种属性不能放在坐标后面
但是你就说“坐标设置放在最后”就可以糊弄过去了啦~
回复 taroxd 2014-10-5 21:25
class FakeScene

  list = Hash.new {|h, k| h[k] = :"#{k.downcase}=" }

  list[:宽] = :width=
  list[:高] = :height=
  list[:速度] = :draw_text_turn=

  def 透明; { opacity: 0 }; end
  def 隐藏; { visible: false }; end
  def 横向按键; { lr_mode: true }; end

  define_method :set_window_attr do |window, *args|
    args.each do |hash|
      hash.each do |k, v|
        sym = list[k]
        window.send(sym, v) if window.respond_to? sym
      end
    end
  end

  def 选择窗口(*args); set_window_attr(@window, *args); end
  def 信息窗口(*args); set_window_attr(@window.window, *args); end
  def 帮助窗口(*args); set_window_attr(@window.help, *args); end

  # 测试部分

  def initialize
    @window = FakeWindow.new true
  end

end

class FakeWindow

  attr_reader :window, :help

  def initialize(new_window = false)
    @help = @window = FakeWindow.new if new_window   # 模拟窗口
  end

  # 为了可读性,这一段重复代码就不用元编程了。

  def x=(x)
    puts "now the x is #{x}"
  end

  def y=(y)
    puts "now the y is #{y}"
  end

  def width=(width)
    puts "now the width is #{width}"
  end

  def height=(height)
    puts "now the height is #{height}"
  end

  def opacity=(opacity)
    puts "now the opacity is #{opacity}"
  end

  def visible=(visible)
    puts "now the visible is #{visible}"
  end

  def draw_text_turn=(val)
    puts "now the speed is #{val}"
  end

  def lr_mode=(mode)
    puts "now lr mode is #{mode}"
  end
end

FakeScene.new.instance_eval do # 执行代码的环境
  选择窗口 透明, 隐藏, 横向按键,
           x: 6, y: 77, width: 312, height: 244
  puts "------------------------------"
  帮助窗口 透明, 隐藏, 速度: 1,
           X: 7, Y: 78, 宽: 313, 高: 245
end

output = '
now the opacity is 0
now the visible is false
now lr mode is true
now the x is 6
now the y is 77
now the width is 312
now the height is 244
------------------------------
now the opacity is 0
now the visible is false
now the speed is 1
now the x is 7
now the y is 78
now the width is 313
now the height is 245
'
回复 喵呜喵5 2014-10-5 21:46
taroxd: 吐槽 start

1. method_missing 完全没有意义啊喂!直接定义正常的方法不就好了嘛喂!
   又没有对 name 做正则表达式匹配什么的,这个 method_missing 到底是来 ...
好长的评论……反正目前只是个过渡版本而已,没写过DSL所以一边啃书一边慢慢改。目前的精力还是先把帮助窗口加进去把图片单独分一个类出来把事件指令调教好了再考虑别的问题……开启/关闭其实我自己也没用上,本来这两个也不是放出来让人用的……
回复 taroxd 2014-10-6 07:12
喵呜喵5: 好长的评论……反正目前只是个过渡版本而已,没写过DSL所以一边啃书一边慢慢改。目前的精力还是先把帮助窗口加进去把图片单独分一个类出来把事件指令调教好了再 ...
DSL不是什么可怕高大上的东西,你现在写的“事件脚本指令集”就是一个DSL嘛

楼上给出的是完整的实现,而且非常易于更改和维护(我刚刚更新过。你看看我是如何快速简单地加上“速度”和“横向按键”的设置的)。你愿意用的话直接拿去用估计没什么问题。应该还能为你之后加功能提供点方便。

而我看你加上这两个功能的代码,比我要费事得多吧。

测试代码中调用DSL的语法你也看看吧。我觉得比你的要简洁不少。每个窗口只要一句话就可以搞定了。
回复 taroxd 2014-10-6 18:07
太鼓界面的按键设置错了= = 请无视这个事件你妹啊你妹啊你妹啊

你的暴走已经停不下来了么……
回复 VIPArcher 2014-10-6 23:33
喵呜=0都暴走到如此的境界了吗?
12下一页

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

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

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

GMT+8, 2024-4-29 07:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部