1

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

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

human_player.rb文件中:

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

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

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

4

1 回答 1

1

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

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

我希望那是你想要的。

于 2012-09-16T13:24:15.313 回答