使用Rebol / View 2.7.7,我正在尝试基于Nick的Rebol教程创建一个卡片游戏:http://re-bol.com/rebol.html#section-10.18。我想要做的是读取Nick创建的二进制文件中的卡片,丢弃一些数据,然后用它来布局一个卡片组,4行3列,未使用2个中心卡位置。
这是我的代码:
protect-system
random/seed now
do %cards.r ;--include the binary card data
the-tableau: [
size 320x480 backdrop 0.170.0
style tabstyle image 80x100 teal
style holdplace box 80x100 coal
across
at 30x20 tc1: tabstyle
tc2: tabstyle
tc3: tabstyle return
at 30x130 tc4: tabstyle
tc100: holdplace
tc5: tabstyle return
at 30x240 tc6: tabstyle
tc200: holdplace
tc7: tabstyle return
at 30x350 tc8: tabstyle
tc9: tabstyle
tc10: tabstyle
]
lc: copy []
lc: [tc1 tc2 tc3 tc4 tc5 tc6 tc7 tc8 tc9 tc10]
deck-cards: copy [] ; The deck holds all of the cards from the binary file
deck-cards-num: copy []
deck-cards-color: copy []
lay: layout the-tableau
foreach [card label num color pos] cards [
dimg: load to-binary decompress (card)
append deck-cards dimg ;feel movestyle
throw-away-label: label
append deck-cards-num num
append deck-cards-color color
throw-away-pos: pos
]
random-card: does [pick deck-cards random length? deck-cards]
foreach c lc [set-face get c deck-cards]
view lay
do-events
但这根本不显示卡片。我甚至不确定它是否正确阅读?问题在哪里?
答案 0 :(得分:0)
如果事件循环未启动,您只需要'do-events。
View / new不会启动事件循环..但View会
我不是解决你的实际问题:(
答案 1 :(得分:0)
实际上你最后没有在for循环中使用随机卡功能......: - )
foreach c lc [get c set-face get c random-card ]
您注意到您不确定数据是否已正确加载...
这是一个简单的方法来找出...只需打印/探测TYPE?那个数据
dimg: load to-binary decompress (card)
probe type? dimg
在这种情况下,它会打印图像!在控制台......所以是的...那是有效的。 : - )
作为一个额外的细节,我注意到你没有随机补偿卡片数据中的“背面”图像(最后),因此随机卡功能应该像这样修复:< / p>
random-card: does [pick deck-cards random (length? deck-cards) - 1] ; - 1 since we don't want the back face to be picked.
答案 2 :(得分:0)
要使事件说明清楚,我在这里添加了一个小答案,所以我可以添加一些内联代码....
这是一个你希望使用你的事件的例子。
view/new lay ; display the interface right now. (with no cards)
random-card: does [pick deck-cards random (length? deck-cards) - 1] ; - 1 since we don't want the back face to be picked.
; deal cards with a half second delay.
foreach c lc [f: get c set-face get c random-card wait 0.5]
do-events
这里,在所有视图窗口关闭后,“DO-EVENTS”之后放置的任何代码都将被执行。
可以是tmp文件清理,退出时保存,“保存更改”对话框等。
附加说明:
在构建图形代码时,将它放在应用程序的最开始是一个好习惯:
print " "
它将打开控制台,然后任何视图窗口都会显示在它前面。
准备好分享时,只需注释该行并删除代码中的所有打印语句。
这对3件事很有用:
1)当你的应用程序在你的窗口打开后跟踪(打印/探测/等)某些东西时,它总是会弹出你的应用程序,这通常非常烦人。
2)如果您的应用程序正确退出,这也会产生更有用的副作用,因为当所有等待都正确终止时,控制台也会退出。
在原始示例中,如果添加上面的打印,那么您将看到控制台永远不会关闭,因此这意味着应用程序仍在运行,没有更多的应用程序窗口监听事件。
3)它还具有以下优点:您可以通过关闭控制台窗口直接终止图形应用程序。这样可以有效地关闭所有窗口并立即等待,并快捷键出您可能拥有的“应用程序退出”代码(事件后的代码)。