RACKET 回调程序通过按钮加载 canvas%%

RACKET Callback procedure to load canvas% via button%

我正在用 Racket 做一个游戏项目,我一直在思考如何为我的按钮创建一个回调过程,这样我就可以从我的开始菜单转到我的游戏了。我定义了这个按钮:

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

按钮 % 有一个回调参数(看这里 https://docs.racket-lang.org/gui/button_.html),但我不知道我应该如何定义我的程序,它将我从开始菜单(包含面板 % 和 fram %)带到我的游戏(基于 canvas)。

此外,游戏和开始菜单是在单独的文件 .rkt 文件中创建的

感谢所有能得到的帮助。如果我不清楚,请告诉我。

这是一个与您的描述相符的示例。 请注意,对框架的内容进行了更改 在 start-container-sequenceend-container-sequence 之间。 这样做是为了防止系统在渲染 GUI 之前 我们添加了游戏-canvas.

#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)