【问题标题】:Common Lisp mouse position with ltk带有 ltk 的 Common Lisp 鼠标位置
【发布时间】:2019-08-19 16:03:42
【问题描述】:

我正在 Common Lisp 中制作一个简单的小程序,我想使用鼠标移动来控制它。我使用 LTK 作为窗口。我找不到任何可以检索鼠标位置的函数。例如,Emacs Lisp 有 (mouse-pixel-position)。我找到了this on rosetta code,但没有 Common Lisp 条目。我能做什么?

【问题讨论】:

标签: common-lisp ltk


【解决方案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 参数(一个窗口)。

【讨论】:

    【解决方案2】:

    来自这个 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 的结构,因此我们可以使用(event-x event)event-mouse-button 等访问它的插槽。参见https://lispcookbook.github.io/cl-cookbook/data-structures.html#slot-access

    另外你可能想加入 freenode 上的 CL 社区,那里有一些游戏开发者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 2019-01-18
      相关资源
      最近更新 更多