我正在 AMD64 机器上使用 SBCL for Linux。
函数 ANIMTEST 用 CANVAS 小部件实例化一个 LTK 窗口。两个项目,BARRIER 和 FOLLOWER,存在于画布中。两者都连续旋转,BARRIER 位于画布中心,FOLLOWER 旨在跟随鼠标,但未按预期工作。我的第一次尝试(见评论)导致鼠标的绝对屏幕坐标被解释为画布内的相对坐标,而不考虑两者之间的偏移。在搜索 ltk.lisp 和文档后,我找到了 SCREEN-MOUSE-X/Y(第二次尝试,见评论)。根据文档,我觉得我正在使用 SCREEN-MOUSE-X & -Y,但为什么它不起作用?= 注意 = 包含 ANIMTEST 的文件和支持它的包可以正常加载和运行。我定义的函数(UCTK-BEAM 等)经过测试并且运行良好。
(defun animtest ()
"Test a spinning figure in LTK"
(with-ltk ()
(let* ((cnvs (make-instance 'canvas :width 400 :height 400))
(barrier (uctk-beam 200 200 40 20))
(follower (uctk-beam 0 40 40 20))
(slp-time 50) ; in ms
(bar-theta 0)
(fol-theta 0))
(labels ((update ()
(draw barrier nil)
(draw follower nil)
(incf bar-theta (/ pi 15))
(incf fol-theta (/ pi 15))
(geo:set-theta barrier bar-theta)
(geo:set-theta follower fol-theta)
(geo:set-center follower
;== FIRST ATTEMPT ==
(cons (screen-mouse-x cnvs)
(screen-mouse-y cnvs)))
; == SECOND ATTEMPT ==
;(cons (canvasx cnvs (screen-mouse-x cnvs))
; (canvasy cnvs (screen-mouse-y cnvs))))
(after slp-time #'update)))
(pack cnvs :fill :both :expand 1)
(update)))))
提前致谢!