2011-09-03 16 views
6

में उपयोग करते हुए घटनाओं मैं रैकेट सीख रहा हूँ (पूर्व PLT योजना, एक लिस्प बोली) और कैसे घटनाओं paint-callback की तुलना में अलग संभाल करने की खोज करने की कोशिश (शायद यह भी एक नहीं है)।रैकेट: एक फ्रेम% खिड़की

मुझे आशा है कि this part of the doc से बहुत कुछ है लेकिन on-char और on-event ऐसा कुछ भी नहीं है जो मुझे रूचि दे (या कुछ भी नहीं)।

प्लस, मैं घटनाओं, कतार-कॉलबैक और उनके उपयोगों को समझ नहीं पा रहा हूं। एक उदाहरण एक अच्छी बात होगी! मैं उस अच्छे आदमी का आभारी रहूंगा जो मुझे एक लिख देगा :)।

यहाँ मेरी कोड है:

(define game (new frame%)) 

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

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

मैं की तरह "पर माउस क्लिक में बाईं ओर" कुछ (जो मौजूद नहीं है) जिस तरह से मैं का उपयोग "रंग-कॉलबैक" उपयोग करना चाहते हैं, लेकिन मैं मुझे लगता है कि कदम जोड़ने की जरूरत है (मैंने ईवेंटस्पेस इत्यादि के बारे में पढ़ा है)। मैं यह काम नहीं करता है, लेकिन यहां काल्पनिक कोड मैं के लिए खोज कर रहा हूँ है:

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

मुझे लगता है कि आप जो करना चाहते हैं उसका एक उदाहरण वास्तव में यह दिखाने में मदद करेगा कि यह कैसे किया जाता है। – Svante

+0

यहाँ मेरी कोड है: '(खेल (नया फ्रेम%) को परिभाषित) (परिभाषित gameLay (वर्ग कैनवास% (सुपर नया))) (नई gameLay [मूल खेल] [रंग-कॉलबैक (λ (कैनवास डीसी) ; चीजें खींचें )]})) मैं "पेंट-कॉलबैक" का उपयोग करने के तरीके पर "ऑन-माउस-क्लिक-बाएं" (जो मौजूद नहीं है) जैसे कुछ का उपयोग करना चाहता हूं लेकिन मुझे लगता है कि मुझे कदम जोड़ने की जरूरत है (मैंने ईवेंटस्पेस इत्यादि के बारे में पढ़ा है)। – L01man

+0

मैंने उस जानकारी को आपके प्रश्न में रखा है। कृपया कोड को सही करें; अंत में बेमेल ब्रांड्स और ब्रेसिज़ हैं, इसलिए हो सकता है कि आप जो भी इरादा न करें। उदाहरण को स्पष्ट बनाने के लिए, बस उदाहरण के रूप में अपना काल्पनिक 'ऑन-माउस-क्लिक' डालें, जिस तरह से आप इसका उपयोग करना चाहते हैं। – Svante

उत्तर

10

यहाँ एक छोटे से कैनवस और कीबोर्ड की घटनाओं का उपयोग कर कार्यक्रम है। एक बार जब आप तीर कुंजी दबाएंगे, तो कैनवास आपके द्वारा दबाए गए अंतिम दिखाएगा।

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

प्रत्येक फ्रेम में एक ईवेंट स्पेस होता है जो ईवेंट प्रेषण का प्रबंधन करता है। 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))))))) 

समारोह queue-callback करने के लिए दिया एक अलग थ्रेड में चलाया जाता है। आप कुछ प्रिंटआउट, देरी, या जो कुछ भी खुद को मनाने के लिए सम्मिलित कर सकते हैं कि मुख्य ईवेंट स्पेस अभी भी ईवेंट को संसाधित कर सकता है जबकि दूसरा आपका कॉलबैक संभालता है।

+0

ओहोह मैं बहुत बहुत धन्यवाद देखता हूं। जब मैं [लिंक] (http://docs.racket-lang.org/search/index.html?q=key&q=get-key-code&q=refresh) खोज बार में "कुंजी" खोजा [/ link] मैंने नहीं किया कुछ भी नहीं मिला। आपके कोड के लिए धन्यवाद मैं अपनी छोटी परियोजना (खुश) को पूरा करने में सक्षम हो जाऊंगा! – L01man

+0

यदि कोई उत्तर आपके लिए काम करता है, तो आपको अन्य लोगों को इंगित करने के लिए "स्वीकार करें" पर क्लिक करना चाहिए। –

+0

आप सही हैं, मुझे अभी यह बटन मिला है (उत्तर के बाईं ओर टिक टिकटिंग)। धन्यवाद रयान, यह perfecly काम करता है। वास्तव में, वास्तव में, बढ़िया! – L01man