【发布时间】:2015-12-13 20:45:51
【问题描述】:
我正在 Racket 中创建一个带有 big bang 功能和四个结构的小游戏。我的结构如下:
(define-struct game_main (tank missile UFO))
(define-struct tank (x aim-x aim-y))
(define-struct missile (x y vel))
(define-struct UFO (x y))
(define a-game
(make-game_main
(make-tank 370 100 100)
(make-missile 500 500 1)
(make-UFO 100 100)))
在为大爆炸函数创建键事件处理程序时,我使用 a 将坦克的 x 位置向左移动,d 将其向右移动,就像这样。包含大爆炸功能以供参考:
(define (controls a-game a-key)
(cond
[(key=? a-key "a")
(struct-copy game_main a-game [tank (make-tank (- (tank-x (game_main-tank a-game)) 7)
(tank-aim-x (game_main-tank a-game))
(tank-aim-y (game_main-tank a-game)))])]
[(key=? a-key "d")
(struct-copy game_main a-game [tank (make-tank (+ (tank-x (game_main-tank a-game)) 7)
(tank-aim-x (game_main-tank a-game))
(tank-aim-y (game_main-tank a-game)))])]
)
)
(big-bang a-game (to-draw game_init) (on-key controls))
这很好用;但是,它很冗长。我想定义一个函数,例如“move-tank-left”,它只包含世界状态更改器,但在事件处理程序之外定义。但是,它不是直接编辑被 big-bang 操作的结构,而是返回到我全局设置的 a-game game_main 结构并恢复它开始时的 x 值。 如何引用当前的 big-bang 函数世界状态,以便您可以在 big-bang 函数之外建立函数来编辑临时状态?
这是有问题的函数:
(define move-tank-left
(make-tank
(- (tank-x (game_main-tank a-game)) 5)
(tank-aim-x (game_main-tank a-game))
(tank-aim-y (game_main-tank a-game))))
【问题讨论】: