30 拼图画布类
拼图画布类(puzzle-canvas%)在之前做过简单介绍,也创建出基本框架,接下来对其进行扩展。
30.1 进一步规划拼图画布类
按之前描述的类设计的思路,分析一下拼图画布类要做的工作。
拼图程序的重头戏是给给用户的,所有之前完成的编程工作都是为了让用户能够简单地用一个鼠标,通过拖动图片单元格将图片复原。因此最重要的事情是处理鼠标事件。归纳一下,鼠标事件应该处理以下事情:
-
鼠标在拼图上移动,每移动到一个单元格上或移出一个单元格,画布上应该有一个视觉提示;
-
鼠标拖着一个单元格图片到另一个单元格,在过程中应该显示拖出的单元格内的图片没了,图片跟着鼠标拖着走;
-
鼠标拖着单元格图片到了另一个单元格上放下,程序自动完成图片调换的状态。
-
用户不断重复,直到拼图完成为止。
这里有两个问题:
-
拼图完成了,怎么结束呢?
需要给类一个标志来指明拼图完成了,如果这个标志为#t,标识拼图完成,程序不再响应拖动单元格图片。
-
同样是鼠标划过图片,怎么区分是否处于拖动状态呢?
同样设置一个标志来完成,如果这个标志为#t,标识在拖动图片。
根据以上分析,就可以基本确定拼图画布类的内容了:应该有2个字段值,把它们表示为dragging(表示拖动状态)和over(表示游戏结束)。把处理鼠标事件的3种行为整理成类方法,这些方法只给鼠标事件用,因此采用private类型。
30.2 字段
由上所述,定义类字段如下:
;类字段: (field (dragging #f);单元格拖动状态 (over #f));游戏结束标志
这里定义的字段放在(super-new)的前面或后面都是可以的。
30.3 方法
同样如上所述,定义鼠标事件处理方法如下:
;覆盖定义鼠标事件方法: (define/override (on-event event) ;如果游戏结束,不再处理鼠标事件: (unless over (let ([dc (