我正在使用Racket制作一个程序,我需要能够实际绘制一些东西,并能够改变绘图以实现连接4的视觉效果。现在我能管理的最接近的是要么拥有它每次发生变化时都会创建一个新窗口。为了使代码不长得多,我将只使用一个例子。
(require racket/gui/base)
(require racket/draw)
(define frame (new frame%
[label "Connect 4 Visual Window"]
[width 800]
[height 600]))
canvas (new canvas% [parent frame]
[paint-callback
(lambda (canvas dc)
(send dc set-scale 3 3)
(send dc set-text-foreground "Black")
(send dc draw-text "Welcome to Connect 4!" 50 0)
(send dc draw-rectangle
30 30
200 145)
)])
(send frame show #t)
所以我想要这样做,然后我需要能够改变已经存在的东西,而不是删除那个画布,不关闭窗口并创建一个新窗口,更改它并刷新图像。我一直看到看起来像我可以做的那些功能,但是所有这些功能都要求我通过“dc”,我不知道我应该为此做些什么来获得它
答案 0 :(得分:2)
如果您想在Racket中编写一个简单的互动游戏,我建议您使用2htdp/universe
和2htdp/image
库。您为big-bang
表单提供一些高级事件处理程序(用于键盘和鼠标输入,以及时间传递)和将世界呈现为图像的功能。该库处理创建窗口和画布并将它们连接到事件处理程序。对于渲染功能,您可以使用bitmap
或rectangle
等运算符制作基本图像,而不是发出绘图命令,然后使用place-image
等运算符进行构图。
2htdp/universe
文档在示例上有点简短,因为它们主要位于教科书How to Design Programs, 2nd ed(可在线阅读)中。序言和第1部分将向您介绍big-bang
的示例。
如果你想以艰难的方式去做,你得到一个dc
参数,一个dc<%>
接口的实例,作为你的paint-callback函数的参数。要更新画布,请更改paint-callback函数可见的某些状态(例如,使用全局变量和set!
),然后调用画布的refresh
方法(继承自window<%>
) 。画布将清除然后使用您给它重绘的paint-callback函数。该函数应该根据它看到的新状态绘制不同的东西。尝试在paint-callback函数之外绘制画布可能是个坏主意。