为什么UFO不能碰到场景底部的平板岩?为什么以前会停止?

时间:2016-06-16 11:25:06

标签: racket

这是我的程序

; 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)函数时,这是我得到的输出enter image description here

不明飞行物不接触平板岩石。 我该怎么做呢?

修改1 : 将UFO置于场景的纵坐标取决于两个因素。

  1. FLATBED-ROCK的高度,它必须落地,以便UFO接触其表面。
  2. UFO的中心;因为它的高度为20像素,所以它的位置在其中心坐标上方和下方10 px处。
  3. UFO-PADDING常数考虑了我上面描述的两个因素,用于将UFO置于场景中。因此,我希望UFO在它几乎不接触FLATBED-ROCK的表面时停止。但事实并非如此!还有其他因素会影响UFO的纵坐标吗?我错过了什么?

2 个答案:

答案 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)

否则你会减去太多。