2016-04-29 4 views
1

Я делаю игровой проект в Racket, и я зациклился на том, как я могу создать процедуру обратного вызова для своей кнопки, чтобы я мог перейти из своего начального меню в свою игру. . у меня есть эта кнопка, определенный:RACKET Процедура обратного вызова для загрузки холста% через кнопку%

(define *starta-spelet* 
    (new button% 
     [parent *menyruta*] 
     [label "Starta Spelet"] 
     [min-width 130])) 

И есть аргумент обратного вызова для кнопки% (смотрите здесь https://docs.racket-lang.org/gui/button_.html), но я не знаю, как я должен определить свою процедуру, которая принимает меня из меню Пуск (который содержит панель% и fram%) к моей игре (которая построена на холсте).

Кроме того, игры и меню запуска создаются в отдельных файлах .rkt файлов

Я ценю помощь, которую я могу получить. Дай мне знать, если я что-то неясно.

ответ

1

Ниже приведен пример вашего описания. Обратите внимание, что изменения в содержании кадра сделаны между start-container-sequence и end-container-sequence. Это сделано, чтобы предотвратить визуализацию GUI перед , мы добавили игровой холст.

#lang racket 
(require racket/gui) 

;;; GUI 

;; The frame holds either a start-panel or a game-panel 
(define the-frame (new frame% [label "A frame"] [min-width 200] [min-height 200])) 

;; The start-panel contains a start button 
(define (make-start-panel) 
    (define start-panel (new panel% [parent the-frame])) 
    (define start-button (new button% [parent start-panel] [label "Start"] 
          [callback (λ (b e) (on-start-button b e))])) 
    start-panel) 

;; The game-panel contains a canvas 
(define (make-game-panel) 
    (define game-panel (new panel% [parent the-frame])) ; will be set to the-frame later 
    (define game-canvas (new canvas% [parent game-panel] [min-width 200] [min-height 200])) 
    game-panel) 

;;; Event Handlers 

(define (on-start-button button event) 
    (send the-frame begin-container-sequence) 
    (send the-frame delete-child the-start-panel) 
    (make-game-panel) 
    (send the-frame end-container-sequence)) 

;;; Begin Program 
(define the-start-panel (make-start-panel)) 
(send the-frame show #t) 
Смежные вопросы