L01*_*man 8 events scheme racket
我正在学习Racket(以前的PLT Scheme,一种LISP方言)并试图发现如何处理不同的事件paint-callback(也许它甚至不是一个).
我希望有很多来自商务部的这一部分,但on-char并on-event似乎什么都不做,可以让我感兴趣(或者什么都没有).
另外,我不了解事件空间,队列回调及其用途.一个例子是一件很酷的事情!我会感谢能给我写一个的好男人:).
这是我的代码:
(define game (new frame%))
(define gameLay (class canvas% (super-new)))
(new gameLay
[parent game]
[paint-callback (? (canvas dc) #|draw things|#)])
Run Code Online (Sandbox Code Playgroud)
我想使用"on-mouse-click-left"(不存在)之类的东西,我使用"paint-callback",但我想我需要添加步骤(我已经读过有关事件空间等).我知道它不起作用,但这是我正在寻找的假设代码:
(new gameLay
[parent game]
[paint-callback (? (canvas dc) #|draw things|#)]
[on-mouse-click-left (? (canvas dc) #|do other things|#)])
Run Code Online (Sandbox Code Playgroud)
Rya*_*per 12
这是一个使用画布和键盘事件的小程序.按下箭头键后,画布会显示您按下的最后一个键.
#lang racket/gui
(define game-canvas%
(class canvas%
(inherit get-width get-height refresh)
;; direction : one of #f, 'left, 'right, 'up, 'down
(define direction #f)
(define/override (on-char ke)
(case (send ke get-key-code)
[(left right up down)
(set! direction (send ke get-key-code))
(refresh)]
[else (void)]))
(define/private (my-paint-callback self dc)
(let ([w (get-width)]
[h (get-height)])
(when direction
(let ([dir-text (format "going ~a" direction)])
(let-values ([(tw th _ta _td)
(send dc get-text-extent dir-text)])
(send dc draw-text
dir-text
(max 0 (/ (- w tw) 2))
(max 0 (/ (- h th) 2))))))))
(super-new (paint-callback (lambda (c dc) (my-paint-callback c dc))))))
(define game-frame (new frame% (label "game") (width 600) (height 400)))
(define game-canvas (new game-canvas% (parent game-frame)))
(send game-frame show #t)
Run Code Online (Sandbox Code Playgroud)
每个帧都有一个管理事件分派的事件空间.该on-char方法是一个事件处理程序; 它在事件空间处理程序线程中运行.在您的on-char方法完成之前,不会再处理任何事件.因此,如果您想要做一些复杂的事情,您可能想要创建一个单独的线程并在那里进行计算.一种简单的方法是创建另一个事件空间,一个不处理任何帧的事件,但处理您使用它发送它的"事件" queue-callback.例如,用以下内容替换on-char上面的定义:
(define aux-eventspace (make-eventspace))
(define/override (on-char ke)
(parameterize ((current-eventspace aux-eventspace))
(queue-callback
(lambda ()
(case (send ke get-key-code)
((left right up down)
(set! direction (send ke get-key-code))
(refresh))
(else (void)))))))
Run Code Online (Sandbox Code Playgroud)
赋予的函数queue-callback在单独的线程中运行.您可以插入一些打印输出,延迟或其他任何内容来说服自己,主事件空间仍然可以处理事件,而另一个处理您的回调.
| 归档时间: |
|
| 查看次数: |
2596 次 |
| 最近记录: |