我正在 Common Lisp 中制作一个简单的小程序,我想使用鼠标移动来控制它。我使用 LTK 作为窗口。我找不到任何可以检索鼠标位置的函数。例如,Emacs Lisp 有 (mouse-pixel-position)。我在 rosetta code 上找到了这个,但没有 Common Lisp 条目。我能做些什么?
问问题
218 次
2 回答
8
这个 SO 答案的提示:Mouse Position Python Tkinter
并查看 ltk 的文档:http ://www.peter-herth.de/ltk/ltkdoc/node16.html
我得到以下示例来检索鼠标移动触发的任何事件:
(ql:quickload "ltk")
(in-package :ltk-user)
(defun motion (event)
(format t "~a~&" event))
(with-ltk ()
(bind *tk* "<Motion>" #'motion))
这会打开一个小窗户,里面什么都没有。一旦你把鼠标放进去,你会得到很多事件:
#S(EVENT
:X 0
:Y 85
:KEYCODE ??
:CHAR ??
:WIDTH ??
:HEIGHT ??
:ROOT-X 700
:ROOT-Y 433
:MOUSE-BUTTON ??)
…
#S
表示我们处理一个名为 的结构,因此我们可以使用,等EVENT
访问它的插槽。请参阅https://lispcookbook.github.io/cl-cookbook/data-structures.html#slot-access(event-x event)
event-mouse-button
此外,您可能想加入 freenode 上的 CL 社区,那里有一些游戏开发者。
于 2019-03-28T19:21:38.100 回答
1
在大多数情况下,基于事件的方法可能更合适,但您也可以直接查询当前位置:
(defpackage :so (:use :cl :ltk))
(in-package :so)
(with-ltk ()
(loop
(print
(multiple-value-list
(screen-mouse)))
(sleep 0.5)))
这将启动一个图形顶层并每 500 毫秒打印一次当前屏幕坐标,直到您退出顶层窗口。该screen-mouse
函数接受一个可选w
参数(一个窗口)。
于 2019-03-29T11:01:13.420 回答