1

AMD64マシンでLinux用のSBCLを使用しています。
関数ANIMTESTは、CANVASウィジェットを使用してLTKウィンドウをインスタンス化します。BARRIERとFOLLOWERの2つのアイテムがキャンバスに存在します。両方とも連続的に回転し、BARRIERはキャンバスの中央にあり、FOLLOWERはマウスを追跡することを目的としており、意図したとおりに機能していません。私の最初の試み(コメントを参照)では、マウスの絶対画面座標が、2つの間のオフセットを考慮せずに、キャンバス内の相対座標として解釈されました。ltk.lispとdocsを検索した後、SCREEN-MOUSE-X / Yを見つけました(2回目の試行、コメントを参照)。ドキュメントによると、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)))))

前もって感謝します!

4

2 に答える 2

2

キャンバスウィジェットでマウスの位置を取得するために、画面マウス関数を呼び出すのではなく、モーションイベントとボタン押下イベントをバインドします。コールバックには、キャンバス座標であるスロットevent-xおよびevent-yを含むイベント構造が渡されます。この方法で正しい値を直接取得するだけでなく、マウスの位置をポーリングする必要がないため、より効率的です。変更されると自動的に更新を取得します。あなたの場合、マウス移動でバリアを更新するか、更新ループ内で読み取った変数にマウス座標を保存するかを選択できます。

于 2012-07-20T07:23:29.267 に答える
1

CANVASX / Y関数が意図したとおりに機能しないように見えますが、LTKはWINDOW-X / -Yを提供して、ウィジェットのXおよびY画面座標を返し、次のように記述して目的の効果を実現できます。

(cons (- (screen-mouse-x) (window-x cnvs))
      (- (screen-mouse-y) (window-y cnvs)))

これは、マウスカーソルがCNVSという名前のキャンバスウィジェットと同じ画面上にあることを前提としています。

于 2012-07-08T21:34:48.423 に答える