Rebol / View: Как назначить изображения для уже созданного макета? - PullRequest
0 голосов
/ 02 ноября 2010

Используя Rebol / View 2.7.7, я пытаюсь создать карточную игру на основе учебника Ника Rebol: http://re -bol.com / rebol.html # section-10.18 . Однако я хочу прочитать карточки из двоичного файла, созданного Ником, отбросить некоторые данные и использовать его для разметки таблицы карточек, 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

Но это не показывает карты вообще. Я даже не уверен, что он читает правильно? Где проблема?

Ответы [ 3 ]

0 голосов
/ 02 ноября 2010

На самом деле вы не использовали функцию случайной карты в цикле for в конце ...: -)

foreach c lc [get c set-face get c random-card ]

Вы заметили, что не уверены в правильности загрузки данных ...

вот простой способ выяснить ... просто распечатать / проверить тип? из этих данных

dimg: load to-binary decompress (card)
probe type? dimg

В этом случае будет распечатано изображение! в консоли ... так что да ... это работает. : -)

В качестве дополнительной небольшой детали, я заметил, что вы не компенсировали случайное изображение "обратной стороны" в данных карты (которая находится в его конце), поэтому функцию случайной карты следует исправить следующим образом:

random-card: does [pick deck-cards random (length? deck-cards) - 1] ; - 1 since we don't want the back face to be picked.
0 голосов
/ 02 ноября 2010

, чтобы сделать заметку do-events понятной, я добавил небольшой ответ, чтобы добавить встроенный код ....

вот пример, где вы хотите, чтобы ваши do-события былиused.

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) Это также имеет более полезныеIde-эффект, показывающий, что ваше приложение завершает работу правильно, так как консоль ТАКЖЕ завершит работу, когда все ожидания завершены правильно.

В исходном примере, если вы добавите приведенный выше отпечаток, вы увидите, что консольникогда не закрывается, так что это означает, что приложение все еще работает без окон приложения, слушающих события.

3) Преимущество также заключается в том, что вы можете напрямую прекратить работу графического приложения, закрыв окно консоли.Это эффективно закрывает все окна и сразу же ждет и сокращает любой имеющийся у вас код «при выходе из приложения» (код после do-events).

0 голосов
/ 02 ноября 2010

Вам нужны 'do-events, только если цикл событий не запущен.

Просмотр / новый не запускает цикл событий .. но Просмотр делает

.актуальная проблема, хотя: (

...