2008-11-23 17 views
9

कुंजीपटल हैंडलिंग को लागू करने का एक अच्छा तरीका क्या है?प्रभावी कीबोर्ड इनपुट हैंडलिंग

for event in pygame.event.get(): 
    if event.type == KEYDOWN: 
     if False: pass   #make everything an elif 
     elif rotating: pass 
     elif event.key == K_q: 
     elif event.key == K_e: 
     elif event.key == K_LEFT: 
      curpiece.shift(-1, 0) 
      shadowpiece = curpiece.clone(); setupshadow(shadowpiece) 
     elif event.key == K_RIGHT: 
      curpiece.shift(1, 0) 
      shadowpiece = curpiece.clone(); setupshadow(shadowpiece) 

(छोटा): किसी भी भाषा, जहां मैं एक कीबोर्ड-सहभागी प्रोग्राम लिखने (जैसे एक tetris खेल के रूप में) में, मैं कुछ कोड है कि इस तरह दिखता है होने अंत। मुझे यह पसंद नहीं है, क्योंकि इसे मेरे मुख्य पाश में जाना है, और यह कार्यक्रम के सभी हिस्सों के साथ गड़बड़ है। इससे उपयोगकर्ता कॉन्फ़िगरेशन स्क्रीन भी असंभव हो जाती है जहां वे बदल सकते हैं कि कौन से महत्वपूर्ण मानचित्र क्रियाएं हैं। क्या फ़ंक्शन कॉलबैक के कुछ रूपों का उपयोग करके ऐसा करने के लिए कोई अच्छा पैटर्न है?

def handle_quit(): 
    quit() 

def handle_left(): 
    curpiece.shift(-1, 0) 
    shadowpiece = curpiece.clone(); setupshadow(shadowpiece) 

def handle_right(): 
    curpiece.shift(1, 0) 
    shadowpiece = curpiece.clone(); setupshadow(shadowpiece) 

def handle_pause(): 
    if not paused: 
     paused = True 

branch = { 
    K_q: handle_quit 
    K_e: handle_pause 
    K_LEFT: handle_left 
    K_RIGHT: handle_right 
} 

for event in pygame.event.get(): 
    if event.type == KEYDOWN: 
     branch[event.key]() 

फिर कुंजियां बदलने के शब्दकोश की कुंजी को संशोधित करने की बात है:

+0

यह भी देखें कि http://stackoverflow.com/questions/292095/polling-the-keyboard-in-python –

उत्तर

17

आप एक शब्दकोश जहां कुंजी इनपुट और मान रहे हैं बना सकते हैं एक समारोह है कि कुंजी दबाने संभालती है।

+0

मुझे यकीन नहीं है, लेकिन मुझे विश्वास है कि उन फ़ंक्शन डीफ़ को * शाखा के असाइनमेंट * से ऊपर जाना होगा, अन्यथा आपको सिर्फ नोन्स से भरा एक शब्दकोश मिलेगा। अच्छा जवाब हालांकि, शायद यह है कि मैं इसे कैसे करूँगा। – luqui

+0

मुझे लगता है कि इन्हें अभी भी मुख्य() लूप के अंदर परिभाषित किया जाना चाहिए - या शायद गेमस्टेट क्लास – Claudiu

+0

पर कुछ तर्क लें, व्यस्त शब्दकोश को बनाए रखना बेहतर हो सकता है: 'func2keys = {handle_quit: [K_q], handle_left: [ K_LEFT, K_a], ...} '। और अगर कॉन्फ़िगर किया गया है तो एक नया 'शाखा' शब्दकोश उत्पन्न करें। 'शाखा = dict ((के, एफ) f के लिए, key में kc के लिए func2keys.items() में कुंजियां) ' – jfs

3

superjoe30's answer के अलावा, आप (दो शब्दकोशों) मानचित्रण के दो स्तर

  • कुंजी => कमांड स्ट्रिंग
  • कमांड स्ट्रिंग => समारोह

मुझे लगता है कि यह होगा उपयोग कर सकते हैं उपयोगकर्ता द्वारा परिभाषित मैपिंग की अनुमति देना आसान है। यानी उपयोगकर्ता अपने कार्यों को "फ़ंक्शन का नाम" के बजाय "कमांड" पर मैप कर सकते हैं

+0

आप फ़ंक्शन के डॉकस्ट्रिंग से कमांड का नाम भी प्राप्त कर सकते हैं। –

+0

आप कार्यों के बजाय '__call__' विशेषता वाले ऑब्जेक्ट्स का उपयोग कर सकते हैं। – jfs

2

आजकल मैं क्या करता हूं कुछ प्रकार के इनपुट एकत्रण वर्ग/फ़ंक्शन/थ्रेड है जो पूर्वनिर्धारित कुंजी की एक सूची की जांच करेगा-> घटना बाइंडिंग्स।

कुछ इस तरह:

class InputHandler: 
    def __init__ (self, eventDispatcher): 
     self.keys = {} 
     self.eventDispatcher = eventDispatcher 
    def add_key_binding (self, key, event): 
     self.keys.update((key, event,)) 
    def gather_input (self): 
     for event in pygame.event.get(): 
      if event.type == KEYDOWN: 
       event = self.keys.get(event.key, None) 
       if not event is None: 
        self.eventDispatcher.dispatch(event) 

.... 
inputHandler = InputHandler(EventDispatcher) 
inputHandler.add_key_binding(K_q, "quit_event") 
... 
inputHandler.gather_input() 
.... 

यह मूल रूप से superjoe30 क्या कर रहा है, सिवाय इसके कि बजाय कॉलबैक सीधे बुलाने की है, मैं इतना है कि किसी भी कोड है कि के बारे में परवाह है, एक घटना भेजने प्रणाली का उपयोग करके जुदाई का एक और स्तर जोड़ने दबाए जाने वाले चाबियाँ बस उस घटना के लिए सुनो।

इसके अलावा, चाबियाँ आसानी से विभिन्न घटनाओं से बंधी जा सकती हैं, जिन्हें कॉन्फ़िगरेशन फ़ाइल या किसी चीज़ से पढ़ा जा सकता है और किसी भी कुंजी जो किसी ईवेंट से बंधी नहीं है, को केवल अनदेखा किया जाता है।

+0

'अगर घटना कोई नहीं है 'बेहतर दिखता है। – jfs

संबंधित मुद्दे