球拍:使用大爆炸和点击

时间:2015-02-27 02:15:06

标签: scheme lisp racket

我能以某种方式在球拍(房子)中绘制一个小的基本图像。现在,我所坚持的是,使用大爆炸来绘制图像 - 然后能够点击房屋的屋顶并将其更改为另一种颜色。这就是我到目前为止所做的:

#lang racket
(require 2htdp/image)
(require 2htdp/universe)



(text "---Small Shack---" 18 "brown")

(define door (rectangle 30 50 "solid" "white"))

(define shack (above (triangle 100 "solid" "red")
                     (rectangle 120 80 "solid" "grey")))

(define doorhandle (overlay/align "right" "center" (circle 5 "solid" "blue") door))

(define house-view (overlay/align "center" "bottom" doorhandle shack))

house-view

我已尝试过一百万种不同的东西让它与big-bang一起使用,但没有任何效果。获得big-bang的任何帮助,点击时它会改变屋顶的颜色吗?

1 个答案:

答案 0 :(得分:3)

big-bang表单通过在处理程序中传递“状态”来工作,然后将其传递给to-draw处理程序以绘制将刷新到屏幕的图片。

对于初学者,您应该将绘图代码提升为big-bang的{​​{1}}条款:

to-draw

这将显示您的房子作为每次绘制调用的结果。您还需要一些方法来管理您的世界状态。传统方法是使用结构。

(big-bang 
 null
 (to-draw
  (λ (state)
    (text "---Small Shack---" 18 "brown")
    (define door (rectangle 30 50 "solid" "white"))
    (define shack (above (triangle 100 "solid" "red")
                         (rectangle 120 80 "solid" "grey")))
    (define doorhandle (overlay/align "right" "center" (circle 5 "solid" "blue") door))
    (define house-view (overlay/align "center" "bottom" doorhandle shack))
    house-view)))

您提供给(struct world (roof-color)) 的第一个参数是初始状态,因此我们应该初始化状态以使用big-bang作为屋顶颜色。然后我们可以在"red"处理程序中使用当前状态的颜色:

to-draw

最后,您可以实现(big-bang (world "red") (to-draw (λ (state) (text "---Small Shack---" 18 "brown") (define door (rectangle 30 50 "solid" "white")) (define shack (above (triangle 100 "solid" (world-roof-color state)) (rectangle 120 80 "solid" "grey"))) (define doorhandle (overlay/align "right" "center" (circle 5 "solid" "blue") door)) (define house-view (overlay/align "center" "bottom" doorhandle shack)) house-view))) 子句来处理鼠标点击。这是一个简单的实现,可以在用户点击时使屋顶变绿。

on-mouse

有关详细信息,请see the relevant documentation in the HtDP 2e section of the Racket documentation。你应该能够弄清楚如何根据你的需要调整它。