我能以某种方式在球拍(房子)中绘制一个小的基本图像。现在,我所坚持的是,使用大爆炸来绘制图像 - 然后能够点击房屋的屋顶并将其更改为另一种颜色。这就是我到目前为止所做的:
#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
的任何帮助,点击时它会改变屋顶的颜色吗?
答案 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。你应该能够弄清楚如何根据你的需要调整它。