2011-09-03 15 views
6

tôi đang học vợt (trước đây là PLT Scheme, một phương ngữ LISP) và cố gắng khám phá làm thế nào để xử lý các sự kiện khác nhau hơn paint-callback (có thể nó không phải là ngay cả một).vợt: sử dụng các sự kiện trong một cửa sổ khung%

Tôi hy vọng rất nhiều từ this part of the doc nhưng on-charon-event dường như không làm gì có thể làm tôi quan tâm (hoặc không có gì cả).

Ngoài ra, tôi không hiểu các không gian sự kiện, gọi lại hàng đợi và cách sử dụng của chúng. Một ví dụ sẽ là một điều tuyệt vời! Tôi sẽ biết ơn người đàn ông tốt đẹp sẽ viết cho tôi một cái :).

Dưới đây là mã của tôi:

(define game (new frame%)) 

(define gameLay (class canvas% (super-new))) 

(new gameLay 
    [parent game] 
    [paint-callback (λ (canvas dc) #|draw things|#)]) 

Tôi muốn sử dụng một cái gì đó như "on-chuột-nhấp chuột trái" (mà không tồn tại) cách tôi sử dụng "sơn-callback" nhưng tôi nghĩ rằng tôi cần phải thêm các bước (Tôi đã đọc về các sự kiện vv). Tôi biết nó không hoạt động nhưng đây là mã giả thuyết tôi đang tìm kiếm:

(new gameLay 
    [parent game] 
    [paint-callback (λ (canvas dc) #|draw things|#)] 
    [on-mouse-click-left (λ (canvas dc) #|do other things|#)]) 
+1

Tôi nghĩ rằng một ví dụ về những gì bạn muốn thực sự sẽ giúp hiển thị cách thực hiện. – Svante

+0

Đây là mã của tôi: '(xác định trò chơi (khung mới%)) (xác định gameLay (lớp vải% (siêu mới))) (gameLay mới [cha mẹ trò chơi] [sơn-callback (λ (canvas dc) ; vẽ mọi thứ )]})) ' Tôi muốn sử dụng một cái gì đó như" nhấp chuột trái-nhấp chuột "(không tồn tại) theo cách tôi sử dụng" gọi lại sơn " nhưng tôi nghĩ rằng tôi cần phải thêm các bước (tôi đã đọc về các sự kiện vv). – L01man

+0

Tôi đã đặt thông tin đó vào câu hỏi của bạn. Vui lòng sửa mã; có dấu ngoặc đơn không khớp và niềng răng ở cuối, vì vậy nó có thể không phải là những gì bạn dự định. Để làm cho ví dụ rõ ràng hơn, chỉ cần đặt giả thuyết 'on-mouse-click' vào ví dụ chỉ theo cách bạn muốn sử dụng nó. – Svante

Trả lời

10

Dưới đây là một chương trình nhỏ sử dụng bức tranh sơn dầu và các sự kiện bàn phím. Khi bạn đã nhấn phím mũi tên, canvas sẽ hiển thị phím cuối cùng bạn đã nhấn.

#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) 

Mọi khung hình đều có một không gian sự kiện quản lý việc gửi sự kiện. Phương thức on-char là một trình xử lý sự kiện; nó được chạy trong chuỗi xử lý sự kiện. Sẽ không có sự kiện nào khác được xử lý cho đến khi phương thức on-char của bạn kết thúc. Vì vậy, nếu bạn muốn làm một cái gì đó phức tạp, bạn có thể muốn tạo một thread riêng biệt và thực hiện tính toán ở đó. Một cách đơn giản để làm điều đó là tạo một không gian sự kiện khác, một không gian xử lý sự kiện cho bất kỳ khung nào, nhưng điều đó xử lý "sự kiện" bạn gửi nó bằng cách sử dụng queue-callback. Ví dụ, thay đổi định nghĩa của on-char trên với điều này:

(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))))))) 

Chức năng trao cho queue-callback được chạy trong một thread riêng biệt. Bạn có thể chèn một số bản in, sự chậm trễ, hoặc bất cứ điều gì để thuyết phục bản thân rằng không gian sự kiện chính vẫn có thể xử lý các sự kiện trong khi người kia xử lý cuộc gọi lại của bạn.

+0

Ooooh Tôi cảm ơn rất nhiều. Khi tôi [link] (http://docs.racket-lang.org/search/index.html?q=key&q=get-key-code&q=refresh) tìm kiếm "khóa" trong thanh tìm kiếm [/ link] tôi đã không không tìm thấy gì cả. Nhờ mã của bạn tôi sẽ có thể hoàn thành dự án nhỏ của tôi (hạnh phúc)! – L01man

+0

Nếu câu trả lời phù hợp với bạn, bạn nên nhấp vào "chấp nhận" để cho người khác biết rằng câu trả lời đó có hiệu quả. –

+0

Bạn nói đúng, tôi vừa tìm thấy nút này (dấu tick ở bên trái câu trả lời). Cảm ơn bạn Ryan, nó hoạt động hoàn hảo. Thực sự, thực sự, tuyệt vời! – L01man

Các vấn đề liên quan