Общая позиция мыши на Лиспе с помощью ltk - PullRequest
5 голосов
/ 28 марта 2019

Я делаю простой апплет в Common Lisp и хочу управлять им с помощью движения мыши.Я использую LTK для окна.Я не мог найти функцию, которая бы извлекала местоположение мышиНапример, Emacs Lisp имеет (mouse-pixel-position).Я нашел в розетте с кодом , но в Common Lisp нет записи.Что я могу сделать?

Ответы [ 2 ]

8 голосов
/ 28 марта 2019

Подсказки из этого SO ответа: Положение мыши 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

Также вы можете присоединиться к сообществу CL на freenode, там есть несколько разработчиков игр.

1 голос
/ 29 марта 2019

Подход, основанный на событиях, вероятно, будет более подходящим в большинстве случаев, но вы также можете напрямую запросить текущую позицию:

(defpackage :so (:use :cl :ltk))
(in-package :so)

(with-ltk ()
  (loop
    (print 
      (multiple-value-list
        (screen-mouse)))
    (sleep 0.5)))

Это запускает графический верхний уровень и печатает текущие координаты экрана каждые 500 мс, пока вы не закроете окно верхнего уровня. Функция screen-mouse принимает необязательный аргумент w (окно).

...