2016-06-16 1 views
1

Это моя программаПочему НЛО не касается плоской скалы внизу сцены? Почему это останавливается раньше?

; 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; его размещение занимает 10 пикселей выше и ниже его центральной координаты, так как его высота равна 20 px.

В UFO-PADDING постоянные счета для двух факторов, которые я описал выше, и используется для размещения UFO на сцене. Таким образом, я ожидаю, что НЛО остановится, когда он едва коснется поверхности FLATBED-ROCK. Но это не так! Есть ли другой фактор, который влияет на ординату UFO? Что мне не хватает?

ответ

1

Я считаю, что проблема в том, что когда вы делаете:

(define UFO-PADDING 
    (- SCENE-HEIGHT 
     (/ (image-height UFO) 2) 
     (image-height FLAT-ROCKBED))) 

Что вы делаете, говоря Обивка центра НЛО является ВЫСОТА - (изображение высота UFO/2) - высота изображения FLAT-ROCKBED. Я считаю, что вы также должны:

(/ (image-height FLAT-ROCKBED) 2) 

В противном случае вы слишком много вычитаете.

+0

Спасибо, у меня нет доступа к ПК прямо сейчас. Завтра я попробую ваш совет и сообщит. –

+0

Правильно. Это сработало. Благодаря! –

+1

Я выбрал ваш ответ как правильный, потому что он сработал. Однако я не понимал, почему это сработало. Но так как это работало против моих расчетов, я был уверен, что что-то я неправильно сформулировал. И я нашел это - при определении MTSCN я должен был компенсировать размещение FLAT-ROCKBED, но я этого не сделал. Это был главный виновник. Спасибо в любом случае! –

1

Конструкт одушевленные называет ufo-landing с номерами 0, 1, 2, ... Вы можете попробовать это выражение в окне взаимодействия (Отв), чтобы увидеть конечный файл.

(нло-посадочная 1000)

С высотой скажем 1000, ufo-landing использует этот пункт:

[[> height UFO-PADDING] 
(place-image UFO X-POS UFO-PADDING MTSCN)]]] 

Y-координата UFO-PADDING. Чтобы переместить конечное положение регулятора ufo UFO-PADDING.

(define UFO-PADDING 
    (+ ? 
    (- SCENE-HEIGHT 
     (/ (image-height UFO) 2) 
     (image-height FLAT-ROCKBED)))) 

Пробуйте разные цифры на месте, отмеченном знаком вопроса.

+0

Благодарим за ответ. Я не совсем понял, с чем именно я борюсь. Я отредактировал вопрос и добавил дополнительную информацию. Не могли бы вы увидеть его снова? –

Смежные вопросы