我在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
可以是CommandLineInterface
或ShoesInterface
。 print
中的CommandLineInterface
方法只是一个puts语句。 print
中的ShoesInterface
方法应该告诉Shoes GUI显示该文本。我正在尝试尽可能多地重用我的代码。从理论上讲,无论如何某人正在玩游戏(在网络上,在命令行,通过GUI等),它应该使用大多数相同的逻辑。界面只显示消息并接收用户输入。他们只是以不同的方式做到这一点。
问题是我不知道如何将我的Shoes GUI连接到我现有的Ruby代码。有人在这里精通鞋子吗?这在鞋子中可能是不可能的...也许我将不得不使用不同的Ruby GUI,但我想在转到另一个之前我会问。
答案 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
我希望那就是你想要的。