用Racket做一个拼图游戏——30 拼图画布类

30 拼图画布类

拼图画布类(puzzle-canvas%)在之前做过简单介绍,也创建出基本框架,接下来对其进行扩展。

30.1 进一步规划拼图画布类

按之前描述的类设计的思路,分析一下拼图画布类要做的工作。

拼图程序的重头戏是给给用户的,所有之前完成的编程工作都是为了让用户能够简单地用一个鼠标,通过拖动图片单元格将图片复原。因此最重要的事情是处理鼠标事件。归纳一下,鼠标事件应该处理以下事情:

  • 鼠标在拼图上移动,每移动到一个单元格上或移出一个单元格,画布上应该有一个视觉提示;

  • 鼠标拖着一个单元格图片到另一个单元格,在过程中应该显示拖出的单元格内的图片没了,图片跟着鼠标拖着走;

  • 鼠标拖着单元格图片到了另一个单元格上放下,程序自动完成图片调换的状态。

  • 用户不断重复,直到拼图完成为止。

这里有两个问题:

  1. 拼图完成了,怎么结束呢?

    需要给类一个标志来指明拼图完成了,如果这个标志为#t,标识拼图完成,程序不再响应拖动单元格图片。

  2. 同样是鼠标划过图片,怎么区分是否处于拖动状态呢?

    同样设置一个标志来完成,如果这个标志为#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 (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值