2.9 移植世界程序到宇宙
2.9.1 世界还不够
随着2009年6月的发布,我们开始弃用world教学包;取代其功能,我们推荐universe教学包。 随着2010年1月的发布,我们还推出了新的image教学包,为了支持这第二个教学包,我们将图像功能与世界程序的功能区分开。
世界形式 | 宇宙形式 | ||
|
在下一节中,我们先解释如何移植世界程序,以便他们使用universe教学包和旧的image教学包。 在之后一节中,我们给出更改程序的建议,以便它们不再依赖旧的图像函数,而是使用新图像函数。
为了区分不同的函数,我们在旧函数前统一添加前缀“htdp:”,在新函数前添加“2htdp:”。 当然,你的程序中不需要使用这些前缀。
2.9.2 世界程序的移植
(require htdp/world) ; Number -> Scene (define (create-UFO-scene height) (htdp:place-image UFO 50 height (htdp:empty-scene 100 100))) ; Scene (define UFO (htdp:overlay (htdp:circle 10 'solid 'red) (htdp:rectangle 40 4 'solid 'red))) ; ——运行程序 (htdp:big-bang 100 100 (/1 28) 0) (htdp:on-tick-event add1) (htdp:on-redraw create-UFO-scene)
第一行创建100乘100的场景,指定每秒28幅图像的速率,以及0为初始世界描述;
第二行说,对于每个时钟滴答,世界(数值)加1;
最后一行告诉drscheme,使用create-UFO-scene函数将当前世界呈现为场景。
世界形式 | 宇宙形式 | ||
|
世界形式 | 宇宙形式 | ||||||||||||
|
|
世界形式 | 宇宙形式 | ||||||||||||||
|
|
世界形式 | 宇宙形式 | |||||||
|
|
另一个重大变化涉及键盘和鼠标事件的处理。各个处理程序不再接受符号和字符,而只接受字符串。 world教学包的文档中的第一个键盘事件处理程序是:
世界形式 | 宇宙形式 | ||||||||||||||||||||||||||||
|
|
如果你用过动画gif录制程序的运行,现在仍可以这样做。 但做法不再是向big-bang添加第五个参数,而是添加形如(record? x)的子句。
最后,universe教学包实现了比world教学包更丰富的功能。
2.9.3 图像程序的移植
universe库还带来了新的图像库,2htdp/image。旧的图像库仍然可以协同2htdp/universe正常使用, 但新图像库提供了许多改进,包括更快的图像比较(特别适用于check-expect表达式)、图像旋转、图像缩放、曲线、新的多边形, 以及对线条绘制的更多控制。
要单独使用新图像库:
世界形式 | 宇宙形式 |
和universe教学包一起使用新图像库:
世界形式 | 宇宙形式 | ||
|
Overlay与Underlay
htdp:overlay函数将其第一个参数放在第二个(及后续)参数之下, 所以在2htdp/image中我们决定将其称为2htdp:underlay。
世界形式 | 宇宙形式 | ||||||||||
|
|
没有pinhole了
htdp/image中pinhole概念在2htdp/image 中没有对应物 (我们确实希望最终在2htdp/image中加入pinhole,但它们不会像在htdp/image中那样普遍)。
2htdp/image包含了一系列overlay操作, 它们不是对图像中的特殊位置叠加,而是根据其中心或边缘叠加图像。
由于pinhole的默认位置在大多数图像的中心,同时2htdp/image中overlay和underlay图像默认值基于大部分图像的中心, 因此简单的例子(如前所述)在两个库中表现相同。
但是,考虑这个表达式,它按左上角overlay两个图像,分别使用两个库编写。
世界形式 | 宇宙形式 | ||||||||||||||
|
|
在2htdp/image的版本中,程序使用2htdp:underlay/align指定对齐图像的位置,而不是使用pinhole。
边框位置的不同
和htdp/image相比,2htdp/image中边框的图形移动了一个像素。 这意味着下面两个矩形绘制出相同的像素集合。
世界形式 | 宇宙形式 | ||||
|
|
参见像素、画笔和线的细节。
Star变了
2htdp:star函数和htdp:star完全不同。两者都是以多边形为基础的星形, 但2htdp:star总是五角星。另请参见2htdp:star-polygon获得更一般的星形。