这是我的程序
; constants
(define SCENE-WIDTH 200)
(define SCENE-HEIGHT 200)
(define BGR-COLOR "blue")
(define FLAT-ROCKBED (rectangle 100 10 "solid" "black"))
(define MTSCN (place-image FLAT-ROCKBED
(/ SCENE-WIDTH 2) SCENE-HEIGHT
(empty-scene SCENE-WIDTH SCENE-HEIGHT BGR-COLOR)))
[define UFO
[overlay [circle 10 "solid" "green"]
[rectangle 40 4 "solid" "green"]]]
(define X-POS (/ SCENE-WIDTH 2))
(define UFO-PADDING
(- SCENE-HEIGHT
(/ (image-height UFO) 2)
(image-height FLAT-ROCKBED)))
; functions
[define [ufo-landing height]
[cond
[[<= height UFO-PADDING]
(place-image UFO X-POS height MTSCN)]
[[> height UFO-PADDING]
(place-image UFO X-POS UFO-PADDING MTSCN)]]]
这是How to Design Programs, 2nd Edition的第一章。
当我在交互区域中调用(animate ufo-landing)
函数时,这是我得到的输出
不明飞行物不接触平板岩石。 我该怎么做呢?
修改1 :
将UFO
置于场景的纵坐标取决于两个因素。
FLATBED-ROCK
的高度,它必须落地,以便UFO
接触其表面。UFO
的中心;因为它的高度为20像素,所以它的位置在其中心坐标上方和下方10 px处。 UFO-PADDING
常数考虑了我上面描述的两个因素,用于将UFO
置于场景中。因此,我希望UFO在它几乎不接触FLATBED-ROCK
的表面时停止。但事实并非如此!还有其他因素会影响UFO
的纵坐标吗?我错过了什么?
答案 0 :(得分:1)
构造动画调用ufo-landing
,数字为0,1,2,...
您可以在交互窗口(repl)中尝试此表达式
看到最终的图像。
(ufo-landing 1000)
如果高度为1000,ufo-landing
使用此子句:
[[> height UFO-PADDING]
(place-image UFO X-POS UFO-PADDING MTSCN)]]]
y坐标为UFO-PADDING
。
要移动不明飞行物的结束位置,请调整UFO-PADDING
。
(define UFO-PADDING
(+ ?
(- SCENE-HEIGHT
(/ (image-height UFO) 2)
(image-height FLAT-ROCKBED))))
在标有问号的地方尝试不同的数字。
答案 1 :(得分:1)
我认为这个问题是因为当你这样做时:
(define UFO-PADDING
(- SCENE-HEIGHT
(/ (image-height UFO) 2)
(image-height FLAT-ROCKBED)))
你正在做的是说不明飞行物的中心的填充是高度 - (图像高度UFO / 2) - 图像高度FLAT-ROCKBED。我相信你也应该这样做:
(/ (image-height FLAT-ROCKBED) 2)
否则你会减去太多。