将Shoes GUI连接到现有的Ruby代码

时间:2012-09-13 16:40:04

标签: ruby user-interface shoes

我在Ruby中构建了一个命令行游戏,现在我正在尝试使用Shoes为游戏构建一个GUI。我花了一整天的时间阅读关于鞋子的内容,查看一些代码示例,并自己编写一些代码。 出现(我是鞋子的新手,所以这可能是完全错误的),鞋子代码(例如,您使用Shoes应用程序打开的shoes.rb文件)必须包含您要运行的所有Ruby代码。所有Ruby代码都将存在于该文件中。

通过将命令行参数传递给play.rb(Ruby脚本),我在命令行中启动了这个游戏。在命令行运行play.rb "command line game"play.rb "shoes game"。如果您运行后者,它将进行系统调用以使用Shoes应用程序打开shoes.rb。在play.rb内,它会将ShoesInterface传递给玩家,而不是CommandLineInterface。以下是如何要求玩家进行移动的示例:

human_player.rb文件中:

def make_move
    @interface.print("It's your turn to make a move.")
end

@interface可以是CommandLineInterfaceShoesInterfaceprint中的CommandLineInterface方法只是一个puts语句。 print中的ShoesInterface方法应该告诉Shoes GUI显示该文本。我正在尝试尽可能多地重用我的代码。从理论上讲,无论如何某人正在玩游戏(在网络上,在命令行,通过GUI等),它应该使用大多数相同的逻辑。界面只显示消息并接收用户输入。他们只是以不同的方式做到这一点。

问题是我不知道如何将我的Shoes GUI连接到我现有的Ruby代码。有人在这里精通鞋子吗?这在鞋子中可能是不可能的...也许我将不得不使用不同的Ruby GUI,但我想在转到另一个之前我会问。

1 个答案:

答案 0 :(得分:1)

你可以做的是写一个鞋子小部件,它将响应方法打印。下面是这样一个小部件的一个非常粗略的例子,它将一条消息从编辑行附加到其任意显示槽。当然,您可以轻松修改Widget,以便您可以使用目标插槽进行初始化以进行显示等,但这个想法保持不变。

class Prompt < Shoes::Widget
 def initialize opts={}
  @top=opts[:top]
  @left=opts[:left]
  @width=opts[:width]
  @prom=flow :top=>@top, :left=>@left, :width=>@width do
   background red
  end
  end
 def print(msg)
  @prom.append do
   para msg
  end
 end
end
Shoes.app :title => "Test" do 
 @el=edit_line
 button "print"do
  @interface.print(@el.text)
 end
 @interface=prompt({:top=>50, :left=>20, :width=>100})
end

我希望那就是你想要的。